Эффективное использование pandas .DataFrame.rolling () с временным окном - PullRequest
0 голосов
/ 09 мая 2020

Мне нужно применить функцию к скользящему окну на некотором разреженном DataFrame, индексированном по дате и времени (временной интервал между строками меняется). Размер окна определяется смещением:

def value_diff(x):
    return (x[-1] - x[0]) / x[0] * 100

diff = df['value'].rolling(window='10min').apply(value_diff)

Мне нужно, чтобы первое значение результата основывалось на данных не менее 10 минут.

К сожалению, параметр min_periods * Функция 1006 * не принимает смещение, только числовое количество точек, и я не могу указать для нее фиксированное значение, потому что количество элементов в одном окне меняется.

После запуска этого кода я получаю объект Series который начинается с результатов применения функции value_diff() с самого начала столбца DataFrame, а окно содержит только 1 элемент, затем 2 элемента, 3 элемента и т. д.

Я могу запустить diff = duff.truncate(before=diff.index[0] + timedelta(minutes=10), copy=False), но мне это кажется несколько неэффективным. Есть ли способ избежать применения функции прокрутки к неполному windows в начале, после усечения ненадежных данных, без полной перезаписи rolling()?

1 Ответ

0 голосов
/ 09 мая 2020

Я думаю, что вам нужно восстановить отсутствующую метку времени, чтобы применить функцию прокрутки с фиксированной длиной, как в примере выше:

# build an irregular ts
series = pd.Series(np.ones(60))
series.index = pd.date_range(datetime(2010, 1, 1, 13, 0), periods=60, freq='1min')
series = series.sample(20, random_state=33).sort_index()

# reconstruct the series with every timestamp and apply a rolling function
series = series.reindex(pd.date_range(datetime(2010, 1, 1, 13, 0), periods=60, freq='1min'), fill_value=0)
series.rolling(10).sum() # 10 min function
...