フォルダ内の全てのファイルをIDでmergeする拡張ノードをBobに作らせる
*SPSSを介さずBobにファイル作成を指示できますが後続のプロセスを含めたストリームによる反復利用を想定しています。
1.想定される利用目的
・フォルダに存在する分割したキャンペーン情報を顧客IDでマージする
2.サンプルストリームとデータのダウンロード
ストリームとデータ
3.サンプルストリームの説明
a.入力するデータは以下の通りです。
b.[レコード結合]ノードを編集します。
[テーブル]表示します。データが列方向に結合されました。
ひとつの拡張ノードで複数ファイルをIDで結合して読み込む
[拡張のインポート]ノードを編集します。スクリプトをどのようにBobに書かせたかは後述します。
入力するパスを変更して利用します。
[テーブル]表示します。最初のプロセスと同じテーブルを表示します。
Bobによるスクリプトの作成手順
1.Bobを起動して、作業フォルダを指定します。
2.SPSS Modeler[拡張のインポート]ノードからサンプル構文をコピーします。
3.プロンプトを作成します。サンプル構文をペーストします。
プロンプト
SPSS Modelerの拡張のインポートノードで
/Users/aa517821/Desktop/Data2の中のファイルを
IDでmergeしてひとつのCSVファイルにするネイティブPython APIスクリプトを書いてください。
結果は別のフォルダに保存してください。
- 拡張のインポートノードのスクリプトの解説として
@https://www.ibm.com/docs/ja/spss-modeler/18.6.0?topic=spark-native-python-apis を参考にしてください。
- シバンは不要です。
###Use this code to export data from Python to Modeler
#import modelerpy
#if modelerpy.isComputeDataModelOnly():
# outputDataModel = None
###Compute output data model here
# modelerpy.setOutputDataModel(outputDataModel)
#else:
# outputData = None
###Compute output data here
# modelerpy.writePandasDataframe(outputData)
4.プロンプトを実行します。
5.Bobの以下の出力を[拡張のインポート]にそのまま利用します。
Pythonスクリプト
import modelerpy
import pandas as pd
import os
import glob
if modelerpy.isComputeDataModelOnly():
# データモデルのみを計算する場合
data_dir = '/Users/aa517821/Desktop/Data2'
csv_files = sorted(glob.glob(os.path.join(data_dir, '*.csv')))
if csv_files:
# すべてのファイルを読み込んでマージ後のカラムを取得
dfs = []
for file in csv_files:
df = pd.read_csv(file)
dfs.append(df)
# IDでマージ
merged_df = dfs[0]
for df in dfs[1:]:
merged_df = pd.merge(merged_df, df, on='ID', how='outer')
# データモデルを構築
fields = []
for col in merged_df.columns:
dtype = merged_df[col].dtype
if dtype == 'int64':
storage = 'integer'
measure = 'continuous'
elif dtype == 'float64':
storage = 'real'
measure = 'continuous'
elif dtype == 'object':
storage = 'string'
measure = 'nominal'
else:
storage = 'string'
measure = 'nominal'
fields.append(modelerpy.Field(col, storage, measure))
outputDataModel = modelerpy.DataModel(fields)
modelerpy.setOutputDataModel(outputDataModel)
else:
# ファイルが見つからない場合は空のデータモデル
outputDataModel = modelerpy.DataModel([])
modelerpy.setOutputDataModel(outputDataModel)
else:
# 実際のデータを計算する場合
data_dir = '/Users/aa517821/Desktop/Data2'
csv_files = sorted(glob.glob(os.path.join(data_dir, '*.csv')))
# すべてのCSVファイルを読み込んでIDでマージ
if csv_files:
dfs = []
for file in csv_files:
df = pd.read_csv(file)
dfs.append(df)
# 最初のデータフレームから開始
outputData = dfs[0]
# 残りのデータフレームをIDでマージ
for df in dfs[1:]:
outputData = pd.merge(outputData, df, on='ID', how='outer')
# 結果を別のフォルダに保存
output_dir = '/Users/aa517821/Desktop/MergedData'
os.makedirs(output_dir, exist_ok=True)
output_file = os.path.join(output_dir, 'merged_data.csv')
outputData.to_csv(output_file, index=False)
# SPSS Modelerにデータを渡す
modelerpy.writePandasDataframe(outputData)
else:
# ファイルが見つからない場合は空のデータフレーム
outputData = pd.DataFrame()
modelerpy.writePandasDataframe(outputData)
# Made with Bob
注意事項
フォルダのパスに日本語名が含まれる場合の表記の例
u"/Users/aa517821/CRM小売/キャンペーン最適化/output/"
4.参考情報
店舗の数だけファイルを分割するpython拡張ノードをBobに作らせる
Modelerスクリプトでループ処理を実行する
SPSS Modeler ノードリファレンス目次
SPSS Modeler 逆引きストリーム集(データ加工)










