はじめに
中級編では、次の内容について解説します。
- pandas のデータフレームへ変換
- pandas の関数の利用方法
- matplotlib を利用したグラフ出力
Python Script アイコンの基本的な使い方は習得していて、もう少し高度な処理を行いたい人を対象としています。
Python Script アイコンの基本的な使い方に関してご存知ない方は、基礎編 を先にお読みください。
中級編で使用しているデータは、「共有ワークスペース」にある「センサーデータ.dft」です。
共有ワークスペース > サンプル > Alkano > データ > センサーデータ.dft
中級編では、MSIP にインストール済の外部ライブラリ pandas と matplotlib を 使用します。 よく使われている Python ライブラリは Web で検索できる情報や書籍が充実しています。 そのため、Python Script アイコンをより便利に使えるようになります。
なお、使用したライブラリのバージョンは以下のとおりです。
ライブラリ | version |
---|---|
pandas | 1.3.4 |
matplotlib | 3.7.1 |
1. pandas データフレームに変換しよう
この節では 入力データの「センサーデータ.dft」を pandas の データフレームに変換して pandas データフレームを処理します。
Python Script アイコンでは「入力設定」の初期値は「名前」が table
、
「型」も table
でした。
この table
型は、MSIP 特有のデータフレーム msi.common.dataframe.DataFrame
であり、pandas のデータフレーム pandas.DataFrame
ではありません。
そのため、次の順番で処理を行います。
- 入力データを pandas のデータフレームへ変換する
- pandas のデータフレームで処理を実行する
- 処理の結果を pandas のデータフレームから MSIP 特有のデータフレームに変換して出力データとする
では、試してみましょう。
「センサーデータ.dft」を配置し、そこから「Python Script」アイコンを追加します。
「Python Script」アイコンをダブルクリックして、パラメータ編集画面を表示します。
中央の Python スクリプト
result = table
を
# pandas データフレームに変換する pandas_df = table.to_pandas() # pandas データフレームの情報を表示する print(pandas_df.info()) # MSI データフレームに変換する from msi.common.dataframe import pandas_to_dataframe result = pandas_to_dataframe(pandas_df)
に変更します。 これは pandas のデータフレームでの処理として、 pandas データフレームの情報をログに表示するスクリプトとなっています
スクリプトを変更した後、
[実行]
をクリックします。スクリプトの実行が終了すると、「ジョブ一覧」の「ログ」に
pandas_df.info()
の出力が表示されています。
この節のポイントです。
Python Script アイコンでは、入力データ.to_pandas()
で pandas データフレームを生成します。
pandas データフレームで処理した内容を出力する場合は、pandas_to_dataframe()
で MSIP 特有のデータフレームに変換して出力します。
2. pandas の関数を使ってみよう
この節は前節の続きです。
データを構造を変換する処理が必要となる場合があります。 代表的な構造変換の一つに縦横変換があります。
それぞれの定義は MSIP のリスト化とマトリックス化のマニュアルで記載しているように
縦型: 1 行が 2 つ以上のキーと値の組からなる形式
下図の例では、「お店」と「果物」がキー列となっています。
横型: クロス集計表のように、行と列に対応する要素を値とする形式
下図の例では、行方向に「お店」、列方向に「果物」が並んでいます。
pandas の関数では、縦型変換は melt
、横型変換は pivot
です。
本編で対象としているセンサーデータは、先頭列 DateTime
が時刻であり、
続く列はセンサー S_1
、S_2
... の測定値といった横型データとなっています。
このセンサーデータを pandas の関数 melt
と pivot
を使って縦横変換をしてみましょう。
「出力設定」では
result1
を追加して「保存」をクリックします。スクリプトを
# pandas データフレームに変換する pandas_df = table.to_pandas() # melt を実行する melt_df = pandas_df.melt(["DateTime"]) # pivot を実行する pivot_df = melt_df.pivot("DateTime", "variable", "value").reset_index() # MSI データフレームに変換する from msi.common.dataframe import pandas_to_dataframe result = pandas_to_dataframe(melt_df) result1 = pandas_to_dataframe(pivot_df)
に変更します。
スクリプトを変更した後、
[実行]
をクリックします。スクリプトの実行が終了すると、可視化画面では次のように
result
とresult1
の 2 つのデータが確認できます。result
はmelt
の実行結果で、3列46,143行のテーブルとして表示されています。melt
によりDateTime
が index 、それ以外の列が「variable」 列の値となり、 「value」列には対応する値が入っています。result1
はmelt
された DataFrame をpivot
で戻したデータフレームです。 入力データの「センサーデータ.dft」と同じです。
ここで使用した melt
と pivot
の詳細は pandas のサイト をご覧ください。
なお、縦横変換は MSIP の前処理アイコンの「リスト化」と「マトリックス化 」で可能ですが、 時刻の列を対象とすることはできません。 このような場合は pandas の関数を使います。
この節のポイントです。
MSIP 特有のデータフレームを pandas データフレームに変換することで様々な pandas データフレームの関数を利用できます。 また、その結果を MSIP 特有のデータフレームに変換して出力することで、 他のアイコンとの連携が可能となります。
3. matplotlib を利用してグラフを出力してみよう
この節では matplotlib で描画して png 形式のグラフを出力します。 使用するデータは「センサーデータ.dft」です。
Python Script アイコンの 入力データ table
は
MSIP 特有のデータフレーム msi.common.dataframe.DataFrame
であり、
matplotlib では扱えません。
そのため、次の順番で処理を行います。
- 入力データを Python の 辞書オブジェクトに変換する
- matplotlib で描画処理をする
- matplotlib で PNG ファイルを出力する
- PNG ファイルを保持する PNGObject を出力とする
PNGObject
は PNG 形式のデータをアイコンの入出力とするために使います。
クラス PNGObject
のインスタンスを出力 result
に指定する方法は次となります。
from msi.common.visualization import PNGObject result = PNGObject(画像ファイルのパス)
では、試してみましょう。
「センサーデータ.dft」を配置し、そこから「Python Script」アイコンを追加します。
png 形式のデータを出力するため、「出力設定」の「型」を png に変更します。
「Python Script」アイコンをダブルクリックして、パラメータ編集画面を表示します
中央の Python スクリプト
result = table
を
# MSI データフレームを Dictionary に変換します data = table.to_dict() # matplotlib でグラフを描画します import matplotlib.pyplot as plt plt.plot(data["DateTime"], data["S_1"]) # 描画したグラフを png ファイルに保存します import os png_file_path = os.path.abspath('./figure.png') plt.savefig(png_file_path) # 描画を終了します plt.close() # 出力データを PNGObject とします from msi.common.visualization import PNGObject result = PNGObject(png_file_path)
に変更します。 このスクリプトでは、横軸に時刻(
DateTime
列)を取り、縦軸にはセンサ(S_1
列)の値をとる折れ線グラフを描画します。スクリプトを変更した後、
[実行]
をクリックします。スクリプトの実行が終了すると、可視化画面の「Python Script」アイコンの結果には折れ線グラフが出力されています。
この節のポイントです。
Python Script アイコンでは、スクリプトに matplitlib を用いて png 形式のデータを出力することができます。
「出力設定」は png
形式にして、出力データに msi.common.visualize.PNGObject
のインスタンスをセットします。
【Q&A1】 折れ線グラフにタイトルや凡例をいれたいのですが、どうしたらよいでしょうか?
前節のスクリプトの # matplotlib でグラフを描画します
の箇所を修正します。
前節の
# matplotlib でグラフを描画します import matplotlib.pyplot as plt plt.plot(data["DateTime"], data["S_1"])
を次のように修正します。
# matplotlib でグラフを描画します import matplotlib.pyplot as plt _, ax = plt.subplots() # 初期化処理 ax.plot(data["DateTime"], data["S_1"], label="S_1") # 折れ線 ax.set_xlabel("DateTime") # X軸 タイトル ax.set_ylabel("Sensor") # Y軸 タイトル ax.set_title("S_1") # グラフタイトル ax.grid(axis = 'y', linestyle = '--') # グリッド線 ax.legend() # 凡例
このスクリプトでは、
横軸に時刻(DateTime
列)を取り、縦軸にはセンサ(S_1
列)の値をとる折れ線グラフに、
- 凡例ラベルは
S_1
- X軸のラベルは
DateTiem
、Y軸ラベルはSensor
- グラフタイトルは
S_1
- 縦方向に点線のグリッド線
を加えて描画します。
全体としては次のようになります。
# MSI データフレームを Dictionary に変換します data = table.to_dict() # matplotlib でグラフを描画します import matplotlib.pyplot as plt _, ax = plt.subplots() # 初期化処理 ax.plot(data["DateTime"], data["S_1"], label="S_1") # 折れ線 ax.set_xlabel("DateTime") # X軸 タイトル ax.set_ylabel("Sensor") # Y軸 タイトル ax.set_title("S_1") # グラフタイトル ax.grid(axis = 'y', linestyle = '--') # グリッド線 ax.legend() # 凡例 # 描画したグラフを png ファイルに保存します import os png_file_path = os.path.abspath('./figure.png') plt.savefig(png_file_path) # 描画を終了します plt.close() # 出力データを PNGObject とします from msi.common.visualization import PNGObject result = PNGObject(png_file_path)
次のような折れ線グラフとなります。
タイトルに日本語を指定したい時は、サーバマシンにインストールされている日本語フォントを指定する必要があります。
多くの場合 Meiryo
や MS Mincho
はインストールされています。
ax.set_xlabel("時刻", fontfamily="Meiryo") # X軸 タイトル ax.set_ylabel("センサー", fontfamily="Meiryo") # Y軸 タイトル ax.set_title("比較", fontfamily="Meiryo") # グラフタイトル
サーバにインストールされているフォントは 「動作確認用インタープリタ」で次のコードにより確認できます。
from matplotlib import font_manager flist = font_manager.get_font_names() flist
matplotlib についての詳細は matplotlib のサイトをご覧ください。
【Q&A2】 折れ線グラフのサイズを指定したいのですが、どうしたらよいでしょうか?
前節で使用した、plt.subplots
と plt.savefig
に解像度やグラフサイズを指定します。
# グラフサイズ width = 600 # 幅 pix height = 400 # 高さ pix dpi = 100 # 解像度 # matplotlib で描画します import matplotlib.pyplot as plt _, ax = plt.subplots(dpi=dpi, figsize=(int(width/dpi), int(height/dpi))) # 初期化処理 ... # 描画したグラフを png ファイルに保存します ... plt.savefig(png_file_path, dpi=dpi) # 画像出力
全体としては次のようになります。
# MSI データフレームを Dictionary に変換します data = table.to_dict() # グラフサイズ width = 600 # 幅 pix height = 400 # 高さ pix dpi = 100 # 解像度 # matplotlib で描画します import matplotlib.pyplot as plt _, ax = plt.subplots(dpi=dpi, figsize=(int(width/dpi), int(height/dpi))) # 初期化処理 ax.plot(data["DateTime"], data["S_1"], label="S_1") # 折れ線 ax.set_xlabel("DateTime") # X軸 タイトル ax.set_ylabel("Sensor") # Y軸 タイトル ax.grid(axis = 'y', linestyle = '--') # グリッド線 ax.legend() # 凡例 ax.set_title("S_1 vs S_2") # グラフタイトル # 描画したグラフを png ファイルに保存します import os png_file_path = os.path.abspath('./figure.png') plt.savefig(png_file_path, dpi=dpi) # 画像出力 # 描画を終了します plt.close() # 出力データを PNGObject とします from msi.common.visualization import PNGObject result = PNGObject(png_file_path)
matplotlib についての詳細は matplotlib のサイトをご覧ください。
おわりに
中級編では、次の内容について解説しました。
- pandas のデータフレームへ変換
- pandas の関数の利用方法
- matplotlib を利用したグラフ出力
上級編では、
- 要素毎実行のためのリスト化データの生成
- GUI 定義のスクリプト
- 入力データ利用した GUI 定義スクリプト
について解説します。