2021-07-10

お手軽データ解析サンプル

IT 部門の友人 S 氏から、いまどき GUI プログラムなんて古いよ、と言われたのはもう10年以上前のことになります。インターネットブラウザなどでアクセスして使うアプリの方がスマートなやり方だと判っているのですが、それでも、ちょっとしたプログラムを GUI アプリにするニーズは依然、根強く残っています。

今回は、業務にからんだ、ちょっとした GUI アプリを作ったケースを紹介します。

サプライヤ様からの相談

部品を供給していただいている、とあるサプライヤ様から相談を受けました。それは自分にとって直接の業務から外れた内容でした。しかし、そうは言っても品質改善を見込める間接的に関係する内容だったので、少し踏み込んだ対応をしました。

そのサプライヤ様では、製造工程で装置からログとして記録される実温度など工程パラメータの情報を Excel で読み込めるように変換し、そのデータを解析して、工程管理や品質改善に役立てています。しかし、データ変換が手作業によるもので、その変換作業は煩雑でとても時間が掛かっています。この負荷を低減するために自動化する良い方法がないだろうか、というのが相談された内容の概略です。

話を単純にして図式化すると、データの流れは以下のようになります。

装置のログデータの解析(手作業)

自動化は、なにかのプログラムで簡単に解決できると考え、手軽に扱える Python によるソリューションを提案しました。

装置のログデータの解析(Python の GUI プログラム)

製造装置のログデータは、USB メモリにコピーして取り出しているということだったので、とりあえずその部分は維持して、USB メモリにあるデータを読み込むところから Python のプログラムでデモンストレーションすることにしました。

デモプログラムは、読み込んだデータを SQLite のデータベースで管理、matplotlib を利用してチャートを作成し、必要があればそれを python-pptx を利用して PowerPoint 形式で出力、生データが欲しければ、Pandas を利用して Excel 形式で出力するというものです。個々の機能は、Python で実現できることとして別段珍しい機能ではありません。

装置のログデータのサンプルを提供してもらえば、2、3日でプロトタイプのプログラムを提示できたのですが、自分の業務範囲を外れていたことと、十分な準備期間がなかったことから、サンプルとして簡単な CSV ファイルを読み込むデモプログラムを作って紹介したのでした。

残念なことに、打ち合わせに参加したサプライヤ様側の担当者はプログラミングに関する経験が浅く、Python プログラムで実現できる自動化の話に十分踏み込めた打ち合わせとは言えませんでした。そのため嬉々として準備したデモプログラムは、やや空振りに終わってしまった感がありました。

デモプログラムの整理と公開

空振りに終わったデモプログラムですが、ある形式のファイルを読み込んでデータベースに保存し、そのデータを使ってチャートを作成したり、Excel や PowerPoint 形式でデータやレポートを出力する、といったニーズは、今回のサプライヤ様のケースに限らず、自分の業務ではたくさん存在します。

今回作ったプログラムを整理して、雛形(テンプレート)とは言えないまでも、類似の用途があればカスタマイズして転用できるようにしようと考えました。

というわけで、プログラムを整理したものが demo_01 です。下記 Github に公開しました。

demo_01 (Github)

こういった雛形のようなプログラムはいくつも作ると考え、とりあえず二桁の数字を付加して、素っ気ない名称ではありますが demo_01 としました。

以下の説明では、下記の OS 環境を使用しています。

Fedora 34 Workstation x86_64
- Python 3.9.6 (venv)
- IDE: PyCharm 2021.1.3 (community Edition)

プログラムの構成

プログラムの構成は下記のようになっています。1ファイル1クラスの構成でそれぞれの機能を担うようにした、シンプルな構成になっています。

demo_01 の構成

プログラムの動作

起動後

demo.py を実行すると下記のようなウィンドウが表示されます。

起動後のウィンドウ

読み込むファイルの選択

ボタンをクリックして、読み込むファイルを選択します。このデモプログラムではプロジェクトフォルダ内にある sample.csv という CSV ファイルの読み込みを想定しています。

読み込むファイル sample.csv の選択

ファイル選択ダイアログ内の sample.csv を選択してダブルクリックするか、Open ボタンをクリックします。

なお、この sample.csv は、参考サイト [1] から「船舶の航行データ」の CSV ファイルを編集して利用させていただいています。

プログラムでは、下記のように、選択したファイルのパスを、変数 filename へ格納します。

        filename: str = dialog.selectedFiles()[0]

