시계열 및 집계 값이있는 누적 막대 차트를 만드는 방법

Nov 25 2020

Pandas 데이터 프레임에서 누적 막대 차트 시계열을 만드는 데 어려움이 있습니다 (아래 이미지). x 축에는 '날짜', y 축에는 '시간', 각 막대는 '범주'에서 각 그룹과 함께 보낸 시간을 표시하고 싶습니다.

Pandas-Groupby 기능을 사용해야합니까? 데이터 프레임은 샘플입니다. 2018 년부터 2020 년까지 수백 행의 데이터가 있습니다.

답변

3 TrentonMcKinney Nov 25 2020 at 07:35
  • 하나가 솔루션 에 대한 시계열 데이터를 누적 막대 그래프 - 팬더
    • 이 질문의 문제는 OP가 데이터를 집계하지 않으므로 솔루션 이이 질문에 대해 작동하지 않는다는 것입니다.
  • pandas.DataFrame.groupby에 집계 하는 동안 'date''group'에서 사용.sum'time'
    • .dt추출기만을 추출하는 데 사용된다 .date의 요소 'date'열.
    • 특정 확인 'Date'하여 dataframe의 열이 제대로으로 포맷 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()