1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クロストン法で間歇需要を予測する拡張の変換ノードをBobに作らせる(SPSS Modeler データ加工逆引き4-35)

1
Posted at

クロストン法で間歇需要を予測する拡張の変換ノードをBobに作らせる

スクリーンショット 2026-07-29 18.26.11.png

1.想定される利用目的

・間歇(間欠)需要を推定する際にクロストン法を利用する

2.サンプルストリームとデータのダウンロード

ストリーム

3.サンプルストリームの説明

スクリーンショット 2026-07-29 18.26.39.png

a.入力するデータは以下の通りです。

スクリーンショット 2026-07-29 18.27.35.png

b.[拡張の変換]ノードを編集します。このPythonスクリプトをどのようにBobに書かせたかは後述します。

スクリーンショット 2026-07-29 18.27.54.png

[テーブル]を実行します。

スクリーンショット 2026-07-29 18.28.13.png

Bobによるスクリプトの作成手順

1.Bobを起動して、作業フォルダを指定します。

スクリーンショット 2026-03-31 11.13.04.png

2.SPSS Modeler[拡張のエクスポート]ノードからサンプル構文をコピーします。

スクリーンショット 2026-07-29 18.39.59.png

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.プロンプトを実行します。

スクリーンショット 2026-07-29 18.45.37.png

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 逆引きストリーム集(データ加工)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?