こんにちは、ウチダです。
休日に趣味でプログラミングを独学し、
家計簿や顧客リストの作成、ブログでの
データ分析に役立てています。
副業ではFXの自動売買プログラムを販売しています。
「家計簿をつけるのってめんどくさい」
「Pythonで自動化できないかな」
と悩んでいませんか?
実はPythonで家計簿の処理を
自動化できるんです。
なぜこんなことが言えるかといえば
私が実際にPythonで家計簿の処理を自動化しているからです。
この記事ではPythonのコードをお見せしながら
家計簿の処理を自動化する方法を紹介します。
この記事を読み終えると、
Pythonでデータ処理する方法の基本が分かり、
仕事や投資にも応用できるようになります。

目次
Pythonで家計簿の処理を自動化させよう!データ処理の基本

内田家はお金の管理をそれぞれに分けています。
ただ、生活費は共通しているので、
家計簿をつけるときに割り勘しています。
内田家の家計簿スキームの詳細はこちら↓
家計簿の処理に時間がかかるので
プログラミング言語Pythonを使って
家計簿の処理を自動化しています。
Pythonで家計簿を自動処理した話はこちら↓
今回はバージョンアップしたので
新たなコードを紹介します。
改善点は以下です。
- 表示項目の順番を入れ替える。
- 区切り線を入れる。
- 処理が完了したらGmailで自動送信する。
これらを兼ね備えたPythonの家計簿プログラムを紹介します。
Pythonで家計簿のエクセルファイルを読み込んで統合する
#ライブラリのインポート
import pandas as pd
import datetime
#年月
date = datetime.date.today() - datetime.timedelta(days=15)
date_list = str(date).split('-')
mergefile = str(date_list[0]+date_list[1])
#ヒロのファイルを読み込む
hiro = pd.read_excel('hiro.xls')
hiro['payer'] = 'hiro'
#ミサのファイルを読み込む
misa = pd.read_excel('misa.xls')
misa['payer'] = 'misa'
#クレジットカード払いのデータを読み込む
credit = pd.read_excel('credit.xls')
credit['日付'] = date
#家計簿データの統合
df = pd.concat([hiro,misa,credit])
df = df.reset_index() #項番の振り直し
df.to_excel('merge_data{0}.xlsx'.format(mergefile),index=False) #保存
家計簿のデータは.xls形式で保存されています。
こちらをPythonに読み込んでもらい、
支払い者を入力したうえで統合しました。
ファイル名には年月を入れるようにしています。
最後に保存して、内田家の家計簿は完成です。
以降は分析作業になります。
Pythonで収入と支出を計算する
#収入の合計金額
get_df = df.loc[df['収入/支出'] == '収入']
get_money = get_df['合計'].sum()
#支出の合計金額
pay_df = df.loc[df['収入/支出'] == '支出']
pay_money = pay_df['合計'].sum()
#収入、支出、収支の表示
print('収入の合計:'+ str(get_money))
print('支出の合計:' + str(pay_money))
print('今月の収支:' + str(get_money + pay_money))
#赤字と黒字の判定
if (get_money + pay_money) >= 0:
kekka = '今月は黒字です'
else:
kekka ='今月は赤字です'
print(kekka)
print('-' * 10)
収入と支出、そして収支を計算して
今月が赤字か、黒字なのかを判定します。
収入はプラス、支出はマイナスの金額で表示されるので
収支は足し合わせるだけでOKです。
Pythonで割り勘の金額を確認する
#割り勘の計算
hiro_devide = df.loc[(df['メモ'].str.contains('わり')) & (df['payer'] == 'hiro')]
hiro1 = hiro_devide['合計'].sum()
misa_devide = df.loc[(df['メモ'].str.contains('わり')) & (df['payer'] == 'misa')]
misa1 = misa_devide['合計'].sum()
#立て替えの計算
hiro_back = df.loc[(df['メモ'].str.contains('立て替え')) & (df['payer'] == 'hiro')]
hiro2 = hiro_back['合計'].sum()
misa_back = df.loc[(df['メモ'].str.contains('立て替え')) & (df['payer'] == 'misa')]
misa2 = misa_back['合計'].sum()
#割り勘と立て替えの処理
pay1 = (hiro1 + misa1) / 2
pay2 = pay1 - misa1
pay3 = pay2 + misa2 - hiro2
if pay3 < 0:
kekka2 = 'misa→hiroに支払い:'+str(0 - pay3)
elif pay3 > 0:
kekka2 = 'hiro→misaに支払い:'+str(pay3)
else:
kekka2 = '支払いなし'
print(kekka2)
print('-' * 10)
内田家では割り勘したい項目には「わり」、
立て替えた項目には「立て替え」と
入力するルールがあります。
そうするとPythonで自動処理してくれるので、
計算がとっても楽になります。
Pythonで支払い項目を分析する
#項目
list = ['食費','日用','治療','交通','教育','葬祭','家賃','水光熱','ローン','通信','投資','わり','立て替え']
#メール本文用に空のリストを作成
each_data = []
#各項目の表示
for i in list:
each_df = df.loc[df['メモ'].str.contains(i)]
print(each_df)
each_data.append(each_df) #リストに追加
print(i + 'の小計:')
print(each_df['合計'].sum())
each_data.append('-' * 10)
print('-' * 10)
#メール本文用にデータを加工
kekka3 = ''
for j in each_data:
kekka3 += str(j) + '\n'
食費や交通費など、何にお金を使ったのか
表示します。
Pythonで家計簿の処理結果をメールする
#メール送信用のライブラリ
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import base64
from email.mime.text import MIMEText
from apiclient import errors
# 1. Gmail APIのスコープを設定
SCOPES = ['https://www.googleapis.com/auth/gmail.send']
# 2. メール本文の作成
def create_message(sender, to, subject, message_text):
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
encode_message = base64.urlsafe_b64encode(message.as_bytes())
return {'raw': encode_message.decode()}
# 3. メール送信の実行
def send_message(service, user_id, message):
try:
message = (service.users().messages().send(userId=user_id, body=message)
.execute())
print('Message Id: %s' % message['id'])
return message
except errors.HttpError as error:
print('An error occurred: %s' % error)
# 4. メインとなる処理
def main(i,mess,sbj):
# 5. アクセストークンの取得
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server()
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
# 6. メール本文の作成
sender = <'送り主のメールアドレスを入力する'>
to = i
subject = sbj
message_text = mess
message = create_message(sender, to, subject, message_text)
# 7. Gmail APIを呼び出してメール送信
send_message(service, 'me', message)
# 8. プログラム実行!
if __name__ == '__main__':
sbj = '''
{0}年{1}月の家計簿
'''.format(date_list[0], #年
date_list[1] #月
)
mess = '''
{0}年{1}月の家計簿\n
収入:{2}\n
支出:{3}\n
今月の収支:{4}\n
[5]\n
----------
夫婦勘定:{6}\n
----------
各項目\n
{7}
'''.format(date_list[0], #年
date_list[1], #月
str(get_money), #収入
str(pay_money), #支出
str(get_money + pay_money), #今月の収支
kekka, #赤字か黒字
kekka2, #割り勘
kekka3 #各項目の家計簿
)
to_list = [<送り先のメールアドレスをリスト形式で入力する>]
for i in to_list:
main(i,mess,sbj)
最後にPythonで家計簿の処理が完了したら
Gメールで私と妻に連絡します。
PythonでGmailを送信する時は
GmailAPIを有効化させる必要があります。
(参考:Gmail APIとPythonを使ってメール送信を自動化する方法 )
そして、メールの本文に家計簿の処理結果をのせて
送信させます。
送られた結果がこちらです。


警告文があり、怪しいメールになってしまいましたが、
無事にPythonで家計簿の処理結果をメールできました。
あとは妻から入金を待つだけです←
Pythonはデータ処理に強みがある
プログラミング言語です。
中でも家計簿は最も身近で、
かつ生活に役立つ教材です。
ぜひプログラミング言語Pythonに挑戦してみませんか?

これからの習い事は家でプログラミングですね。
ここまで読んでくださり、ありがとうございました。^^