paloma blog

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

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

今年はコロナも落ち着きそうと言うことで引きこもりを脱却すべく外に飲みに行くようになりました。
地元に気軽に行けるちょっとお洒落な立ち飲み屋があり今年は平均週一回以上通ってます。

立ち飲みという形態上キャッシュオンなのですが毎回現金を用意するのが面倒だったので4月にpaypayを導入しました。
今年前半こそ週一ペースだったのですが通っていくうちに知り合いも増えたということもあり、だんだん頻度が上がってしまい今月・先月の請求がビックリするほど増加していました。

生活に困るレベルではないですが出費はなるべく押さえたいところです。
というわけで内訳を出してウォッチしようと思います。

paypayアプリから請求金額や使った店舗の集計は出来ますが、キャッシュオンで都度支払ってかつ同じ店に通っている身としては1日何件決済したかどうかのペースが知りたいところです。

CSV読んでグラフ化して完了!としたいところですがpaypayの気に入らないところで利用明細のダウンロードがアプリからしか出来ません。

スマホでダウンロードしてPCに移してCSVから起こして...って毎月やる?

こんな運用するならスマホから見れるようにしようということでいっちょ集計アプリを作ろうと思います。 

ロードマップ

いきなりアプリを作ろうとすると完成まで時間がかかるので段階を踏みます。

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

というわけでまずは①です。 

集計ツール

月の支払い合計を出すだけなら何を使ってもできるのですが、使いすぎを見つけるため1日毎にどの店でいくら決済したかというのを集計したいです。

pythoncsvモジュールでなんとかできないかと思いましたがすぐにはできなかったのでpandasかSQLあたりを使います。

いずれスマホで触るアプリにしようと考えるとパッケージをボンボン入れてあまりサイズを大きくしたくないのでSQLで考えます。

なのでpythonsqliteのセットくらいになりますね。 

sqliteで集計

まずはsqliteでサクッと集計してみましょう。
csvインポート機能もあります。

とりあえず先月分。 

バージョン
❯ sqlite3 --version

3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1
csvインポート

型が指定できないのは困りますがインポート機能便利です。

sqlite> .mode csv
sqlite> .import 'detail202311(5569).csv' pay
スキーマ

CSVのヘッダです。  
必要なのは利用日、利用店、支払い総額くらいですかね。

sqlite> .schema
CREATE TABLE IF NOT EXISTS "pay"(
  "利用日/キャンセル日" TEXT,
  "利用店名・商品名" TEXT,
  "利用者" TEXT,
  "支払区分" TEXT,
  "利用金額" TEXT,
  "手数料" TEXT,
  "支払総額" TEXT,
  "当月支払金額" TEXT,
  "翌月以降繰越金額" TEXT,
  "調整額" TEXT,
  "当月お支払日" TEXT
);
1日毎かつ店毎の集計

CSV形式で出力します。  

見にくいですがテーブル形式だとスマホからもっと見にくいですからね。
処理上仕方無いのかも知れませんがデフォルトで全角なの腹立ちますね(笑)
日本の利用明細は何故か全部こうだ。

sqlite> .header on
sqlite> select "利 用 日 /キ ャ ン セ ル 日 ", "利 用 店 名 ・ 商 品 名 ",sum("支 払 総 額 "), count("利 用 店 名 ・ 商 品 名 ") from pay group by "利 用 店 名 ・ 商 品 名 ", "利 用 日 /キ ャ ン セ ル 日 " order by "利 用 日 /キャ ン セ ル 日 " ASC;
"利 用 日 /キ ャ ン セ ル 日 ","利 用 店 名 ・ 商 品 名 ","sum(""支 払 総 額 "")","count(""利 用 店 名 ・ 商 品 名 "")"
2023/10/12,"P a y P a y   町 か ど 酒 場 XXXX ",2300,5
2023/10/13,"P a y P a y   町 か ど 酒 場 XXXX ",1150,2
2023/10/14,"P a y P a y   町 か ど 酒 場 XXXX ",3700,8
2023/10/14,"P a y P a y   XXXX   D i n i n g ",2000,1
2023/10/15,"P a y P a y   町 か ど 酒 場 XXXX ",4000,8
2023/10/16,"P a y P a y   町 か ど 酒 場 XXXX ",1450,2
2023/10/18,"P a y P a y   町 か ど 酒 場 XXXX ",950,2
2023/10/20,"P a y P a y   町 か ど 酒 場 XXXX ",2200,4
2023/10/21,"P a y P a y   町 か ど 酒 場 XXXX ",3500,6
2023/10/22,"P a y P a y   町 か ど 酒 場 XXXX ",3900,7
2023/10/26,"P a y P a y   町 か ど 酒 場 XXXX ",3950,8
2023/10/27,"P a y P a y   町 か ど 酒 場 XXXX ",950,2
2023/10/28,"P a y P a y   町 か ど 酒 場 XXXX ",2700,5
2023/10/29,"P a y P a y   ハ リ ケ ー ン ",3020,1
2023/10/29,"P a y P a y   町 か ど 酒 場 XXXX ",500,1
2023/10/4,"P a y P a y   町 か ど 酒 場 XXXX ",3200,6
2023/10/6,"P a y P a y   XXXX   D i n i n g ",1900,1
2023/10/7,"P a y P a y   町 か ど 酒 場 XXXX ",2150,4
2023/10/8,"P a y P a y   町 か ど 酒 場 XXXX ",2700,6
2023/10/9,"P a y P a y   町 か ど 酒 場 XXXX ",1900,4
2023/9/30,"ヤ フ ー ジ ャ パ ン ",508,1

店名は一応マスクしてます。
他の飲み屋の決済もありますが先月の集計です。

町かど酒場が例の立ち飲み屋です。 
うーん、なかなか通ってますねw

長居して4000円周辺の回が何回かありますね。
これが良くなかったんだな。
フードも入ってるけど1件で7-8回注文してるのでこれも減らさねば。

記事執筆前にpythonでどうにかしようとウンウン唸っていたのですがSQLで一発でした。
SQL文は優秀ですねえ。


日付でソートしたかったのですが上手く並んでいませんね。
日付がTEXT型しかないのは知っていますがISOフォーマットじゃないと日付と認識しないようでこれでは型の変換もできないのでどこかで変換を噛まさないといけませんね。

とりあえず目的の出力は果たせました。
今回はここまでで次回pythonから呼んでみたいと思います。