Графы графического представления данных, сгруппированных по метке времени - PullRequest
0 голосов
/ 04 декабря 2018

Итак, у меня есть pandas dataframe, который имеет большое количество столбцов, и один из столбцов является меткой времени в формате datetime.Каждая строка в кадре данных представляет одно «событие».То, что я пытаюсь сделать, это график частоты этих событий с течением времени.В основном это простая гистограмма, показывающая, сколько событий в месяц.

Начинается с этого кода:

data.groupby([(data.Timestamp.dt.year),(data.Timestamp.dt.month)]).count().plot(kind = 'bar')
plt.show()

Этот «вид» работает.Но есть 2 проблемы:

1) На графике имеется легенда, которая включает все столбцы в исходных данных (например, более 30 столбцов).И у каждого столбца на графике есть крошечный суббар для каждого из столбцов (все они имеют одинаковое значение, так как я просто считаю события).

2) В некоторых месяцах нольСобытия.И эти месяцы вообще не отображаются на графике.

Я наконец-то придумал код, чтобы график выглядел так, как я хотел.Но мне кажется, что я не делаю это «правильным» способом, поскольку это должен быть довольно распространенный вариант использования.

По сути, я создал новый фрейм данных с одним столбцом «count» и индексом, который являетсястроковое представление месяца / года.Я заполнил это нулями во временном интервале, который мне небезразличен, а затем скопировал данные из первого кадра в новый.Вот код:

import pandas as pd
import matplotlib.pyplot as plt

cnt = data.groupby([(data.Timestamp.dt.year),(data.Timestamp.dt.month)]).count()
index = []
for year in [2015, 2016, 2017, 2018]:
    for month in range(1,13):
        index.append('%04d-%02d'%(year, month))

cnt_new = pd.DataFrame(index=index, columns=['count'])
cnt_new = cnt_new.fillna(0)
for i, row in cnt.iterrows():
    cnt_new.at['%04d-%02d'%i,'count'] = row[0]
cnt_new.plot(kind = 'bar')

plt.show()

Кто-нибудь знает более простой способ сделать это?

РЕДАКТИРОВАТЬ -> По запросу, вот идея типа фрейма данных.Это результаты запроса SQL.Фактические данные - это моя компания, так что ...

              Timestamp     FirstName    LastName  HairColor \
0   2018-11-30 02:16:11     Fred         Schwartz  brown
1   2018-11-29 16:25:55     Sam          Smith     black
2   2018-11-19 21:12:29     Helen        Hunt      red

Хорошо, так что я думаю, что получил.Спасибо Юке за повторную команду.Мне просто нужно запустить это на серии данных Timestamp (а не на всем фрейме данных), и это даст мне именно то, что я искал.

> data.index = data.Timestamp
> data.Timestamp.resample('M').count()
Timestamp
2017-11-30    0
2017-12-31    0
2018-01-31    1
2018-02-28    2
2018-03-31    7
2018-04-30    9
2018-05-31    2
2018-06-30    6
2018-07-31    5
2018-08-31    4
2018-09-30    1
2018-10-31    0
2018-11-30    5

1 Ответ

0 голосов
/ 04 декабря 2018

Таким образом, запрос OP выглядит следующим образом: «В основном, простая гистограмма, показывающая, сколько событий в месяц»

Использование pd.resample и месячной частоты дает желаемый результат

df[['FirstName']].resample('M').count()

Вывод:

             FirstName  
Timestamp                                 
2018-11-30          3   

Чтобы включить ненаблюдаемые месяцы, нам нужно создать базовый календарь

df_a = pd.DataFrame(index = pd.date_range(df.index[0].date(), periods=12, freq='M'))

, а затем присвоить ему результат нашей повторной выборки

df_a['count'] = df[['FirstName']].resample('M').count()

Вывод:

            count
2018-11-30    3.0
2018-12-31    NaN
2019-01-31    NaN
2019-02-28    NaN
2019-03-31    NaN
2019-04-30    NaN
2019-05-31    NaN
2019-06-30    NaN
2019-07-31    NaN
2019-08-31    NaN
2019-09-30    NaN
2019-10-31    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...