pandas 時系列データの扱いは日付のインデックス化が便利

プログラミングpandas,Python

どうも、Econです。

今日はプログラミングについて、私の備忘も兼ねての記事ですが、投資や家計管理に興味がある人はpandasを使って時系列データを扱うこともあると思いますので、その参考になれば幸いです。

日付のインデックス化

例えば下のように日付、大項目、中項目、小項目、金額の列に分かれたエクセルがあるとします(No. 列は並び替えで必要なだけでここでは無視)。

エクセルではsumifs関数などを使いますが、pandasでこれをデータフレームとして読み込む時は日付をインデックス化すると便利なことが多いです。

まず、日付をインデックス化せずにそのまま読み込むと

import pandas as pd
import_file = 'kakeibo.xlsx'
excel_sheet_name_01 = 'CashInAndOut'

#indexの指定なし(自動設定)
df_cash_master = pd.read_excel(import_file, sheet_name=excel_sheet_name_01)
df_cash_master.head(2)

というように、0, 1, …とインデックスが自動で振られていき、データ型を見ると’Date"列が独立していることがわかります。

一方、日付をインデックス化して読み込むと

#indexにdatetime型を指定する
df_cash_master['Date'] = pd.to_datetime(df_cash_master['Date'])
df_cash_master = df_cash_master.set_index('Date')
df_cash_master.head(2)

となり、上で振られた0, 1, …がなくなり、代わりにDate列がインデックス化しています。
データ型を見ても、Date列はなくなっており、ここからもDateがインデックス化していることがわかります。

 

日付インデックス化のメリット

日付をインデックス化しないと、例えば月ごとの合計を出す場合などはif文などで条件分岐が必要になりますが、日付をインデックス化するとresampleメソッドなどが使えるようになり、そうなると期間を指定した統計量が扱いが楽になります。

例えば、各月の合計値を出す時はresampleメソッドで’M’を指定すれば、一行で各月の合計を出せます。

#各月の合計を出す
print(df_cash_master.resample('M').sum())

エクセルとPython

これまでエクセルのヘビーユーザーで、投資や家計管理は全てエクセルでやってきました。
しかしPythonを使うようになってから、Pythonで出来てエクセルで出来ないことは結構あるけど、その逆は殆どない、と感じています。

エクセルには手軽に入力できるという大きなメリットがありますが、Pythonはコードを書けば自動化出来るので、最初は大変でも、特にグラフ描画などはPythonを使えば長期的にはかなり省力化できそうです。

家計簿や運用管理はデータを可視化してそこから改善を見つけていくことがキモなので、Pythonを使って可視化の手間を減らし、その時間を分析に充てて改善を目指します。


人気ブログランキング
最後まで読んで下さりありがとうございます。

面白かったらフォローしてもらえると励みになります。



Posted by Econ