Как использовать Python Pandas в стек? - PullRequest
0 голосов
/ 09 июня 2018

Я ссылаюсь на информацию в Интернете.

Я хотел бы нарисовать свои данные.

        id        time           w
5630    39  2018-03-01  841.704067
5631    39  2018-03-02  605.119444
5632    39  2018-03-03  651.337735
5633    39  2018-03-04  595.974252
5634    39  2018-03-05  656.031315
5635    39  2018-03-06  972.101045
5636    39  2018-03-07  660.659986
5637    39  2018-03-08  1225.648122
        .
        .
5685    39  2018-04-25  699.347653
5686    39  2018-04-26  516.267288
5687    39  2018-04-27  621.807574
5688    39  2018-04-28  488.903030
5689    39  2018-04-29  790.637525
5690    39  2018-04-30  457.569811
5691    40  2018-03-01  157.636364
5692    40  2018-03-02  138.759563
5693    40  2018-03-03  209.213996
5694    40  2018-03-04  177.255571
5695    40  2018-03-05  155.696106
        .
        .
5748    40  2018-04-27  133.512968
5749    40  2018-04-28  157.630623
5750    40  2018-04-29  210.996613
5751    40  2018-04-30  120.643963

Мой ссылочный URL

Я выполняю это:

fig, ax = plt.subplots(figsize=(15,7))
df2.groupby(['time','id']).count()['w'].unstack().plot(ax=ax)

Но мой результат странный.

enter image description here

Я хотел бы нарисовать так:

Я просто вырезал свой образец, но я хочу нарисовать все сразу.Перекрытие или в одиночку.

enter image description here

Как добиться аналогичных результатов ниже.

enter image description here

Мне очень нужна твоя помощь. Большое спасибо.

1 Ответ

0 голосов
/ 09 июня 2018

Все работает хорошо, но для образца данных 1, потому что groupby по столбцам time и id и для каждой пары получают размер групп 1:

print (df2.groupby(['time','id']).count()['w'])
time                 id
2017-04-03 18:09:04  39    1
2017-04-03 18:16:04  39    1
2017-04-03 18:23:04  39    1
2017-04-03 18:30:04  39    1
2017-04-03 18:37:04  39    1
2017-04-03 18:44:04  40    1
2017-04-03 18:51:04  40    1
2017-04-03 18:58:04  40    1
2017-04-03 19:05:04  40    1
2017-04-03 19:12:04  40    1
Name: w, dtype: int64

Тогда преобразованный вывод будет DataFrame с 2 столбцами, заполненными 1 и NaN s для значений, которые не существуют в парах:

df = df2.groupby(['time','id']).count()['w'].unstack()
print (df)
id                    39   40
time                         
2017-04-03 18:09:04  1.0  NaN
2017-04-03 18:16:04  1.0  NaN
2017-04-03 18:23:04  1.0  NaN
2017-04-03 18:30:04  1.0  NaN
2017-04-03 18:37:04  1.0  NaN
2017-04-03 18:44:04  NaN  1.0
2017-04-03 18:51:04  NaN  1.0
2017-04-03 18:58:04  NaN  1.0
2017-04-03 19:05:04  NaN  1.0
2017-04-03 19:12:04  NaN  1.0

Если значения являются только датамипоэтому нужно Grouper на 7d для недели или MS для начала месяца вместо time столбцов (также добавлен параметр fill_value=0 для замены NaN s на 0):

df = df2.groupby([pd.Grouper(freq='7d', key='time'),'id'])['w'].count().unstack(fill_value=0)
print (df)
buildingid  39  40
reporttime        
2018-03-01   7   5
2018-03-08   1   0
2018-04-19   1   0
2018-04-26   5   4

Итак, наконец, ваш код выглядит так:

fig, ax = plt.subplots(figsize=(15,7))
df2.groupby([pd.Grouper(freq='7d', key='time'),'id'])['w'].count().unstack(fill_value=0).plot(ax=ax)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...