SPSS Modeler BatchでPythonスクリプトに引数を渡す方法


SPSS Modeler BatchでPythonスクリプトに引数を渡す方法

本記事の内容はSPSS Modeler 18.2.1で動作確認しています。バージョンが異なっても基本的には動作すると思いますが、念のため実機でも動作確認を行って下さい。

SPSS Modeler Batchとは?

 SPSS Modelerで作成したストリームをで定期的な処理を行う場合、CaDSを利用するのがよいですが、そこまで細やかな管理が必要でなかったり、規模が大きくない場合は、SPSS Modeler Batchもよくつかわれます。
 SPSS Modeler Batchはコマンドからの実行でSPSS Modeler Serverに接続しストリームを実行します。SPSS Modeler ClientのようなGUIは立ち上がりません。基本はストリームに配置されたターミナルノードをすべて実行します。SQLプッシュバックやストリームに設定したキャッシュなども有効に機能します。
 使い方の例として、ある業務の売り上げ予測を毎日実施するとか、その予測モデルを毎週更新するといったような処理があった場合、その処理を行うストリームを作成し、SPSS Modeler Batchのバッチコマンド(clemb)を、ほかのスケジューラー(UNIX系ならCRONなど)から指定した時刻に実行すれば実現できます。

コマンド例
clemb -stream "/XXX/.../XXX.str" -execute -server -hostname XXX -username XXX -password XXX -Pmth=Jan

 SPSS Modeler Batch実行時に -P オプションで引数をストリームに渡すことができます。
 次のマニュアルにもあるように、例えば条件抽出ノードに Month = '\$P-mth' と記述しておき、モデラーバッチでの実行時に、-Pmth=Jan という引数をつけて実行すると、mth=Jan がストリームに引き継がれます。Month = '\$P-mth' は Month = 'Jan' となり、これにより、Month = 'Jan' に該当するデータのみを抽出することができます。バッチ実行において-Pmth= に続く文字列を変更することで、 Month = 'Feb' など異なる条件でデータを抽出することも可能です。

"バッチ・モードでのパラメーターの使用"
(マニュアル上は等式が == となっていますが、= と同等です。)

 この方法を使って、1つのストリームに引数として支店名を与えて実行すれば、支店ごとに売り上げ予測やモデル更新もできるようになります。

Pythonスクリプトへの引数取り込み

 SPSS Modeler Batchは前述したように指定したストリームにあるターミナルノードはすべて実行してしまいますが、特定のターミナルノードだけ実行したい場合や、ターミナルノードを実行する順番を指定したい、モデルを更新したいといった場合、付随するPythonスクリプトで制御します。
 上記のマニュアルリンクで示した方法は、引数をストリームのノード内に設定したCLEM式に取り込んでいましたが、ストリームに付随するPythonスクリプトに引数を取り込む方法についても紹介したいと思います。
 例えば、支店名をBranchというオプションで渡す場合、下記のように、-PBranch= で設定します。

コマンド記入例
clemb -stream ...(中略)... -PBranch=GINZA

 Pythonスクリプトに取り込むには、session()またはstream()インスタンスの、 getParameterValue()メソッドを使います。stream()は対象のストリームに対して、session()は開いているすべてのストリームに対して有効といった違いがありますが、Modeler Batchで取得したパラメータは、session()とstream()どちらからでも取得できます。
 session()およびstream()について、Pythonスクリプトにはそれぞれ次の例のように記載します。

session()の場合
session = modeler.script.session()
Branch_Name = session.getParameters().getParameterValue('Branch')
stream()の場合
stream = modeler.script.stream()
Branch_Name = stream.getParameterValue('Branch')

 これでバッチを実行すれば、先ほどの例であればBranch_Name変数に’GINZA’が代入されます。あとは、Pythonスクリプト内でノードのCLEM式に代入するなど自由に扱えます。
 変数は文字列として取り込まれますので、数字として扱いたい場合はint()などの型変換が必要です。

 パラメータからPythonスクリプトへの取り込みについて、下記マニュアルにも記載があります。(少しわかりにくいです。)

"ストリーム、セッション、およびスーパーノード・パラメーター"