Как построить гистограмму сложенного времени, начиная с Pandas DataFrame? - PullRequest
0 голосов
/ 07 сентября 2018

Рассмотрим следующий фрейм данных df:

Date                   Kind
2018-09-01 13:15:32    Red
2018-09-02 16:13:26    Blue
2018-09-04 22:10:09    Blue
2018-09-04 09:55:30    Red
...                    ...

В котором у вас есть столбец с datetime64[ns] dtype, а другой - с np.object, который может принимать только конечное число значений (в данном случае 2).

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

  • На оси X - даты (дневная гистограмма, показывающая месяц и день);
  • На оси ординат - количество элементов, принадлежащих этой дате, показывающее в столбчатой ​​строке разницу между синим и красным.

Как этого добиться с помощью Matplotlib?

Я думал сделать set_index и пересэмплировать следующим образом:

df.set_index('Date', inplace=True)
df.resample('1d').count()

Но я теряю информацию о количестве предметов за Вид . Я также хочу оставить любой пропущенный день равным нулю.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 07 сентября 2018

Используйте groupby, count и unstack для настройки кадра данных:

df2 = df.groupby(['Date', 'Kind'])['Kind'].count().unstack('Kind').fillna(0)

Затем повторно сэмплируйте кадр данных и суммируйте счет за каждый день. Это также добавит все пропущенные дни, отсутствующие в кадре данных (как указано). Затем настройте индекс, чтобы сохранить только часть даты.

df2 = df2.resample('D').sum()
df2.index = df2.index.date    

Теперь выведите график данных с помощью stacked=True:

df2.plot(kind='bar', stacked=True)

enter image description here


В качестве альтернативы, функция plt.bar() может использоваться для окончательного построения:

cols = df['Kind'].unique() # Find all original values in the column 
ind = range(len(df2))

p1 = plt.bar(ind, df2[cols[0]])
p2 = plt.bar(ind, df2[cols[1]], bottom=df2[cols[0]])

Здесь необходимо установить аргумент bottom каждой части равным сумме всех частей, которые были до этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...