Есть ли способ рассчитать скользящее значение, ориентированное на будущее, в кадре данных Pandas для различного числа строк? - PullRequest
0 голосов
/ 12 мая 2018

Причина, по которой я спрашиваю, заключается в следующем:

У меня есть временной ряд с 15-минутными финансовыми данными OHLC.То, что я хотел бы рассчитать, - это дать любой точке данных максимальную и минимальную цену в будущем (а следовательно, прогноз) в течение определенного периода времени после этой точки данных.Точные строки, относящиеся к этому временному интервалу, не фиксированы ни по количеству строк, ни по смещению.

Вот пример, чтобы проиллюстрировать, что я имею в виду.

Допустим, у меня открыт высокий максимумзакрытие 23.45 во вторник 28 апреля.Я хотел бы знать максимум и минимум для периодов:

  1. на один день вперед, поэтому необходимо сгруппировать всю среду 29 апреля данные
  2. на один час впередпоэтому следующие 4 строки будут
  3. на одну неделю вперед, поэтому все 672 строки (4 строки по 24 часа x 7 дней) начнутся с 4 мая, то есть в понедельник и, следовательно, на следующей неделе.

Как вы можете видеть, функция "должна знать", как ее текущая позиция времени (в дне, неделе, месяце) определяет интересующее меня окно (которое ориентировано на будущее и смещено).скользящей переменной).

Есть ли способ сделать это, не прибегая к циклам for и пользовательским функциям?Спасибо!

1 Ответ

0 голосов
/ 12 мая 2018

df.rolling может принять смещение частоты строки в качестве первого аргумента. Например,

import numpy as np
import pandas as pd
np.random.seed(2018)

# Generate a DataFrame with an irregular DatetimeIndex
N = 20
start = np.datetime64('2018-01-01').astype('M8[s]').view('<i8')
end = np.datetime64('2018-02-01').astype('M8[s]').view('<i8')
timestamps = np.random.uniform(start, end, size=N)
timestamps.sort()
index = timestamps.astype('M8[s]')

df = pd.DataFrame(np.random.randint(10, size=(N, 4)), columns=list('OHLC'),
                  index=index)

Это вычисляет скользящее среднее, используя 2-дневный размер окна:

df.rolling('2D').mean()

Это вычисляет скользящее среднее, используя 7-дневный (т.е. еженедельный) размер окна:

df.rolling('7D').mean()

Используйте 1H для 1-часового окна, 1D для 1-дневного окна и 7D для 1-недельного окна.

Число строк, соответствующих скользящему окну, не обязательно должно быть постоянным.


Чтобы убедиться, что приведенный выше код дает желаемый результат, давайте подтвердим последние две строки df.rolling('7D').mean().

In [91]: df.rolling('7D').mean().tail(2)
Out[91]: 
                            O         H    L         C
2018-01-30 05:22:18  4.285714  3.000000  5.0  3.428571
2018-01-31 23:45:18  3.833333  2.833333  4.5  3.166667

Последняя строка соответствует средствам, взятым для этого 7-дневного кадра данных:

In [93]: end = df.index[-1]; window = df.loc[end-pd.Timedelta(days=7):end]; window
Out[93]: 
                     O  H  L  C
2018-01-25 21:17:07  1  2  1  2
2018-01-26 22:48:38  6  0  3  1
2018-01-28 08:28:04  0  8  7  5
2018-01-29 02:48:53  8  0  2  3
2018-01-30 05:22:18  6  0  8  8
2018-01-31 23:45:18  2  7  6  0

In [94]: window.mean()
Out[94]: 
O    3.833333
H    2.833333
L    4.500000
C    3.166667
dtype: float64

Значения в window.mean() соответствуют значениям в последнем ряду df.rolling('7D').mean().

Аналогичным образом, мы можем подтвердить результат от второй до последней строки, установив end = df.index[-2]:

In [95]: end = df.index[-2]; window = df.loc[end-pd.Timedelta(days=7):end]; window
Out[95]: 
                     O  H  L  C
2018-01-23 12:05:33  9  8  9  4
2018-01-24 11:16:36  0  3  5  1
2018-01-25 21:17:07  1  2  1  2
2018-01-26 22:48:38  6  0  3  1
2018-01-28 08:28:04  0  8  7  5
2018-01-29 02:48:53  8  0  2  3
2018-01-30 05:22:18  6  0  8  8

In [96]: window.mean()
Out[96]: 
O    4.285714
H    3.000000
L    5.000000
C    3.428571
dtype: float64

In [99]: window.mean().equals(df.rolling('7D').mean().loc[end])
Out[99]: True

Обратите внимание, что фактическое количество строк в окнах отличается (6 против 7).

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