SPSS Modelerのレコード追加ノードをPythonで書き換える。


SPSS Modelerでデータを縦方向に追加するのが、レコード追加ノードです。
SQLでいうUNION ALLにあたる加工処理です。
これをPythonのpandasで書き換えてみます。

0.元データ

以下の2つの時系列のセンサーデータをつかって行います。
似たデータ項目ですが、列名が違っていたり、片方にしかない列が含まれています。

■データ1:Cond4n_e104.csv
M_CD: マシンコード
UP_TIIME: 稼働時間
POWER: 電力
TEMP: 温度
ERR_CD: エラーコード

■データ2:COND2n.csv
Time:稼働時間
Power:電力
Temperature:温度
Pressure:圧力
Uptime:起動時間
Status:状態コード
Outcome:エラーコード

1m.レコードの追加 Modeler版

データ1「Cond4n_e104.csv」の列に合わせて、データ2「COND2n.csv」を追加します。


まずフィルターノードを使って、データ2の列をデータ1の列名に合わせます。

次にレコード追加ノードを接続します。
M_CDに当たる列がデータ2のCOND2n.csvには存在しないのでNULLが入ります。

以下のようにデータ1にデータ2が追加されました。

ちなみにレコード追加ノードでは、フィールド一致基準のデフォルトは「名前」ですが、名前が違っていても、列位置を基準に追加することもできます。
また、追加するデータ2にしか含まれていないPressureなども追加したい場合はフィールド入力元で「すべてのデータセット」を選ぶと追加ができます。
さらにどちらのデータから来たかを示すタグ列をつけたりすることも可能です。

1p.レコードの追加 pandas版

フィルターノードに当たる処理をrenameとdropを使って行います。renameでデータ1と列名をそろえ、dropで不要な列を削除します。

#データ2の列をデータ1の列名に合わせます。
df2_1=df2.rename(columns={'Time': 'UP_TIME', 'Power': 'POWER', 'Temperature': 'TEMP', 'Outcome': 'ERR_CD'})\
    .drop(['Pressure','Uptime','Status'],axis=1)
df2_1

次に、レコード追加ノードにあたるレコード追加処理を行います。
方法は二つあってappendとconcatがあります。
どちらでも結果は同じです。3つ以上のデータを結合する場合はconcatの書き方の方がわかりやすくてよいと思います。

#appendを使う方法
df1.append(df2_1)
#concatを使う方法
pd.concat([df1,df2_1])

2. サンプル

サンプルは以下に置きました。

ストリーム
https://github.com/hkwd/200611Modeler2Python/raw/master/append/append.str
notebook
https://github.com/hkwd/200611Modeler2Python/blob/master/append/append.ipynb
データ
https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/Cond4n_e104.csv
https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/COND2n.csv

■テスト環境
Modeler 18.2.2
Windows 10 64bit
Python 3.7.9
pandas 1.0.5

4. 参考情報

重複レコード・ノード
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.1/modeler_mainhelp_client_ddita/clementine/distinct_settingstab.html