"Python in Excel"について初見時の感想

## はじめに

8/23未明(日本時間)、下記のアナウンスがありました。

https://techcommunity.microsoft.com/t5/excel-blog/announcing-python-in-excel-combining-the-power-of-python-and-the/ba-p/3893439

「ExcelにPythonが導入」という、 ~~これまで何回か見たような気がしなくもない~~[^1] 大ニュースが飛び込んできました。

これはPythonの生みの親であり、現在はMicrosoftのDistinguished EngineerであるGuido van Rossumが直々に紹介していました。

https://twitter.com/gvanrossum/status/1694031794306458056?s=46

日本語でも様々なメディアがニュースにしています。

https://forest.watch.impress.co.jp/docs/news/1525532.html

https://news.mynavi.jp/article/20230823-2754615/

https://www.itmedia.co.jp/news/articles/2308/23/news089.html

上記記事を読んで、初見時に思ったことをメモしておきます。
**後で私の誤解、はやとちりで間違いだとわかるかもしれないのでその点はご了承下さい。**

## 技術的にどのような実装をしているのか

> Starting today, Python in Excel will also be natively integrated directly into the Excel grid. To get started simply use the new PY function which allows you to input Python code directly into Excel cells.

:::note info

今日から、Python in ExcelもExcelグリッドに直接ネイティブに統合されます。PythonのコードをExcelのセルに直接入力できる新しいPY関数を使うだけです。

:::

> Python in Excel leverages Anaconda Distribution for Python running in Azure, which includes the most popular Python libraries (e.g. pandas, Matplotlib, scikit-learn, etc.), and is securely built, tested, and supported by Anaconda. Python provided by Anaconda supports a wide array of analytics with Python in Excel.

:::note info

Python in Excelは、Anaconda Distributionを活用してAzure上でPythonを実行します。これは、最も一般的な Pythonライブラリ(`pandas`、`Matplotlib`、`scikit-learn`など）を含み、Anacondaによって安全にビルド、テスト、サポートされます。Anacondaが提供するPythonは、ExcelでPythonを使った幅広い分析をサポートします。

:::

> Python code used by Excel runs on the Microsoft Cloud with enterprise-level security as a compliant Microsoft 365 connected experience. The Python code runs in its own hypervisor isolated container using Azure Container Instances and secure, source-built packages from Anaconda through a secure software supply chain. Python in Excel keeps your data private by preventing the Python code from knowing who you are, and opening workbooks from the internet in further isolation within their own separate containers. Data from your workbooks can only be sent via the built-in **xl()** Python function, and the output of the Python code can only be returned as the result of the =**PY()** Excel function.

:::note info

Excelで使用されるPythonコードは、Microsoft 365に準拠した接続エクスペリエンスとして、エンタープライズレベルのセキュリティで Microsoft クラウド上で実行されます。Pythonコードは、Azure Container Instancesと、安全なソフトウェアサプライチェーンを通じてAnacondaから提供される安全なソースビルドパッケージを使用して、独自のハイパーバイザーで隔離されたコンテナ内で実行されます。Python in Excelは、Pythonコードがあなたが誰であるかを知ることを防ぎ、独自の独立したコンテナ内でさらに分離された状態でインターネットからワークブックを開くことで、あなたのデータをプライベートに保ちます。ワークブックからのデータは組み込みのxl()Python関数を介してのみ送信することができ、Python コードの出力は =PY()Excel 関数の結果としてのみ返すことができます。

:::

また、記事内のスクリーンショットにある数式の定義をみると

> ```
> # Announcing Python in Excel!
> DataFrame=xl("A1:B10", header=True)
> DataFrame.groupby('Category').agg('mean')
> ```

> ```
> # Pair plot with seaborn ...
> g=sns.PairGrid(SalesData,diag_sharey=True, hue="Category", palette="viridis")
> ...
> g.map_diag(sns.histplot,hue=None, color=".9")
> ...
> ```

となっていて、importパートがありません。

なので、

- `PY`数式内で書かれたPythonコードがMicrosoft Cloud上のAnacondaで実行され、その結果がセルに返される
- `None`のような予約語・組み込み型(関数)だけでなく、`sns`などのエイリアスとして`seaborn`などのライブラリが名前空間上に存在している
- よって、Anacondaにある全てのライブラリが使えるわけではなく、`PY`関数内でそれと評価される名前のライブラリしか使えなさそう

ということらしいのがわかりました。

また、紹介された例から、取得した`DataFrame`を任意のセルに展開するような、スピルのように他のセルに影響を及ぼすものは使えなさそうです。

## 誰に対してメリットがありそうなのか

### COMやバイナリを操作して、Excel操作を自動化している人 -> ?
- こんなライブラリを使っている人たちが対象
  - [`openpyxl`](https://foss.heptapod.net/openpyxl/openpyxl)
  - [`xlwt`](https://github.com/python-excel/xlwt)
  - [`xlwings`](https://github.com/xlwings/xlwings)
  - [`comtypes`](https://github.com/enthought/comtypes)
  - [`pywin32`](https://github.com/mhammond/pywin32)
- 上述のように、`PY`関数を書いている以外の他のセルに影響を及ぼすことはできなさそうなので、「外部から与えられた情報に基づいた条件分岐によってあのセルとこのセルに書き込む」といったことはできないでしょう。
- 一方で、「数式の組み合わせで出来ないことはないが、条件が複雑すぎてメンテナンスや機能把握が困難になるため、Pythonコードの実行結果を単一セルに書き込むやり方をせざるを得なかった」ような場合は、Excelファイルの数式に寄せることができるので役に立つでしょう。

### 分析対象の元データとして、Excelファイルを読み込んでいる人 -> 〇
- こんなライブラリを使っている人たちが対象
  - [`pandas`](https://github.com/pandas-dev/pandas)
  - [`numpy`](https://github.com/numpy/numpy)
  - [`Matplotlib`](https://matplotlib.org/)
  - [`seaborn`](https://seaborn.pydata.org/)
  - [`statsmodels`](https://www.statsmodels.org/stable/index.html)
  - [`scikit-learn`](https://scikit-learn.org/stable/index.html)
- これらの行列演算、プロット、機械学習のためのツールを使った結果をインスタントにセルに出すことができれば、非常に効率的に作業を行うことができるでしょう。
- また、`xl`関数によってMS公式でセルデータを解釈した`DataFrame`が返るようになるので、これまでサードパーティ頼りだったセルデータ型の解釈やキャスト、フォーマットを「公式寄せ」できるようになることは大きいと考えています。

## まとめ
総じて、「自動化については微妙」「分析については役立つ」という考えを今のところ持っています。

今後、広まっていくうちにユースケースが研究されていくと考えています。

私もリソースがあれば、研究してみたいと思います。

[^1]: このあたりのことを思い出しました
https://qiita.com/yniji/items/f2a528a8cc3f05b5b844
https://qiita.com/yniji/items/2e80ace081c4b59bc327
https://qiita.com/yniji/items/b38bc312e860027108ac