Функция Pandas Rolling () с ежемесячным смещением - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь использовать функцию roll () для фрейма данных pandas с ежемесячными данными.Тем не менее, я упал некоторые значения NaN, так что теперь в моих временных рядах есть некоторые пробелы.Поэтому основной параметр окна дает вводящий в заблуждение ответ, поскольку он просто смотрит на предыдущее наблюдение:

import pandas as pd
import numpy as np
import random
dft = pd.DataFrame(np.random.randint(0,10,size=len(dt)),index=dt)
dft.columns = ['value']
dft['value'] = np.where(dft['value'] < 3,np.nan,dft['value'])
dft = dft.dropna()
dft['basic'] = dft['value'].rolling(2).sum()

См., Например, запись 2017-08-31, которая суммирует 3,0 и 9,0, но предыдущую записьэто 2017-03-31.

In [57]: dft.tail()
Out[57]:
            value  basic
2017-02-28    8.0   12.0
2017-03-31    3.0   11.0
2017-08-31    9.0   12.0
2017-10-31    7.0   16.0
2017-11-30    7.0   14.0

Естественное решение (я думал) состоит в том, чтобы использовать смещение '2M', но оно выдает ошибку:

In [58]: dft['basic2M'] = dft['value'].rolling('2M').sum()
...<output omitted>...
ValueError: <2 * MonthEnds> is a non-fixed frequency

Если я переместлю ежедневное смещение, я могу получитьэто работает, но это выглядит как странный обходной путь:

In [59]: dft['basic32D'] = dft['value'].rolling('32D', min_periods=2).sum()

In [61]: dft.tail()
Out[61]:
            value  basic  basic32D
2017-02-28    8.0   12.0      12.0
2017-03-31    3.0   11.0      11.0
2017-08-31    9.0   12.0       NaN
2017-10-31    7.0   16.0       NaN
2017-11-30    7.0   14.0      14.0

Я также пытался преобразовать в PeriodIndex:

dfp = dft.to_period(freq='M')

, но это дает ту же ошибку:

dfp['basic2M'] = dfp['value'].rolling('2M').sum()

и это очень неожиданно:

dfp['basic32Dp'] = dfp['value'].rolling('32D', min_periods=2).sum()
In [68]: dfp
Out[68]:
         value  basic  basic32D  basic32Dp
2016-02    9.0    NaN       NaN        NaN
2016-03    3.0   12.0      12.0       12.0
2016-04    7.0   10.0      10.0       19.0
2016-05    3.0   10.0      10.0       22.0
2016-06    4.0    7.0       7.0       26.0
2016-07    7.0   11.0      11.0       33.0
2016-08    3.0   10.0      10.0       36.0
2016-09    9.0   12.0      12.0       45.0
2016-11    5.0   14.0       NaN       50.0
2017-01    4.0    9.0       NaN       54.0
2017-02    8.0   12.0      12.0       62.0
2017-03    3.0   11.0      11.0       65.0
2017-08    9.0   12.0       NaN       74.0
2017-10    7.0   16.0       NaN       81.0
2017-11    7.0   14.0      14.0       88.0

Смещение '32D' с индексом периода 'M', возможно, рассматривается как '32M'?Кажется, это просто увеличивающаяся сумма для всей серии.

Возможно, я неправильно понимаю, как использовать смещения?Очевидно, я мог бы решить эту проблему, сохранив NaN в исходном столбце value и просто используя параметр окна, но смещения кажутся весьма полезными.

Для чего стоит, если я генерирую почасовые данные с DateTimeIndex, кажется, что все работает как ожидалось (т.е. смещение «2D» с данными каждые 12 часов дает правильный ответ по пропущенным строкам).

...