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).