SPSS Modeler18.5の新機能の ネイティブ Python APIのテストをしてみました。これは、「拡張ノード」のなかでpandasを使ってModelerのデータを読んだり書いたりすることができる機能です。
この記事ではネイティブ Python APIで「拡張の変換」が、どのように利用可能かをテストしてみました。
マニュアルにサンプル・ストリームがついていましたので、これを修正してテストしてみています。
サンプルストリームは以下です。
- テスト環境
- Windows 11 64bit
- Modeler 18.5
- Python 3.10.7
拡張の変換
データの置換
「Python」を選択し、「Python Syntax」の欄に以下のスクリプトを記入します。
#データの置換
###Use this code to transfer data between Modeler and Python
# ネイティブ Python APIのパッケージ
import modelerpy
#データモデルの参照時
if modelerpy.isComputeDataModelOnly():
modelerDataModel = modelerpy.getDataModel()
outputDataModel = None
#Compute output data model here
#出力データモデルの設定
outputDataModel = modelerDataModel
modelerpy.setOutputDataModel(outputDataModel)
#データ出力時
else:
#前のノードからデータの読み込み
modelerData = modelerpy.readPandasDataframe()
outputData = modelerData
#Compute output data here
#Ageに100を加算
outputData['Age']=outputData['Age']+100
#データの出力
modelerpy.writePandasDataframe(outputData)
処理の分岐
「データモデルの処理」と「データ自体の処理」の分岐を以下のif文で行っています。
if modelerpy.isComputeDataModelOnly()
modelerpy.isComputeDataModelOnly():のif文は、後続のノードがデータモデルを参照する場合に実データを用意しなくていいための分岐になります。Modelerは、後続のノードを接続した際に前のノードのデータモデルを参照します。例えば「フィルター」ノードを接続した場合にはデータは必要ありませんが、「列名」の情報は必要になります。このif文をなくしても動作はしますが、列名などのデータモデルを参照したいだけなのにデータの読み込みが行われてしまうため、無駄な処理が動いてしまいます。
なお、このif文は、「拡張の変換」ノードと「拡張モデル」ノードといった後続ノードが必要なノードでも、同様に使われます。
データモデルの処理
以下のmodelerpy.getDataModel()で前のノードから「フィールド名」、「データ型」、「尺度」などのデータモデルを取得しています。
modelerDataModel = modelerpy.getDataModel()
以下のmodelerpy.setOutputDataModel(outputDataModel)で後続ノードに渡すデータモデルを設定しています。
modelerpy.setOutputDataModel(outputDataModel)
ここでの処理は既存データの置換なので、前のノードのデータモデルをそのままコピーしています。列が追加されたり、内容が変更される場合は「拡張のインポート」でやったような列の定義が必要です。
データの処理
modelerpy.readPandasDataframe()で前ノードからのデータを読み込んでいます。
outputData['Age']=outputData['Age']+100でAgeに100を足しています。通常のpandasの処理です。
modelerpy.writePandasDataframe(outputData)で後続のノードにデータを出力しています。
modelerData = modelerpy.readPandasDataframe()
outputData = modelerData
#Compute output data here
#Ageに100を加算
outputData['Age']=outputData['Age']+100
#データの出力
modelerpy.writePandasDataframe(outputData)
結果
参考
SPSS Modeler18.5の新機能の ネイティブ Python API #SPSS - Qiita
ネイティブ Python拡張のインポートノード:CSVファイルの読み込み
ネイティブ Python拡張の変換ノード:置き換え
ネイティブ Python拡張モデルノード:モデル作成OneClassSVM
ネイティブ Python拡張の出力ノード:データとペアプロット図(散布図行列)の表示
ネイティブ Python拡張のエクスポートノード:CSVファイルの出力
ネイティブpythonの拡張ノードでつかうpyhtonパッケージを導入する