Python Script アイコン 使い方ガイド 中級編

はじめに

中級編では、次の内容について解説します。

  1. pandas のデータフレームへ変換
  2. pandas の関数の利用方法
  3. matplotlib を利用したグラフ出力

Python Script アイコンの基本的な使い方は習得していて、もう少し高度な処理を行いたい人を対象としています。

Python Script アイコンの基本的な使い方に関してご存知ない方は、基礎編 を先にお読みください。

中級編で使用しているデータは、「共有ワークスペース」にある「センサーデータ.dft」です。

共有ワークスペース > サンプル > Alkano > データ > センサーデータ.dft

センサーデータ.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 ではありません。

そのため、次の順番で処理を行います。

  1. 入力データを pandas のデータフレームへ変換する
  2. pandas のデータフレームで処理を実行する
  3. 処理の結果を pandas のデータフレームから MSIP 特有のデータフレームに変換して出力データとする

データ変換

では、試してみましょう。

  1. 「センサーデータ.dft」を配置し、そこから「Python Script」アイコンを追加します。

    workflow

  2. 「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<em>to</em>dataframe

    スクリプトの実行が終了すると、「ジョブ一覧」の「ログ」に pandas_df.info() の出力が表示されています。

    pandas<em>to</em>dataframe

この節のポイントです。

Python Script アイコンでは、入力データ.to_pandas() で pandas データフレームを生成します。 pandas データフレームで処理した内容を出力する場合は、pandas_to_dataframe() で MSIP 特有のデータフレームに変換して出力します。

2. pandas の関数を使ってみよう

この節は前節の続きです。

データを構造を変換する処理が必要となる場合があります。 代表的な構造変換の一つに縦横変換があります。

それぞれの定義は MSIP のリスト化とマトリックス化のマニュアルで記載しているように

  • 縦型: 1 行が 2 つ以上のキーと値の組からなる形式

    下図の例では、「お店」と「果物」がキー列となっています。

  • 横型: クロス集計表のように、行と列に対応する要素を値とする形式

    下図の例では、行方向に「お店」、列方向に「果物」が並んでいます。

pandas の関数では、縦型変換は melt、横型変換は pivot です。

縦横変換

本編で対象としているセンサーデータは、先頭列 DateTime が時刻であり、 続く列はセンサー S_1S_2 ... の測定値といった横型データとなっています。

センサデータ

このセンサーデータを pandas の関数 meltpivot を使って縦横変換をしてみましょう。

  1. 「出力設定」では result1 を追加して「保存」をクリックします。

    pandas<em>to</em>dataframe

  2. スクリプトを

    # 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)
    

    に変更します。

    スクリプトを変更した後、[実行]をクリックします。

    pandas<em>to</em>dataframe

    スクリプトの実行が終了すると、可視化画面では次のように resultresult1 の 2 つのデータが確認できます。

    pandas<em>to</em>dataframe

    resultmelt の実行結果で、3列46,143行のテーブルとして表示されています。 melt により DateTime が index 、それ以外の列が「variable」 列の値となり、 「value」列には対応する値が入っています。

    result1melt された DataFrame を pivot で戻したデータフレームです。 入力データの「センサーデータ.dft」と同じです。

ここで使用した meltpivot の詳細は pandas のサイト をご覧ください。

なお、縦横変換は MSIP の前処理アイコンの「リスト化」と「マトリックス化 」で可能ですが、 時刻の列を対象とすることはできません。 このような場合は pandas の関数を使います。

この節のポイントです。

MSIP 特有のデータフレームを pandas データフレームに変換することで様々な pandas データフレームの関数を利用できます。 また、その結果を MSIP 特有のデータフレームに変換して出力することで、 他のアイコンとの連携が可能となります。

3. matplotlib を利用してグラフを出力してみよう

この節では matplotlib で描画して png 形式のグラフを出力します。 使用するデータは「センサーデータ.dft」です。

Python Script アイコンの 入力データ table は MSIP 特有のデータフレーム msi.common.dataframe.DataFrame であり、 matplotlib では扱えません。

そのため、次の順番で処理を行います。

  1. 入力データを Python の 辞書オブジェクトに変換する
  2. matplotlib で描画処理をする
  3. matplotlib で PNG ファイルを出力する
  4. PNG ファイルを保持する PNGObject を出力とする

workflow

PNGObject は PNG 形式のデータをアイコンの入出力とするために使います。 クラス PNGObject のインスタンスを出力 result に指定する方法は次となります。

from msi.common.visualization import PNGObject
result = PNGObject(画像ファイルのパス)

では、試してみましょう。

  1. 「センサーデータ.dft」を配置し、そこから「Python Script」アイコンを追加します。

    workflow

  2. png 形式のデータを出力するため、「出力設定」の「型」を png に変更します。

    PNG出力設定

  3. 「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列)の値をとる折れ線グラフを描画します。

    スクリプトを変更した後、[実行]をクリックします。

    pandas<em>to</em>dataframe

    スクリプトの実行が終了すると、可視化画面の「Python Script」アイコンの結果には折れ線グラフが出力されています。

    line graph

この節のポイントです。

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)

次のような折れ線グラフとなります。

line graph

タイトルに日本語を指定したい時は、サーバマシンにインストールされている日本語フォントを指定する必要があります。 多くの場合 MeiryoMS Mincho はインストールされています。

ax.set_xlabel("時刻",     fontfamily="Meiryo")  # X軸 タイトル
ax.set_ylabel("センサー", fontfamily="Meiryo")  # Y軸 タイトル
ax.set_title("比較",      fontfamily="Meiryo")  # グラフタイトル

line graph

サーバにインストールされているフォントは 「動作確認用インタープリタ」で次のコードにより確認できます。

from matplotlib import font_manager
flist = font_manager.get_font_names()
flist

line graph

matplotlib についての詳細は matplotlib のサイトをご覧ください。

【Q&A2】 折れ線グラフのサイズを指定したいのですが、どうしたらよいでしょうか?

前節で使用した、plt.subplotsplt.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 のサイトをご覧ください。

おわりに

中級編では、次の内容について解説しました。

  1. pandas のデータフレームへ変換
  2. pandas の関数の利用方法
  3. matplotlib を利用したグラフ出力

上級編では、

  1. 要素毎実行のためのリスト化データの生成
  2. GUI 定義のスクリプト
  3. 入力データ利用した GUI 定義スクリプト

について解説します。

上級編はこちら