時系列と集計値を使用して積み上げ棒グラフを作成する方法

Nov 25 2020

Pandasデータフレーム(下の画像)から積み上げ棒グラフの時系列を作成するのに問題があります。x軸に「日付」、y軸に「時間」、各バーに「カテゴリ」の各グループで費やされた時間を表示したいと思います。

Pandas-Groupby関数を使用する必要がありますか?データフレームはサンプルです。2018年から2020年までの数百行のデータがあります。

回答

3 TrentonMcKinney Nov 25 2020 at 07:35
  • パンダには1つの解決策があります-時系列データを含む積み上げ棒グラフ
    • その質問の問題は、OPがデータを集約していないため、この質問の解決策が機能しないことです。
  • に集約しながらpandas.DataFrame.groupby'date'とを使用します'group'.sum'time'
    • .dt抽出のみを抽出するために使用される.date成分'date'カラム。
    • 特定のことを確認してください'Date'あなたのデータフレームの列が正しくとしてフォーマットされdatetime dtypeて、df.Date = pd.to_datetime(df.Date)
  • グループ化されたデータフレーム、dfgは、を使用して実行できる正しい形式に整形する必要がありますpandas.DataFrame.pivot
  • 棒グラフを積み上げる最も簡単な方法はpandas.DataFrame.plot.barstackedパラメータを使用して使用することです。
    • pandas.DataFrame.plotすべてのパラメータについてはを参照してください。
import pandas as pd
import matplotlib.pyplot as plt
import random  # for test data
import numpy as np  # for test data

# setup dataframe with test data
np.random.seed(365)
random.seed(365)
rows = 1100
data = {'hours': np.random.randint(10, size=(rows)),
        'group': [random.choice(['A', 'B', 'C']) for _ in range(rows)],
        'date': pd.bdate_range('2020-11-24', freq='h', periods=rows).tolist()}
df = pd.DataFrame(data)

# display(df.head())
   hours group                date
0      2     C 2020-11-24 00:00:00
1      4     B 2020-11-24 01:00:00
2      1     C 2020-11-24 02:00:00
3      5     A 2020-11-24 03:00:00
4      2     B 2020-11-24 04:00:00

# use groupby on df
dfg = df.groupby([df.date.dt.date, 'group'])['hours'].sum().reset_index()

# pivot the dataframe into the correct format
dfp = dfg.pivot(index='date', columns='group', values='hours')

# display(dfp.head())
group        A   B   C
date                  
2020-11-24  49  25  29
2020-11-25  62  18  57
2020-11-26  42  77   4
2020-11-27  34  43  17
2020-11-28  28  53  23

# plot the pivoted dataframe
dfp.plot.bar(stacked=True, figsize=(10, 6), ylabel='Hours', xlabel='Date', title='Sum of Daily Category Hours')
plt.legend(title='Category', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()

  • 毎日バーがあります。これが棒グラフの目盛りの仕組みであるため、日付が多い場合はプロットが非常に広くなる可能性があります。
  • 使用を検討してください pandas.DataFrame.barh
dfp.plot.barh(stacked=True, figsize=(6, 10), title='Sum of Daily Category Hours')
plt.legend(title='Category', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.xlabel('Hours')
plt.ylabel('Date')
plt.show()

  • OPは、2018年から2020年までのデータがあると述べています。つまり、700日以上のデータが存在する可能性があり、これは棒グラフの700を超える棒に相当します。
  • データを適切に視覚化するには、標準の折れ線グラフが最適なオプションです。
dfp.plot(figsize=(10, 6))
plt.show()