SPSS Modelerの折れ線グラフ、時系列グラフノードをPythonで書き換える

SPSS Modelerの折れ線グラフ、時系列グラフノードをPythonのmatplotlibやpandasのplotで書き換えてみます。

#0．データ
サンプルで利用するデータは以下です
M_CD: マシンコード
UP_TIIME: 起動時間
POWER: 電力
TEMP: 温度
PRESSURE：圧力フラグ
ERR_CD: エラーコード

各マシンコードごとに起動時間にそって電力や温度の変化、圧力スイッチ、そしてエラーがあればそれが時系列に記録されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1e739d26-7c0f-3f6d-7c91-9934e64ba6c3.png)

#1m．折れ線グラフ、時系列グラフ。Modeler版
折れ線グラフに複数の系列があるとややこしいので、M_CD=1000という1台の装置のデータに絞り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a58cb8ba-731d-c29d-9eb1-5846a9018bf2.png)

線グラフノードでxフィールドにUP_TIME、YフィールドにPOWERを設定し、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3f46fe35-ef17-9b0c-ee8f-4685218b8701.png)

POWERの推移が折れ線グラフで表されました。経過時間とともにPOWERが下がっていくことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f15ad372-80fa-c1d1-9684-8fedc4b816d3.png)

Modelerには、もう一つ折れ線グラフを書くことができるノードがあります。それが時系列グラフノードです。これはスケール異なる系列を正規化や別パネルに表示する折れ線グラフが書けます。
系列でスケールの異なるPOWERとTEMPという異なる系列を設定し、X軸ラベルにはUP_TIMEを設定します。そしてここではデータを正規化して表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/faad682b-ac2f-42eb-da4d-d32967a1832d.png)

スケールが0から1で揃えられて、POWERとTEMPが折れ線グラフになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9438639a-620b-5b05-9513-844118bfd3b2.png)

#1p．折れ線グラフ、時系列グラフ。matplotlib,pandas版
まず、M_CD=1000という1台の装置のデータに絞り込みます。

```python
df1000=df.query('M_CD==1000')
```

matplotlibのplotでxとしてdf1000['UP_TIME']、yとしてdf1000['POWER']の各Seriesオブジェクトを指定します。

```python
plt.plot(df1000['UP_TIME'],df1000['POWER'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/207f4205-9f5a-94e2-4256-47ff64ab34ec.png)

pandasのplotメソッドを使って同じことをします。
xとyには列名のみを指定します。

```python
df1000.plot(x='UP_TIME', y='POWER')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3a83bbb4-e523-42c9-2871-ad9b6113c647.png)

xlabelやlegendも自動的に表示されるので便利です。

次にmatplotlibを使って、スケールの異なるPOWERとTEMPという異なる系列を正規化して表示します。
matplotlibでPOWERとTEMPの折れ線グラフを1回のプロットでは書けません。POWERとTEMPのそれぞれで折れ線グラフをサブ・プロットでつくって重ね合わせることになります。

スケールの異なるPOWERとTEMPを0-1のスケールに変換するにはpreprocessing.MinMaxScaler()を使います。mm.fit_transform(df1000[['POWER']])で変換します。fit_transformはSeriesではなくDataFrameしか引数にできないので[['POWER']]のように二つの[]で列名を囲みます。

```python
from sklearn import preprocessing
mm = preprocessing.MinMaxScaler()
#mmPower=mm.fit_transform(df1000[['POWER']])
ax.plot(df1000['UP_TIME'],mm.fit_transform(df1000[['POWER']]), c="blue", label='POWER')
ax.plot(df1000['UP_TIME'],mm.fit_transform(df1000[['TEMP']]), c="red", label='TEMP')
ax.legend(loc='upper left')
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/dd511335-290c-605a-b66d-814f41e9977f.png)

pandasのplotメソッドを使って同じことをします。
UP_TIMEと正規化されたPOWERとTEMPのみのDataFrameを作りました。
mm.fit_transform(df1000[['POWER']])の結果はDataFrameで2次元データになっているので、[:,0]で1次元の配列に変換しています。

```python
df1000norm=pd.DataFrame({'UP_TIME':df1000['UP_TIME'],
             'POWER':mm.fit_transform(df1000[['POWER']])[:,0],
             'TEMP':mm.fit_transform(df1000[['TEMP']])[:,0]})
```
後はx軸の列名として'UP_TIME'を指定すると残りのPOWERとTEMPは自動的に別の色で表示してくれます。

```python
df1000norm.plot(x='UP_TIME')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4d1cb4a9-a9a5-64ab-f86d-546c51f899c3.png)


* 参考
- matplotlib 折れ線グラフ | Python学習講座

https://www.python.ambitious-engineer.com/archives/908

- pandasのplotメソッドでグラフを作成しデータを可視化 | note.nkmk.me

https://note.nkmk.me/python-pandas-plot/

- Pythonで正規化・標準化（リスト、NumPy配列、pandas.DataFrame） | note.nkmk.me

https://note.nkmk.me/python-list-ndarray-dataframe-normalize-standardize/


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

ストリーム
https://github.com/hkwd/200611Modeler2Python/blob/mastergraph/graph.str?raw=true
notebook
https://github.com/hkwd/200611Modeler2Python/blob/master/graph/graph.ipynb
データ
https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/Cond5n_e.csv

■テスト環境
Modeler 18.3
Windows 10 64bit
Python 3.8.5
pandas 1.0.5

#3. 参考情報
線グラフの「作図」タブ - IBM Documentation

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=node-multiplot-plot-tab

時系列の「作図」タブ - IBM Documentation

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=node-time-plot-tab