次に filename を引数にして FileParser クラスのインスタンス file_obj を生成し、filename の内容を読み込み、プログラムで使用できる形式に変換します。このデモプログラムでは、CSV ファイルを読み込んでいるだけです。

        file_obj = FileParser(filename)

さらに、データベース処理を扱う DBObj クラスのインスタンス self.db_obj を、データベース名 name_dbfile_obj を引数にして生成します。チャート作成などでは、この self.db_obj からデータを取得します。

        self.db_obj = DBObj(self.name_db, file_obj)

このデモプログラムでは、新しい CSV ファイルを読み込む度にデータベースを初期化してしまいます。実際のアプリケーションへ転用する際には、データベースの初期化プロセスを分離する必要があります。

トレンドチャートの表示

サンプルファイルを読み込んだ後、最初のパラメータ、Parameter A のトレンドチャートが表示されます。

Parameter A のトレンドチャート

上部のツールバーにあるコンボボックスから、表示したいパラメータを選択するとトレンドチャートが更新されます。

コンボボックスから表示したいパラメータを選択

トレンドチャートは、最低限の機能しか実装しておらず、横軸の DateTime の表示も整数値のままです。

Parameter E のトレンドチャート

プログラムでは、コンボボックスの状態を監視し、選択が変更されると、新しく選択されたパラメータ名を、変数 param に格納します。

        param: str = combo.currentText()

param を引数にして、デー手ベース処理をする self.db_obj インスタンスメソッド get_trend_data で指定したパラメータの時系列データをデータフレームとして取得します。

        df: pd.DataFrame = self.db_obj.get_trend_data(param)

データフレーム df を引数にして TrendChart クラスのインスタンス trend を生成します。

        trend = TrendChart(df)

trend から、PySide2 (Qt) のウィジェット上に配置できる形式のプロット (FigureCanvas) を取得して、ウィジェット上に表示します。

        canvas: matplotlib.backends.backend_qt5agg.FigureCanvasQTAgg = trend.get_canvas()
        self.setCentralWidget(canvas)

Excel ファイルへの出力

ボタンをクリックすると、データベースに格納されたデータすべてを Excel 形式 (xlsx) にして、tmp などの一時格納領域へ保存して、Excel(Linux では LibreOffice Calc など)を起動して表示します。

データを Excel ファイル形式 (xlsx) に変換して表示 (LibreOffice Calc)

Excel ファイルの生成は、Pandas のデータフレームのメソッド to_excel を利用しています。

        df.to_excel(save_path, index=False)

PowerPoint ファイルへの出力

ボタンをクリックすると、すべてのパラメータのトレンドチャートを各スライドに貼り付けた PowerPoint 形式 (pptx) のファイルを作成、tmp などの一時格納領域へ保存して、PowerPoint(Linux では LibreOffice Impress など)を起動して表示します。

トレンドチャートを PowerPoint ファイル形式 (pptx) に変換して表示 (LibreOffice Impress)

PowerPoint ファイルの生成は、ベースとする PowerPoint ファイル self.template を引数にして、python-pptx の Presentation 関数を用いています。

        ppt = Presentation(self.template)

詳細は、参考サイト [2] を参照してください。

アプリのバージョンなどを表示するダイアログ

ボタンをクリックすると、このデモプログラム demo_01 のバージョン情報が表示されます。

About this ダイアログ

プログラムは、AboutDlg クラスのインスタンス about を生成して show() メソッドを呼び出しているだけです。

        about = AboutDlg(self)
        about.show()

他愛のない機能ですが、アプリがある程度動くようになったら、アプリのバージョンなどを確認するために必要になります。あらためて何も無い状態から作るのは面倒で、後回しにしてしまいがちですので、必要最小限と思われる機能を実装したクラスを用意しておきました。

まとめ

こんなちっぽけなプログラムのニーズが、世の中にあるのかどうかは判りませんが、少なくとも、自分の業務で応用できる分野が数多くあります。そういうわけで、まずは自己満足のために公開しました。

matplotlib が Qt6 (PySide6 / PyQt6) にまだ対応していないので、今のところ PySide2 (Qt5) を使っていますが、matplotlib が PySide6 に対応すれば更新する予定です。

参考サイト

  1. www.mi.u-tokyo.ac.jp/consortium2/time_series_data.html(東京大学 数理・情報教育研究センター)
  2. python-pptx — python-pptx 0.6.19 documentation

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

0 件のコメント: