pythonで通年の時系列データを各年度ごとのグラフにするときに便利なテクニック
for 文と groupby()でDataFrameから、指定したキーワード1カラムと、残りのDataFrameを交互に抽出することで、
タイトルどおり、pythonで通年の時系列データを各年度ごとのグラフにするときに便利なテクニックを学びましたのでまとめます。
参考 kaggle の M5コンペ U.takahiro さんのNotebook より
前提
使う元々の表
import pandas as pd df = pd.DataFrame( { "year":[2015, 2016, 2017,2018,2019,2020], 1:[100, 200, 300, 400,500,600], 2:[500,600,700,800,900,1000], 3:[300,900,1200,1500,1800,2100], 4:[400,800,1200,1600,2000,2400], 5:[50,100,150,200,250,300], 6:[150,300,450,600,750,900], 7:[80,160,240,320,400,480], 8:[1,4,9,16,25,36], 9:[33,66,99,132,198,231], 10:[20,40,80,160,320,640], 11:[5,10,15,20,25,30], 12:[25,50,75,100,125,150] } )
加工前の表です。
そしてこれを一旦グラフ化しやすい表に修正します。
詳しくは前のブログで触れています。
# for文とiloc を駆使して、1か月ごとに表を組み替え df2 = pd.DataFrame() for i in range(1,13): df3 = df.iloc[0 : ,[0 , i ]] df3["month"] = i df3 = df3.rename(columns={i:"mount"}) df2 = pd.concat([df2, df3]) df2["times"] = df2["year"].astype(str) + "/" + df2["month"].astype(str) +"/1" df2["times"] = pd.to_datetime(df2["times"], format="%Y/%m/%d") df2 = df2.sort_values("times") plt.plot(df2["times"], df2["mount"]) df2 = df2.loc[:,["times","year", "month", "mount"]] df2 = df2.reset_index().drop("index", axis=1)
これで前提となる表が出来ました。
グラフ化すると、通年のグラフが表示されます。
ここからが本題ですが、これを各年度ごとのグラフにしてみましょう。
# year に groupby()で指定した df2["year"]の要素が、 df_tmpに df2のdf2["year"]以外の要素が入ります。 # df2のdf2["year"]以外の要素をグラフ化し、x軸にdf2["times"]、y軸にdf2["mount"]を指定します。 for year, df_tmp in df2.groupby('year'): df_tmp.plot(x='times', y='mount', figsize=(15, 5))
これで各年ごとのグラフを作成することができます。
for 文の year をタイトルに指定することで、各グラフのタイトルに年度を入れることもできます。
以上になります、最後までお読みいただきありがとうございました。