お金の健康

Pythonでエクセルの家計簿を自動処理するプログラムを作った話

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

今回はPythonを使って、エクセルの家計簿を自動処理するプログラムを作った話をします。

Pythonってなに?という人は、こちらのサイトをご覧ください。

(参考:Pythonってなに?

バージョン2はこちら

家計簿の処理を自動化したい!

ウチダ家は共働きで、「自分で稼いだお金は自由に使うべき」という考えのもと、財布は別々に管理しています。

ただ、生活費は平等に負担したいので、お互いのスマホで家計簿をつけて、月末に生活費を計算しています。

家計簿アプリMoney Managerは、家計簿をエクセルで出せます。

そのエクセルファイルをスマホからPCに移してファイルの統合、生活費の計算などを行っています。

図1 ウチダ家の家計簿処理フロー

家計簿のデータはこんな感じです。

表1 家計簿のデータ

月末のエクセルの処理を書き出すと、こんな感じです。

表2 月末の家計簿処理

結構大変だよね〜、いつも30分かかってるし。

実際、月末に家で30分かけて家計簿を処理するのって、しんどいと思いまして。

手間を減らしたいと考え、今回Pythonで自動化することにチャレンジしました。

Pythonって、プログラミングでしょう?
勉強は大変じゃなかったの?

家計簿のプログラムは本1冊とYoutube2本でできた!

図2 Python

勉強してみたら意外と楽しくて、ハマりましたよ〜。

プログラムの基本的な書き方は、初心者向けの本を1冊買って読みました。

あとは、YouTubeで「Python tutorial」と検索して、外国人の解説動画を真似しました。

言葉はわからないけど、「こう書いたら」「こうなる」の関係を見て、自分の家計簿にどう使えるのか考えました。

簡単なエクセル処理なら、1ヶ月未満でプログラミングできますよ。

そうなんだ〜。
どんなプログラムを作ったの?

エクセルの操作内容をプログラムで書いていく感じです。

ぼくの復習も兼ねて、プログラムを紹介します。

プログラムの内容

プログラムはテキストエディタ(メモ帳)に書いて、ファイル名をkakeibo.pyにしました。

最後を「.py」とすることで、Pythonで動かすことができます。

No1 エクセルを読み取る、No2 支払い者を記入する

最初にimport pandasと書きます。

pandasは、pythonでエクセルを扱うのに便利なツールです。

as pdと書くことで、pandasをpdと表現して扱うと宣言しています。

次にエクセルを読み取ります

hiroは、ぼくが決めた変数の名前です。

pd.read_excel(‘hiro.xlsx’)と書くことで、hiro.xlsxというエクセルファイルを読み取ります。

これでhiroの中にhiro.xlsxのデータが入ることになります。

同じく、misa、creditにも同様の操作をします。

ちなみに、最初に#をつけると、その一文はコメントとして扱われ、どんなコードを書いたのか説明を書くことができます。

次に支払い者の記入です。

hiro[‘payer’] = ‘hiro’は、hiro.xlsxにpayerというカラムを作り、そこにhiroと記入する操作です。

同じく、misa.xlsxにもpayerのカラムを作り、misaと記入する操作をしています。

これでお互いの家計簿のエクセルに支払い者の名前を記入できます。

No3エクセルを統合する

dfは、ぼくが決めた変数の名前です。

pd.concatは、pandasのconcatというエクセルを統合するコードです。

hiro、misa、creditには、それぞれhiro.xlsx、misa.xlsx、credit.xlsxが入っているので、この3つのエクセルを統合することができます。

エクセルの統合って、これだけでできるの?
短くていいね〜。

No4 空欄を削除する

次に空欄を削除します。

なんで空欄を削除するの?

合計金額の計算をするときに、空欄があるとエラーが出るんです。

その場合、空欄を埋めるか、空欄を削除する必要があります。

今回は、空欄を削除して対応しました。

家計簿のエクセルデータ(df)は、金額が1列に並んでいるシンプルなデータなので、df.dropna()と書くだけで空欄を削除できます。

これをdfという変数に上書きすることで、dfは空欄のない統合データになります。

No5 統合したエクセルファイルを保存する

エクセルファイルの保存は、df.to_excel(‘ファイル名.xlsx’)でできます。

indexは、行番号です。

index=Trueにすると、図のように行番号が作成されます。

行番号は要らないので、ぼくはindex=Falseと書いて、行番号を表示しないようにしました。

これで家計簿のデータを統合したエクセルファイルができたんだよね?
どんな感じになったの?

統合したエクセルファイルはmerge_data.xlsxで保存されています。

開くとこんな感じです。

合計の欄が金額になっていて、プラスが収入、マイナスが支出になっています。

エクセルの統合ができたので、次に収入、支出、収支を計算します。

No6 収入、支出、収支の計算をする

df.loc[ ]が、家計簿データの中から[ ]内の条件に当てはまるものを取り出すコードです。

収入を把握したいので、家計簿の「収入/支出」の項目のうち「収入」と書かれているものを取り出します。

これがdf[‘収入/支出’] == ‘収入’というコードに当たります。

取り出したデータはget_dfという、ぼくが決めた変数に入れます。

次に収入の金額を計算します。

get_dfのデータから、金額の値を足し算します。

これがget_df[‘合計’].sum()というコードに当たります。

合計金額をget_moneyという、ぼくが決めた変数に入れます。

get_moneyに収入の合計金額が入っているってことよね?
いくらになるのか、表示したらわかるの?

print()というコードを使えば、変数の中身を表示できますよ。

python kakeibo.pyと書いてプログラムを動かすと、こんな感じで表示されます。

費用も同じようなコードを書いて、pay_moneyに支出の合計金額を入れます。

そして、get_money(収入、プラス)とpay_money(支出、マイナス)を足して、収支を計算します。

ここがif文に当たるところです。

収支が0以上なら、「今月は黒字です」と表示します。

0未満、つまりマイナスなら「今月は赤字です」と表示します。

食費とか、日用品とか、それぞれどのくらいお金がかかっているのか見るにはどうするの?

No7 各項目ごとに金額を見る。

各項目を見るためには、リストとfor文の組み合わせを使います。

listは、ぼくが決めた変数で、ここに食費、日用などの分類したい項目を入れます。

次にfor文で繰り返し処理します。

for i in listは、list内にある各項目を1つずつiに入れて、先頭にスペースを開けたコード(48行目〜51行目)を実行します。

例えばi=’食費’のとき、次の処理を行います。

48行目:家計簿データのメモ列にi(=’食費’という文字)が含まれているものを取り出し、each_dfに入れる。

49行目:each_dfの内容を表示する。

50行目:「i(=’食費’)の小計:」と表示する。

51行目:each_dfのデータから、金額の合計を計算して、結果を表示する。

ここまで終わったら、次にi=日用に変更して、48行目〜51行目の処理を再び行います。

プログラムを起動すると、このように表示されます。

便利だね〜。
弱点とかあるの?

やっぱり表記揺れに弱いです。

例えば、「立て替え」を「たてかえ」「建て替え」などと書いてしまうと、プログラムで処理できません。

このプログラムを使うなら、家計簿のつけ方を決める必要があります。

家計簿のつけ方は意識しておくね。
生活費の折半と、立て替えたお金の処理はどうするの?

No8 割り勘、立て替え分のお金を計算する

生活費の折半は、家計簿の項目に「○」と付けたもの(list[11])にしました。

立て替えた分のお金は、家計簿の項目に「立て替え」と付けたもの(list[12])にしました。

「○」、「立て替え」は46行目のlistの中で、0から数えてそれぞれ11番めと12番めに当たります。

さらにpayerをhiroか、misaかという条件を加えて、割り勘と立て替え分のお金を計算しました。

67行目〜70行目で、hiroとmisaのどちらが多くお金を払っているか計算しています。

そして72行目〜79行目で支払額を計算して、どちらがいくら支払うのか表示するコードにしています。

ここまでで家計簿処理のプログラムは出来上がったんだよね?
処理にどのくらい時間かかるの?

家計簿のエクセルファイルをスマホからPCに移したら、処理は1秒で終わりますよ。

30分が1秒に短縮できたんだね!
よかったね〜。

まとめ

家計簿という簡単な構造のExcelファイルなら、Pythonで自動処理できることを紹介しました。

目的を持ってプログラミングを始めると、楽しみながら勉強ができてとてもよかったです。

ぜひ妻にも興味を持ってもらえるように説得を・・・!

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

家計簿バージョン2はこちら

-お金の健康