前回の記事で作成した、家計簿へ登録未のcsvファイルに食費などのカテゴリを追加します。
これで、家計簿へ登録するのに必要なデータが完成します。
この記事でわかること
csvファイルを読み込んでできたlistにカラム(新規要素)を追加追加します。
今回使用するのは下記のとおりです。
- pandasでcsvを読み込む
- numpyでdataframeをlistに変換する
- リストにデータを新規追加する(append)
フロー
正直なところ、フローを書くほどのものでもありませんが一応記載します。
カテゴリ分けの部分は「とにかく動けば良い」という方針で、条件分岐をひたすら書き続けるゴリ押し仕様です。
将来的にはAIで判定できるようにしたいと思っています。
金額と店名でカテゴリ判定をする理由は、ApplStoreへ支払ったものの対策です。
iCloudや少年ジャンプのサブスクは、明細の店名が全てAppStoreになっているため金額しか判断材料がありませんでした。
今のところこれで問題ありませんが、例えばAppleMusicとiCloudが同じ金額で請求されるとカテゴリの分け方を再考しないといけませんね。
プログラム
プログラムを記載します。カテゴリ分けの条件分岐は一部だけ抜粋しています。
# coding:utf-8
import pandas as pd
import csv
import datetime
def main():
# 今の日付取得
yyyymm = datetime.date.today()
# 読み込むcsvファイルパス
filePath = './diff.csv' #前回の記事で出力したファイル
addCategory(filePath,yyyymm)
def addCategory(filePath,yyyymm):
# ①csvファイル読み込み
rakuten = pd.read_csv(filePath,dtype=str)
_rakuten = rakuten.values.tolist() #②dataframeをnumpyを使ってlistに変換
newCsv = [] #カテゴリ追加後のlist
for i in range(len(_rakuten)):
date = _rakuten[i][0]
itemName = _rakuten[i][1] # 利用店名・商品名
payment = _rakuten[i][4] # 利用金額
category = '' #_rakuten[i][index-1] #カテゴリ
if('スマ-トイ-エツクス' in itemName):
#print(_rakuten[i])
category = '0301' #交通費
#APPLE
elif('APPLE' in itemName):
#print(_rakuten[i])
if(payment == '130'): #金額が130の場合iCloud
category = '0508'
elif(payment == '960'): #金額が960の場合ジャンプ
category = '0505'
else:
category = '1505' #上記以外の金額は未分類にする
elif('食料品' in itemName):
#print(_rakuten[i])
category = '0101' #食費
else:
category = '1505' #未分類
newCsv.append([date,itemName,payment,category]) #③カテゴリをリストへ追加
#csvに書き出し
fName = 'rakuten-card_'+ yyyymm.strftime('%Y%m%d') + '.csv'
header = ["利用日","利用店名・商品名","利用金額","カテゴリ"] #出力するcsvのヘッダ
with open(fName, 'w') as file:
writer = csv.writer(file, lineterminator='\n')
writer.writerow(header)
writer.writerows(newCsv)
main()
さいごに
今回は、条件分岐でゴリ押すだけで難しいことはやりませんでした。
フローの部分でも書きましたが、この大量の条件分岐をAI化したい思いはあります。ただ、表記ゆれ等の前処理がめんどくさくて手がつかない状態です。
最後までご覧いただきありがとうございました。
次回はseleniumを使ってweb版の家計簿アプリへ自動入力していきます。
コメント