記事
· 2022年2月2日 6m read

Embedded Pythonを簡単にご紹介します

開発者の皆さん、こんにちは!

最近リリースされた 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で記述できるようになります。以下は、実行例です。

USER>w ##class(SimpleDemo).DateDiff("2022-2-2", "2022-12-31", "")
332

簡単ですね。(執筆時点で、今年はあと332日です。)

もう一つ例を挙げてみます。

ClassMethod SplitString(str As %String) [ Language = python ]
{
   return str.split(',')
}

 

USER>set list=##class(SimpleDemo).SplitString("one,two,three")
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()

で、アルコール度数に関する基本的な統計的数値が計算できます。

実行結果は、以下の通りです。

USER>d ##class(SimpleDemo).SimpleAnalyze()
   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についてのセッションをご提供します。是非ご登録をお願いします!(お申し込みはコチラ

最後までお読み頂きありがとうございました。質問などがありましたら、コメント頂けたら嬉しいです。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください