DataFrame с DatetimeIndex, как сделать сюжет в год? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть фрейм данных с именем df с datetimeIndex первым днем ​​месяца и столбцом с именем Val с некоторыми числовыми значениями.

df.head()


+------------+-----+
|            | Val |
+------------+-----+
| DateTime   |     |
| 2011-10-01 |  11 |
| 2011-11-01 |  85 |
| 2011-12-01 |  12 |
| 2012-01-01 |  91 |
| 2012-02-01 |  44 |
+------------+-----+

dataFrame содержит одну строку в месяцыгоды между 2010 и 2017. Моя цель состоит в том, чтобы отобразить на одном графике все значения, где каждая линия представляет один год, на оси x у меня есть месяцы (январь или 01 не важны), а на оси y сумма Val.

Моей первой идеей было использовать что-то вроде df.groupby(df.index.year)['Val'].agg('sum').unstack(), но это приводило к ошибке.AttributeError:

Объект 'Int64Index' не имеет атрибута 'remove_unused_levels'

Затем я написал следующий код, который работает, но имеет некоторые проблемы:

  • Я должен перечислить все годы;
  • Я должен перечислить все цвета линии
  • Трудно создать легенду

.

fig, ax1 = plt.subplots(figsize=(20,7))
months = df['2018'].index
ax1.set_xlabel('months')
ax1.set_ylabel('Sales')
ax1.plot(months, df['2018'], color='navy')
ax1.plot(months, df['2017'], color='blue')
ax1.plot(months, df['2016'], color='lightblue')
ax1.plot(months, df['2015'], color='lime')
plt.grid()

fig.tight_layout()
plt.title('Sales per year', loc='center')

plt.show()

Есть ли более умный способ создания сюжета?

1 Ответ

0 голосов
/ 04 февраля 2019

Так как вы не предоставили DataFrame в копируемом формате, я не могу создать никакой фигуры.Тем не менее, вы можете попробовать следующий способ.Могут быть и другие способы использования некоторого вида groupby в кадре данных

start = 2015
end = 2018
years = map(str, range(start, end+1))
colors = ['lime', 'lightblue', 'blue', 'navy']

for year, c in zip(years, colors):
    ax1.plot(months, df[year], color=c)

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