こんにちは、snuowです。
時系列データの傾向を見る場合に、ヒートマップを作る場合があるかと思います。
エクセルでヒートマップを作るとなると、時系列データを並べなおしたり、カラースケールを設定したり、面倒なことが多いですよね。
そんな時に、pandasとplotlyを使用すれば簡単にヒートマップを作ることができます。
こんな感じのグラフ(ヒートマップ)ができます。

plotly.expressで動くヒートマップ(heatmap)を作る
読み込むデータ
今回読み込むデータは、下記のデータを読み込みます。サンプルのデータですので、いろいろな時系列データで応用が利くと思います。

SampleCode
下記のコードで実装できます。./sample.csv
を適宜変更して、それぞれの時系列データに名称などを合わせてもらえれば他のデータでも応用が利きます。
# ライブラリの読み込み import pandas as pd import plotly.express as px # csvを読み込んでデータフレームに変換する df = pd.read_csv('./sample.csv',encoding='shift-jis',index_col=[0],parse_dates=[0]) # データフレームを1時間の合計値にリサンプリングする。 df = df.resample('h').sum() # date/hour列を追加する df['date'] = df.index.strftime('%Y/%m/%d') df['hour'] = df.index.hour #pivotを使って、テーブルデータを作成 pivot_df = df.pivot(index='hour',columns='date',values='電力量') # グラフの描画 fig = px.imshow(pivot_df,y=pivot_df.index,x=pivot_df.columns,aspect='auto',color_continuous_scale=px.colors.sequential.Aggrnyl) fig.show(config=dict(editable=True))
解説
まずは、ライブラリを読み込んでcsvデータをデータフレームとして読み込みます。
pandasはデータ処理用のライブラリで、plotly.express
は散布図描画用のライブラリです。pandasのread_csv
を用いてデータを読み込みます。
# ライブラリの読み込み import pandas as pd import plotly.express as px # csvを読み込んでデータフレームに変換する df = pd.read_csv('./sample.csv',encoding='shift-jis',index_col=[0],parse_dates=[0])
使用したデータが15分データなので、resample('h').sum()
で1時間の合計値データにしています。加えて、date列とhour列をデータフレームに追加しています。
date列、hour列は、それぞれデータフレームのindexからデータを作成しています。
# データフレームを1時間の合計値にリサンプリングする。 df = df.resample('h').sum() # date/hour列を追加する df['date'] = df.index.strftime('%Y/%m/%d') df['hour'] = df.index.hour
データフレームを.pivot()
で、index=hour,column=date,value='電力量'
のマトリクスデータにします。
#pivotを使って、テーブルデータを作成 pivot_df = df.pivot(index='hour',columns='date',values='電力量')
実際に、どんなデータになっているかというと下記のようになっています。

グラフの描画は、px.imshow
を使用します。
# グラフの描画 fig = px.imshow(pivot_df,y=pivot_df.index,x=pivot_df.columns,aspect='auto',color_continuous_scale=px.colors.sequential.Aggrnyl) fig.show(config=dict(editable=True))
いかがだったでしょうか。このようにヒートマップを作ることで、時期ごとの傾向を色で判断できるため、データを確認する際に有効だと思います。また、エクセルと異なり、読み込むデータフレームを変更すれば別のデータもすぐにヒートマップにすることができるので、データ分析の際にも有効かと思います。
コメント