koji/メガネ男の日誌

日々の学び、活動状況を記録します。仕事のことは少なめ。

pythonで通年の時系列データを各年度ごとのグラフにするときに便利なテクニック

f:id:kj_man666:20200415081944j:plain

for 文と groupby()でDataFrameから、指定したキーワード1カラムと、残りのDataFrameを交互に抽出することで、

タイトルどおり、pythonで通年の時系列データを各年度ごとのグラフにするときに便利なテクニックを学びましたのでまとめます。

参考 kaggle の M5コンペ U.takahiro さんのNotebook より

www.kaggle.com

前提

使う元々の表

f:id:kj_man666:20200410204745p:plain

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]
                    }
                )

加工前の表です。 f:id:kj_man666:20200415082454p:plain

そしてこれを一旦グラフ化しやすい表に修正します。

詳しくは前のブログで触れています。

megane-man666.hatenablog.com

# 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)

これで前提となる表が出来ました。

f:id:kj_man666:20200415085140p:plain

グラフ化すると、通年のグラフが表示されます。

f:id:kj_man666:20200415085206p:plain

ここからが本題ですが、これを各年度ごとのグラフにしてみましょう。

# 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 をタイトルに指定することで、各グラフのタイトルに年度を入れることもできます。

f:id:kj_man666:20200415084551p:plain

f:id:kj_man666:20200415084604p:plain

f:id:kj_man666:20200415084614p:plain

f:id:kj_man666:20200415084626p:plain

f:id:kj_man666:20200415084638p:plain

f:id:kj_man666:20200415084649p:plain

以上になります、最後までお読みいただきありがとうございました。