Python お金の健康

Pythonで家計簿を自動処理するプログラムを作った話【プログラム付き】

こんにちは、ウチダです。

休日に趣味でプログラミングを独学し、
家計簿や顧客リストの作成、ブログでの
データ分析に役立てています。
 
副業ではFXの自動売買プログラムを販売しています。

「家計簿をつけるのってめんどくさい」

「Pythonで自動化できないかな」

と悩んでいませんか?

実は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でGmailに送信した
PythonでGmailに自動送信した。

警告文があり、怪しいメールになってしまいましたが、

無事にPythonで家計簿の処理結果をメールできました。

あとは妻から入金を待つだけです←


Pythonはデータ処理に強みがある

プログラミング言語です。

中でも家計簿は最も身近で、

かつ生活に役立つ教材です。

ぜひプログラミング言語Pythonに挑戦してみませんか?

これからの習い事は家でプログラミングですね。

ここまで読んでくださり、ありがとうございました。^^

-Python, お金の健康
-