見出し画像

時系列データのpandasでの処理方法

pandasやscikit-learnのビデオ講義でこんなものがある。

Udacityにパクられて怒っていたビデオがあって笑ったが、Jupyterでうちながらの解説はフランクで良い。(scikit-learnの解説ビデオをみていたら、R^2は0以上だと言っていた。プログラミングは上手そうだが、理論はわかっていないようなので、注意を要する。有償で教えていている日本の深層学習や統計のビデオも同様だが。。。)

ただし余り綺麗なコードではない。時系列データの解析はよくやるので、自分はこう書くよというのをOR学会誌で紹介したことがあるので、それにならって、pandasらしく高速に時系列データを可視化する方法を紹介する。(より詳しくし知りたい人はORのバックナンバーを探してみてください。)

例に使うのはアボガドの例題でKaggleから落としてくる必要がある。

まずはデータを読み込む。

import pandas as pd
df = pd.read_csv("avocado.csv")

次に、Date列を日付型に変換し、インデックスにする。

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).resample("1w").mean().plot()




この記事が気に入ったらサポートをしてみませんか?