Гистограмма группы графиков с Matplotlib или Seaborn с указателем даты и времени в Python - PullRequest
1 голос
/ 27 марта 2020

У меня есть Pandas DataFrame, который состоит из столбца даты и интересующего столбца категории. Я хотел бы видеть количество частот для каждого месяца. Когда я сделал это с помощью matplotlib, я получил что-то, что выглядит довольно плохо.

Вот как выглядит кадр, сгруппированный по месяцам:

df.resample("M")["category_col"].value_counts(normalize=True).mul(100)

Output

date                         category_col      
2019-12-31  A                41.929004
            B                25.758765
            C                17.752111
            D                9.189919
            E                3.625122
            F                1.745080
2020-01-31  A                54.052744
            C                16.347271
            B                14.414431
            D                11.677537
            E                2.675607
            F                0.832411
2020-02-29  A                48.928468
            D                22.011116
            C                14.084507
            C                11.729162
            E                2.193272
            F                1.053475
2020-03-31  A                54.435410
            D                15.718065
            C                14.577060
            B                11.335682
            E                2.884205
            F                1.049578
Name: category_col, dtype: float64

Вот какова моя попытка

df.date = pd.to_datetime(df.date)
df.set_index("date", inplace=True)
df.resample("M")["category_col"].value_counts(normalize=True).mul(100).plot(kind="bar")

См. Вывод ниже:

enter image description here

Вот что я хочу:

enter image description here

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Прежде всего, чтобы получить название месяца, сбросьте индекс и выберите нужные столбцы:

df['month'] = df['date'].apply(lambda x: pd.Timestamp(x).strftime('%B'))

df = df.reset_index()

df = df[['month','category_col','value]]

Затем, предполагая, что у вас есть фрейм данных (называемый df ) вот так:

month       category_col     value      
September   A                41.929004
September   B                25.758765

Выполните следующие действия, чтобы получить искомый участок, используя Seaborn:

import seaborn as sns 
ax = sns.barplot(x="month", y="value", hue="category_col", data=df)
1 голос
/ 27 марта 2020

Я думаю, вам нужно Series.unstack с rename для формата даты и времени month name year:

df.date = pd.to_datetime(df.date)
df = df.set_index("date")

s = df.resample("M")["category_col"].value_counts(normalize=True).mul(100)

s.unstack().rename(lambda x: x.strftime('%B %Y')).plot(kind="bar")

Образец:

print (s)
date        category_col
2019-12-31  A               41.929004
            B               25.758765
            C               17.752111
            D                9.189919
            E                3.625122
            F                1.745080
2020-01-31  A               54.052744
            C               16.347271
            B               14.414431
            D               11.677537
            E                2.675607
            F                0.832411
2020-02-29  A               48.928468
            B               22.011116
            C               14.084507
            D               11.729162
            E                2.193272
            F                1.053475
2020-03-31  A               54.435410
            D               15.718065
            C               14.577060
            B               11.335682
            E                2.884205
            F                1.049578
Name: A, dtype: float64

print (s.unstack())
category_col          A          B          C          D         E         F
date                                                                        
2019-12-31    41.929004  25.758765  17.752111   9.189919  3.625122  1.745080
2020-01-31    54.052744  14.414431  16.347271  11.677537  2.675607  0.832411
2020-02-29    48.928468  22.011116  14.084507  11.729162  2.193272  1.053475
2020-03-31    54.435410  11.335682  14.577060  15.718065  2.884205  1.049578

print (s.unstack().rename(lambda x: x.strftime('%B %Y')))
category_col           A          B          C          D         E         F
date                                                                         
December 2019  41.929004  25.758765  17.752111   9.189919  3.625122  1.745080
January 2020   54.052744  14.414431  16.347271  11.677537  2.675607  0.832411
February 2020  48.928468  22.011116  14.084507  11.729162  2.193272  1.053475
March 2020     54.435410  11.335682  14.577060  15.718065  2.884205  1.049578
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...