LoginSignup
8
2

More than 1 year has passed since last update.

PySimpleGUIでGUIツール作成~Plotlyで月間支出グラフを出力してみよう

Last updated at Posted at 2022-11-22

Python演習スライド.jpg
Pythonを使ったグラフ表示の方法として、matplotlibやフレームワークなどを使ったことがある方もいらっしゃると思います。データを視覚化することで現状の課題に対するフィードバックがしやすくなる為、前向きにデータ活用していきたいものですよね。(小さい規模での)導入作業を繰り返し行うことで、周囲に合意を得られる形で情報が共有され、実際に導入実績につながるということもあるのかもしれません。

今回は、GUIツールで「取り込んだExcel(csv)ファイルを操作し、PDFファイルでグラフ表示する」方法について確認していきます。ライブラリには

GUI:PySimpleGUI / グラフ表示:Plotly /PDF出力:kaleido を使用します。

ライブラリを用いてデータを読み書きしたり、グラフを出力したり、PDF出力するといった具合に、使用用途に合わせて組み合わせて実装していけると良いですよね。

添付資料のダウンロードはこちらから (右クリックからリンク先を保存してください)


添付資料にある「ExpenseList.csv」を基にグラフ表示してみたいと思います。

 ExpenseList.csv

image.png
image.png

PySimpleGUIの画面レイアウト作成

それではまず、PySimpleGUIライブラリを使ってGUIツールの画面レイアウトを作成していきましょう。

問題:サンプルコードを実行して画面レイアウトを作成

以下のサンプルのように(PySimpleGUIの基礎解説の参考サイトや他のWebサイトを参考にしながら)csvファイルを読み込む画面レイアウトを作成してみましょう。
image.png

【参考サイト】:PySimpleGUIの使い方についての基礎解説
http://www.k-techlabo.org/blog2/?page_id=1481

・インストール
pipというPythonのパッケージ管理ツールを使って、「PySimpleGUI」をインストールします。

※ Pythonインストール時に標準で入っているパッケージ以外をインストールする場合、
「pip install パッケージ名」のコマンドで、ローカル環境のPowerShellにてインストールをします。

インストール
pip install PySimpleGUI

► 結果
image.png

サンプルコード(画面レイアウト作成)
import PySimpleGUI as sg

layout = [
   [sg.Text("ファイル"), sg.InputText(), sg.FileBrowse('ファイル選択', key="inputFilePath")],
   [sg.Text(" ↓↓PDFにてグラフを表示:")],
   [sg.Button('グラフ出力')]
]
window = sg.Window("ファイル読込", layout)

# イベントループ
while True:
    event, values = window.read()                                                                                                                       
    if event == sg.WIN_CLOSED:                                                                                                                      
        break                                                                                                                                                              
elif event == 'グラフ出力':
        # 処理の内容を記載
        sg.popup('処理内容の実装前')     

window.close()

Pythonでファイル読み込み処理を実装する

問題:CSVデータをpandasのデータフレームを利用して読込

先程実行したGUIのソースにpandasのデータフレームを利用して読み込み、
CSVファイルをデータ表示させて内容を確認してみましょう。
*このとき、実行ファイルと同じディレクトリに「ExpenseList.csv」を追加すること
image.png

コード
import pandas as pd
# pandasでcsvファイルの内容を読み込む
# csvファイルの、1列目にAccountDate, 2列目にExpenseItem, 3列目にMemo, 4列目にWithdrawalAmountが入っているとする
df = pd. read_csv('csvのパスを記載', encoding='SHIFT_JIS')

print(df)

Pandasとは?

Pythonでデータ処理をするために作られた高機能なライブラリ。代表的な使い方としてSeriesやDataFrameを使ったデータの処理方法があります。Pandasを利用するには、以下のようにインポートを行います。Asキーワードを使用してpdで呼び出せるようにします。

In
import pandas as pd

►使用例

# 1次元データの利用
ser = pd.Series( [10, 20, 30, 40] )
ser

# 2次元データの利用
df = pd.DataFrame( [10, a, True], 
[20, b, False],
[30, c, False],
[40, d, True] )
df

csvやExcelのデータを読み込んだり、列や行を削除したり、フィルターをかけて抽出をしたりといったExcelやデータベース言語のSQLでできることがPandasの機能にはあります。

Pythonでグラフ表示~ Plotlyライブラリの基礎

次、グラフ描画するにあたって、使用するライブラリの基礎を押さえておきましょう。

・Plotly とは?

 インタラクティブな可視化ができるライブラリのことで、「Plotly express」というPlotlyのラッパーを使うと、より簡潔な方法でデータを可視化することができます。

 今回は、「Plotly express」を使って、折れ線グラフ、棒グラフ、円グラフを描画する例をみていきます。


問題 :Plotlyの基本①~折れ線グラフの書き方を理解する

 ExpenseList.csvのに各月(AccountDateごと)の支出合計額の推移をPlotly expressを利用して、折れ線グラフで表示してください。

作業の際、PDF出力する為に「pip install kaleido」を実施してください。
image.png
image.png

コード
import PySimpleGUI as sg
import pandas as pd
import plotly.express as px

layout = [
   [sg.Text("ファイル"), sg.InputText(key='-file-'), sg.FileBrowse('ファイル選択',
key="inputFilePath",target='-file-')],
   [sg.Text(" ↓↓ PDFにてグラフを表示:")],
   [sg.Button('グラフ出力')]
]

window = sg.Window("ファイル読込", layout)

# イベントループ
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    elif event == 'グラフ出力':
        # ファイルパスを取得
        f = values['-file-']
        
        # pandasでcsvファイルの内容を読み込む
        # csvファイルの、1列目にAccountDate, 2列目にExpenseItem, 3列目にMemo, 
4列目にWithdrawalAmountが入っているとする
        df = pd.read_csv(f, encoding='SHIFT_JIS')
        # WithdrawalAmount列を数値変換する
        df['WithdrawalAmount'] = df['WithdrawalAmount'].apply(lambda x: x.replace(',', '')).astype('int')

        #作成したデータフレームを基にグラフを作成
        df2 = df[['AccountDate','WithdrawalAmount']].groupby('AccountDate').sum(numeric_only=True)
        print(df2)

        #折れ線グラフを作成
        fig = px.line(df2, title='AccountDateごとの支出')
        fig.show()
        #出力内容をPDFでグラフ表示(kaleidoライブラリ)
        fig.write_image("./test.pdf")


window.close()




問題 :Plotlyの基本②~棒グラフの書き方を理解する

前の問題のグラフ表示方法を参考にして
ExpenseList.csvの支出カテゴリごとの合計額を
Plotly expressを利用して、棒グラフで表示してください。
image.png
image.png

問題 :Plotlyの基本③~円グラフの書き方を理解する

 前の問題のグラフ表示方法を参考にして
 ExpenseList.csvの支出カテゴリごとの合計費用の割合について
 Plotly expressを利用して、円グラフで表示してください。
image.png
image.png

業務で Python を使ってツールを作る機会がある方もいらっしゃると思います。自身の PC で Visual Studio Code を使って簡単に今回のサンプルを試すことができますので、この機会に Python に触れる時間を作っていただけると嬉しい限りです。
以上となります。

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2