時系列データのpandasでの処理方法
pandasやscikit-learnのビデオ講義でこんなものがある。
Python Programming Tutorials
Python Programming tutorials from beginner to advanced on a mpythonprogramming.net
Udacityにパクられて怒っていたビデオがあって笑ったが、Jupyterでうちながらの解説はフランクで良い。(scikit-learnの解説ビデオをみていたら、R^2は0以上だと言っていた。プログラミングは上手そうだが、理論はわかっていないようなので、注意を要する。有償で教えていている日本の深層学習や統計のビデオも同様だが。。。)
ただし余り綺麗なコードではない。時系列データの解析はよくやるので、自分はこう書くよというのをOR学会誌で紹介したことがあるので、それにならって、pandasらしく高速に時系列データを可視化する方法を紹介する。(より詳しくし知りたい人はORのバックナンバーを探してみてください。)
例に使うのはアボガドの例題でKaggleから落としてくる必要がある。
Avocado Prices
Historical data on avocado prices and sales volume in multiplwww.kaggle.com
まずはデータを読み込み,Date列を日付型に変換し、インデックスにする。
import pandas as pd
df = pd.read_csv("avocado.csv")
df["Date"] = pd.to_datetime(df["Date"])
df.set_index("Date", inplace=True)
ここまでは同じだが、私の場合にはpivot_tableを使う。行を日付、分析したいregionを列にして、値は平均価格に設定する。生成したデータフレームを1日単位でリサンプルして合計し、NaNを0で置換すれば出来上がりだ。
pt = pd.pivot_table(df, index="Date", columns=["region"], values ="AveragePrice")
resamp = pt.resample("1d").sum().fillna(0)
このままプロットしても良いが、移動平均をとってから描画するとこんな感じになる。(最初の12日がNaNになるので、それをdropnaで消す。)
rolling = resamp.rolling(12).mean().dropna()
%matplotlib inline
rolling.plot.line(legend=False)
実際問題では、解析したい軸が複数ある場合があるが、それらは全て列に入れる。例えば、regionとtypeの2つを列にするとmulti-indexの列になる。
pt = pd.pivot_table(df, index="Date", columns=["region","type"], values ="AveragePrice")
これを切り出して使うのは、xsを使う。以下では、regiionが”Albany”のものを切り出してから、1週間でリサンプリングしてプロットしている。冒頭にあげたのがこの図だ。
pt.xs("Albany", level="region", axis=1).sum(axis=1)