Постройте несколько таймсерий на одном графике

Я хотел бы построить несколько временных рядов (по одному для каждого значения в столбце cat) на одном графике, но не работал, чтобы сделать это. Мой код на данный момент:

import numpy as np
import pandas as pd

dat = pd.date_range(start='1/1/2018', end='31/12/2018', freq='H')
num = ['A' + str(x).zfill(4) for x in range(len(dat))]
cat = np.random.choice(['A', 'B', 'C', 'D'], len(dat))

df = pd.DataFrame({'date': dat, 'num': num, 'cat':cat}).set_index('date')

print(df.groupby([pd.Grouper(freq='D'), 'cat']).count().unstack().fillna(0).astype(int))

Результат:

           num            
cat          A   B   C   D
date                      
2018-01-01   7   3   5   9
2018-01-02   6   3   6   9
2018-01-03  11   3   8   2
2018-01-04   2   6   5  11
2018-01-05   4   8   4   8
2018-01-06   8   8   3   5
2018-01-07   5   8   6   5
2018-01-08   3   8   5   8

Я хотел бы построить различные комбинации категорий (cat), например (A и B вместе или C и D вместе) на одном графике временного ряда с matplotlib или seaborn, но они «застряли» в многоуровневых индексах ...

Есть предложения, как выбрать разные комбинации столбцов и построить их? Может быть, есть способ лучше, чем unstack данные.


person Rene    schedule 24.07.2019    source источник
comment
Если вы используете pandas 0.24 + , вы можете добавить .droplevel(0, axis=1) в цепочку, чтобы избавиться от избыточных уровней индекса.   -  person Chris A    schedule 24.07.2019


Ответы (1)


Да, лучше избегать MultiIndex в столбцах:

df1 = df.groupby([pd.Grouper(freq='D'), 'cat'])['num'].count().unstack(fill_value=0)

Or:

df1 = df.groupby([pd.Grouper(freq='D'), 'cat']).size().unstack(fill_value=0)

Затем заговор:

df1[['A','B']].plot()
person jezrael    schedule 24.07.2019