ExcelとPython(とR)を連携させる – ExcelPython編

概要

  • ExcelPythonを使うとエクセルのビルドイン関数のようにpythonの関数を呼び出すことができる
  • 当然numpyにも対応。ただしpythonのクラスには対応していない(?)
  • VBAを1行も書く必要がない。xlwingsではVBAに、呼び出したいpython関数を書かなければならなかった。
  • VBAを駆逐可能という代物

ExcelPythonのインストール

まずは下記サイトダウンロードし、インストールします。今回はv2.0.8を使用しています。

ExcelPython – Write Excel UDFs in Python!
http://ericremoreynolds.github.io/excelpython/

その後エクセルを起動させるとExcelPythonのリボンが追加されています。
150516_1

Pythonコード

ここでは前回の記事で使用した関数を流用します。
ポイントとしてはハイライトしていますが、xlpythonをロードするのと、エクセルから呼び出し可能にしたい関数の前に@xlfuncを書くことです。
あとはこれを使用したいエクセルシートと同階層に保存します。

簡単に説明するとgetDataFromQuandlは指定したティッカーのデータをQuandl経由でロードします。
garchはGARCH(1,1)のボラティリティを返します。

Excelでpythonコードをリンクさせる

といってもそこまで難しいことはなく

150516_2

  1. エクセルシートをマクロ使用可な形式(xlsm)で保存する。その際に先ほど保存した.pyファイルと同じ名前にする必要があります。
  2. ExcelPythonリボンにある「Setup ExcelPython」をクリック
  3. 「Import Python UDFs」をクリック

通常何も手を加えていないエクセルの場合以下の様なエラーが出ると思います。

150516_3

その際は
「Excelのオプション」→「セキュリティセンター」→「セキュリティセンターの設定」→「マクロの設定」→「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」のチェックをオンにします。

「Import Python UDFs」のクリックが完了すると、先ほど@xlfuncを指定した関数がエクセルから呼び出すことが可能です。

ExcelPythonを使ってみる

まずはaddNumを使ってみましょう。関数を使用しようとするとちゃんとサジェストにも表示されるようになります。
150516_4

Ctrl+Shift+Aの引数表示も対応しています。
150516_5

ということでめでたく計算することが出来ました。
150516_6

ExcelPythonを使ってみる – 返り値が行列編

どうやらExcelPythonはPandasのDataFrameには対応していないので行列に変換する必要があります。
その変換はto_records()で行っています。こうすることでPandasのindexも含めて返すことが可能になります。

先ほど定義したgetDataFromQuandlを使うと以下。1列目の日付は見やすいようにエクセル上でフォーマットを変更しています。

150516_7

ExcelPythonを使ってみる – インプットが行列編

エクセルからの入力が行列の場合、@xlargを使ってその引数のサイズを指定する必要があります。

縦ベクトルで返したいのでPython上で返すときにサイズを変換しています。

150516_8

ということでGARCHボラティリティの計算もすることができました。

感想

xlwingsとの比較という点ですと、
長所

  • マクロを書かなくて良い
  • ビルドイン関数のように呼び出すことができる

短所

  • Pandasに対応していない
  • 行列を返す場合の処理が面倒(予めエクセル上の範囲を指定する必要がある)

という感じでしょうか。

参考

ExcelPython – Write Excel UDFs in Python!
http://ericremoreynolds.github.io/excelpython/

excelpython/docs at master · ericremoreynolds/excelpython · GitHub
https://github.com/ericremoreynolds/excelpython/tree/master/docs