df.rolling
可以接受一个字符串频率偏移作为其第一个参数。例如,
import numpy as np
import pandas as pd
np.random.seed(2018)
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天的DataFrame取平均值:
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)。