クロストン法で間歇需要を予測する拡張の変換ノードをBobに作らせる
1.想定される利用目的
・間歇(間欠)需要を推定する際にクロストン法を利用する
2.サンプルストリームとデータのダウンロード
ストリーム
3.サンプルストリームの説明
a.入力するデータは以下の通りです。
b.[拡張の変換]ノードを編集します。このPythonスクリプトをどのようにBobに書かせたかは後述します。
[テーブル]を実行します。
Bobによるスクリプトの作成手順
1.Bobを起動して、作業フォルダを指定します。
2.SPSS Modeler[拡張のエクスポート]ノードからサンプル構文をコピーします。
3.プロンプトを作成します。サンプル構文をペーストします。
プロンプト
6つの期間の値を受け取ると最後期間の欠損をクロストン法で補完する
SPSS Modelerの拡張の変換ノードのネイティブPython APIスクリプトを書いてください。
前方からはユーザー入力ノードで
month value
2025-04 4.00
2025-05 0.00
2025-06 1.00
2025-07 3.00
2025-08 2.00
2025-09 1.00
2025-10
このようなデータがやってきます。
- 拡張の変換ノードのスクリプトの解説として
@https://www.ibm.com/docs/ja/spss-modeler/18.6.0?topic=spark-native-python-apis を参考にしてください。
- シバンは不要です。
シンタックスは以下のサンプルを参考にしてください
###Use this code to transfer data between Modeler and Python
#import modelerpy
#if modelerpy.isComputeDataModelOnly():
# modelerDataModel = modelerpy.getDataModel()
# outputDataModel = None
### compute your output data model
# modelerpy.setOutputDataModel(outputDataModel)
#else:
# modelerData = modelerpy.readPandasDataframe()
# outputData = None
### compute your output data
# modelerpy.writePandasDataframe(outputData)
4.プロンプトを実行します。
5.Bobの以下の出力を[拡張の変換]にそのまま利用します。
Pythonスクリプト
import modelerpy
import numpy as np
def croston_fit(demand: np.ndarray, alpha: float = 0.1) -> dict:
d = demand.astype(float)
positive_idx = np.where(d > 0)[0]
if len(positive_idx) == 0:
return {"q": 0.0, "p": 1.0}
first = positive_idx[0]
q = float(d[first])
p = 1.0
prev = first
for t in range(first + 1, len(d)):
if d[t] > 0:
interval = t - prev
q = alpha * d[t] + (1 - alpha) * q
p = alpha * interval + (1 - alpha) * p
prev = t
return {"q": q, "p": p}
if modelerpy.isComputeDataModelOnly():
modelerDataModel = modelerpy.getDataModel()
modelerpy.setOutputDataModel(modelerDataModel)
else:
import pandas as pd
modelerData = modelerpy.readPandasDataframe()
train = modelerData.iloc[:-1].copy()
demand_series = train["value"].values.astype(float)
params = croston_fit(demand_series, alpha=0.1)
forecast = params["q"] / params["p"] if params["p"] != 0 else 0.0
values = modelerData["value"].astype(float).tolist()
values[-1] = forecast
outputData = pd.DataFrame({
"month": modelerData["month"].tolist(),
"value": values,
})
modelerpy.writePandasDataframe(outputData)
注意事項
需要予測では同じ構造で商品の数だけ繰り返し長いレコードになります。その場合には
プロンプトでキーとなるフィールドを伝えて同時に処理できるようなスクリプトを作成させます。
またクロストン法は訓練の区間を持つことで予測値が変わりますので注意します。
4.参考情報
店舗の数だけファイルを分割するpython拡張ノードをBobに作らせる
SPSS Modeler ノードリファレンス目次
SPSS Modeler 逆引きストリーム集(データ加工)







