開発者の皆さん、こんにちは!
最近リリースされた InterSystems IRIS 2021.2 の目玉機能のひとつが Embedded Pythonです。Embedded Pythonは、PythonのランタイムをIRISに組み込むことによって、IRISのメソッドをPythonで記述したり、PythonのコードからIRISのクラスにアクセスしたりなどなど、IRISのObjectScriptとPythonとで相互に呼び出しを行なえる機能です。
しかも、Pythonのランタイムを埋め込んでいるため、ネットワークのオーバーヘッドがなく、パフォーマンスへの影響は最小限です。
IRISのプログラマの方には、Pythonの豊富なライブラリをストレスなく利用して頂けます。
Pythonのプログラマの方には、ObjectScriptを学ぶことなく、IRISの高速なデータベースやインターオペラビリティ機能などをストレスなく活用して頂けます。
今回の記事では、Embedded Pythonの機能をほんの一部だけ紹介します。
メソッドをPythonで書く
次のコードは、日付を表す文字列を2つ渡して、2つの日付の間の日数を返すメソッドです。
ClassMethod DateDiff(fromdate As %String, todate As %String, format As %String) As %Integer [ Language = python ]
{
import datetime
if format == '' :
format = '%Y-%m-%d'
f = datetime.datetime.strptime(fromdate, format)
t = datetime.datetime.strptime(todate, format)
return (t - f).days
}
重要なポイントは、メソッドの宣言部に [ Language = Python ] と指定することです。これだけで、IRISクラスのメソッドをPythonで記述できるようになります。以下は、実行例です。
332
簡単ですね。(執筆時点で、今年はあと332日です。)
もう一つ例を挙げてみます。
ClassMethod SplitString(str As %String) [ Language = python ]
{
return str.split(',')
}
USER>zwrite list
list=5@%SYS.Python ; ['one', 'two', 'three'] ; <OREF>
USER>w list."__getitem__"(1)
two
Pythonが得意な文字列<->リスト変換を使って、カンマ区切りの文字列をリストにして返す関数です。IRISのObjectScriptで、Pythonのリスト型を扱えるようになっていることに注意してください。(ただし、_ はObjectScriptでは文字列連結演算子ですので、""でくくる必要があります。)
データベースにアクセスして簡単にデータ分析
ObjectScriptプログラマの方は、これくらいはObjectScriptでもできると思われたのではないでしょうか。(その通りです!)ですので、少しPythonらしい例を挙げて今回は終わりにしたいと思います。
IRISデータベースに、Kaggleのワイン品質データセットをテーブルとして保存しておき、そのテーブルにselect文を発行します。
ClassMethod SimpleAnalyze() [ Language = python ]
{
import iris
df = iris.sql.exec('select * from kaggle.wineqt').dataframe()
# データフレームを表示
print(df)
# アルコール度数(alcoholフィールド)の統計的数値を表示
print(df['alcohol'].describe())
}
import irisで、IRISデータベースにアクセスするPythonモジュールをインポートし、iris.sql.exec()で、SQLを発行しています。結果に対しdataframe()を実行することで、Python (pandas)のデータフレームとして変数に格納します。SQLを発行する際、接続を行なっていません。最初に書いたように、PythonのコードはIRISのランタイムでそのまま実行されますので、簡単かつ高速にSQLアクセスが可能です。
df['alcohol'].describe()
で、アルコール度数に関する基本的な統計的数値が計算できます。
実行結果は、以下の通りです。
fixedacidity volatileacidity citricacid residualsugar chlorides ... ph sulphates alcohol quality id
0 7.4 0.700 0.00 1.9 0.076 ... 3.51 0.56 9.4 5.0 0
1 7.8 0.880 0.00 2.6 0.098 ... 3.20 0.68 9.8 5.0 1
2 7.8 0.760 0.04 2.3 0.092 ... 3.26 0.65 9.8 5.0 2
3 11.2 0.280 0.56 1.9 0.075 ... 3.16 0.58 9.8 6.0 3
4 7.4 0.700 0.00 1.9 0.076 ... 3.51 0.56 9.4 5.0 4
... ... ... ... ... ... ... ... ... ... ... ...
1138 6.3 0.510 0.13 2.3 0.076 ... 3.42 0.75 11.0 6.0 1592
1139 6.8 0.620 0.08 1.9 0.068 ... 3.42 0.82 9.5 6.0 1593
1140 6.2 0.600 0.08 2.0 0.090 ... 3.45 0.58 10.5 5.0 1594
1141 5.9 0.550 0.10 2.2 0.062 ... 3.52 0.76 11.2 6.0 1595
1142 5.9 0.645 0.12 2.0 0.075 ... 3.57 0.71 10.2 5.0 1597
[1143 rows x 13 columns]
count 1143.000000
mean 10.442111
std 1.082196
min 8.400000
25% 9.500000
50% 10.200000
75% 11.100000
max 14.900000
Name: alcohol, dtype: float64
大変簡単な例ですが、IRISに格納されたデータをPythonでデータ分析する入り口に立つことができました。
今回は、Embedded Pythonを簡単にご紹介しましたが、まだまだ紹介しきれない機能がたくさんあります。これから、開発者コミュニティに続きを投稿する予定ですので、どうか楽しみにしていてください。
また、3月に開催される InterSystems Japan Virtual Summit 2022で、Embedded Pythonについてのセッションをご提供します。是非ご登録をお願いします!(お申し込みはコチラ)
最後までお読み頂きありがとうございました。質問などがありましたら、コメント頂けたら嬉しいです。