paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

PayPayの支払いデータを自分で集計したい3

今回は前回の集計をグラフ化してみます。
②の部分ですね。

  1. ツール単体で集計
  2. 集計結果を可視化
  3. スマホアプリ用にビルド

追記分はこちら。
matplotlibに読ませる様のリストを作成してます。

sqlで出したものをまたリストにいれるというマヌケな処理になってしまいました。
綺麗に出来る方法はあるものか...

diff --git a/app.py b/app.py
index 45d6cf1..04bfc50 100644
--- a/app.py
+++ b/app.py
@@ -40,48 +40,13 @@ def main():
                  count("利用店名・商品名") FROM pay GROUP BY "利用日/キャンセル日", \
                  "利用店名・商品名" ORDER BY "利用日/キャンセル日"')
 
-    datelist = list()
     for x in cur.fetchall():
         print(*x)
-        datelist.append(x[0])
-
-    datelist = list(set(datelist))
-    datelist.sort()
 
     cur.execute('SELECT sum("支払総額") FROM pay')
     # Use 'format' for use astarisk
     print('Total: {}'.format(*cur.fetchone()))
 
-    # Top 3 stores that paid most
-    cur.execute('SELECT "利用店名・商品名", count("利用店名・商品名") FROM pay GROUP BY "利用店名・商品名" ORDER BY count("利用店名・商品名") DESC')
-
-    top3 = list()
-    for x in cur.fetchall()[:3]:
-        top3.append(x[0])
-
-    no1_list = list()
-    no2_list = list()
-    no3_list = list()
-
-    for i,x in enumerate(top3):
-        cur.execute('SELECT "利用日/キャンセル日", ?, sum(CASE WHEN "利用店名・商品名" = ? THEN "支払総額" ELSE 0 END) FROM pay \
-                    GROUP BY "利用日/キャンセル日", ? ORDER BY "利用日/キャンセル日"', [x,x,x])
-
-        # Create paymant list
-        for y in cur.fetchall():
-            if i == 0:
-                no1_list.append(y[2])
-            elif i == 1:
-                no2_list.append(y[2])
-            else:
-                no3_list.append(y[2])
-
-    i = 0
-    for t in [no1_list, no2_list, no3_list]:
-        if len(t) != 0:
-            print(datelist, t, f'label={top3[i]}')
-            i += 1
-
     con.close()
 
 if __name__ == '__main__':

支払い合計のTOP3を出してグラフ用のリストに渡す様にしました。

動かすと以下の出力になります。

❯ python app.py ../ドキュメント/paypay/detail202311\(5569\).csv
2023-09-30 ヤフージャパン 508 1
2023-10-04 PayPay 町かど酒場XXXX 3200 6
2023-10-06 PayPay XXXX Dining 1900 1
2023-10-07 PayPay 町かど酒場XXXX 2150 4
2023-10-08 PayPay 町かど酒場XXXX 2700 6
2023-10-09 PayPay 町かど酒場XXXX 1900 4
2023-10-12 PayPay 町かど酒場XXXX 2300 5
2023-10-13 PayPay 町かど酒場XXXX 1150 2
2023-10-14 PayPay 町かど酒場XXXX 3700 8
2023-10-14 PayPay XXXX Dining 2000 1
2023-10-15 PayPay 町かど酒場XXXX 4000 8
2023-10-16 PayPay 町かど酒場XXXX 1450 2
2023-10-18 PayPay 町かど酒場XXXX 950 2
2023-10-20 PayPay 町かど酒場XXXX 2200 4
2023-10-21 PayPay 町かど酒場XXXX 3500 6
2023-10-22 PayPay 町かど酒場XXXX 3900 7
2023-10-26 PayPay 町かど酒場XXXX 3950 8
2023-10-27 PayPay 町かど酒場XXXX 950 2
2023-10-28 PayPay 町かど酒場XXXX 2700 5
2023-10-29 PayPay ハリケーン 3020 1
2023-10-29 PayPay 町かど酒場XXXX 500 1
Total: 48628
['2023-09-30', '2023-10-04', '2023-10-06', '2023-10-07', '2023-10-08', '2023-10-09', '2023-10-12', '2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-18', '2023-10-20', '2023-10-21', '2023-10-22', '2023-10-26', '2023-10-27', '2023-10-28', '2023-10-29'] [0, 3200, 0, 2150, 2700, 1900, 2300, 1150, 3700, 4000, 1450, 950, 2200, 3500, 3900, 3950, 950, 2700, 500] label=PayPay 町かど酒場XXXX
['2023-09-30', '2023-10-04', '2023-10-06', '2023-10-07', '2023-10-08', '2023-10-09', '2023-10-12', '2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-18', '2023-10-20', '2023-10-21', '2023-10-22', '2023-10-26', '2023-10-27', '2023-10-28', '2023-10-29'] [0, 0, 1900, 0, 0, 0, 0, 0, 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] label=PayPay XXXX Dining
['2023-09-30', '2023-10-04', '2023-10-06', '2023-10-07', '2023-10-08', '2023-10-09', '2023-10-12', '2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-18', '2023-10-20', '2023-10-21', '2023-10-22', '2023-10-26', '2023-10-27', '2023-10-28', '2023-10-29'] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3020] label=PayPay ハリケーン

下三行が追加したコードで、日付リスト・各日毎の支払金額が合計金額の多い店舗順に出てきます。
このフォーマットをmatplotlibに読ませればグラフ化できます。

jupyterlab

グラフや画面系の確認はjupyterlabがいい感じに検証できるのでこちらを使います。
いきなりですが先程の出力結果をちょっと修正してmatplotlibに読ませるとこうなります。

明細の都合上日本語化モジュールいれたのとフォントサイズいじってます。

import matplotlib.pyplot as plt
import japanize_matplotlib

datelist = ['2023-09-30', '2023-10-04', '2023-10-06', '2023-10-07', '2023-10-08', '2023-10-09', '2023-10-12', '2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-18', '2023-10-20', '2023-10-21', '2023-10-22', '2023-10-26', '2023-10-27', '2023-10-28', '2023-10-29']

top = [0, 3200, 0, 2150, 2700, 1900, 2300, 1150, 3700, 4000, 1450, 950, 2200, 3500, 3900, 3950, 950, 2700, 500] 
two = [0, 0, 1900, 0, 0, 0, 0, 0, 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
thi = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3020] 

plt.bar(datelist, top, label='町かど酒場XXXX')
plt.bar(datelist, two, label='XXXX Dining')
plt.bar(datelist, thi, label='ハリケーン')

plt.title('今月のPayPay支払い')
plt.ylabel('円(¥)')
plt.xticks(rotation=45)
plt.legend(loc='upper left', ncols=3, fontsize=8)
plt.tick_params(labelsize=7)
plt.ylim(0, max(top) * 1.5)
plt.show()

OK。いい感じにグラフできました。
店舗ごとの並列棒グラフにするつもりでしたが合計と割合が分かるしこの積み上げ棒グラフままでもいいか。

今後

月ごとのテーブル、グラフ出力と基本的な処理は出来たので一旦こんなものでいいでしょう。
コードはもう少し成形しますがこれからKivyに連携させるという結構大変な作業が待ってます。