Разделить временные ряды за год для построения - PullRequest
0 голосов
/ 09 февраля 2020

Я хотел бы построить временной ряд, начинающийся в октябре 2015 года и заканчивающийся в феврале 2018 года, на одном графике, каждый год представляет собой одну линию. Временной ряд имеет значение int64 и находится в Pandas DataFrame. Дата указана в datetime64[ns] как один из столбцов в фрейме данных.

Как создать график из января-декабря с 4 строками для каждого года.

graph ['share_price' ' ] и график ['дата'] используются. Я пробовал Grouper, но он каким-то образом берет значения за октябрь 2015 года и смешивает их с январскими значениями всех других лет.

Эта группировка близка к тому, что я хочу, но я теряю информацию, в каком году Индекс списка принадлежит.

graph.groupby('date').agg({'share_price':lambda x: list(x)})

Затем я создал DataFrame с 4 столбцами, по 1 на каждый год, но все же я не знаю, как go вперед и сгруппировать эти 4 столбца в таким образом, я смогу построить график так, как я хочу.

1 Ответ

2 голосов
/ 10 февраля 2020

Этого можно добиться путем:

  1. извлечения года из даты
  2. с заменой дат на эквивалент без указания года
  3. и установки года и дата в виде индекса
  4. , растаскивая значения по годам

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

Вот пример.

Предположим, что ваш DataFrame выглядит примерно так:

>>> import pandas as pd
>>> import numpy as np
>>> index = pd.date_range('2015-10-01', '2018-02-28')
>>> values = np.random.randint(-3, 4, len(index)).cumsum()
>>> df = pd.DataFrame({
...    'date': index,
...    'share_price': values
>>> })
>>> df.head()
        date  share_price
0 2015-10-01            0
1 2015-10-02            3
2 2015-10-03            2
3 2015-10-04            5
4 2015-10-05            4
>>> df.set_index('date').plot()

enter image description here

Вы должны преобразовать DataFrame следующим образом:

>>> df['year'] = df.date.dt.year
>>> df['date'] = df.date.dt.strftime('%m-%d')
>>> unstacked = df.set_index(['year', 'date']).share_price.unstack(-2)
>>> unstacked.head()
year   2015  2016  2017  2018
date                         
01-01   NaN  28.0 -16.0  21.0
01-02   NaN  29.0 -14.0  22.0
01-03   NaN  29.0 -16.0  22.0
01-04   NaN  26.0 -15.0  23.0
01-05   NaN  25.0 -16.0  21.0

И просто построить график нормально:

unstacked.plot()

enter image description here

...