7.5 时间序列的移动窗口函数 (rolling) Pandas 时间序列数据处理:移动窗口函数 (rolling) 详解 在时间序列分析中,我们经常需要对数据进行平滑处理,以消除噪声或识别趋势。移动窗口函数(rolling)是一种强大的工具,它允许我们计算时间序列数据在滑动窗口上的统计量,如均值、标准差、最大值、最小值等。Pandas 提供了灵活易用的 方法,使得移动窗口函数的应用变得非常简单。 7.5.1 移动窗口函数的基本概念 移动窗口函数的核心思想是:定义一个固定大小的窗口,沿着时间序列数据滑动,并在每个窗口内计算统计量。这个过程类似于对数据进行局部平均,从而达到平滑的效果。 关键参数: window: 窗口的大小,可以是整数或偏移量。
在时间序列分析中,我们经常需要对数据进行平滑处理,以消除噪声或识别趋势。移动窗口函数(rolling)是一种强大的工具,它允许我们计算时间序列数据在滑动窗口上的统计量,如均值、标准差、最大值、最小值等。Pandas 提供了灵活易用的 rolling 方法,使得移动窗口函数的应用变得非常简单。
移动窗口函数的核心思想是:定义一个固定大小的窗口,沿着时间序列数据滑动,并在每个窗口内计算统计量。这个过程类似于对数据进行局部平均,从而达到平滑的效果。
关键参数:
window: 窗口的大小,可以是整数或偏移量。整数表示窗口包含的观测值的数量,偏移量表示窗口的时间跨度。
min_periods: 窗口中至少需要包含的观测值的数量,才能计算统计量。如果窗口内的观测值数量小于 min_periods,则结果为 NaN。
center: 窗口是否居中对齐。如果为 True,则窗口的中心与当前观测值对齐;如果为 False(默认值),则窗口的末端与当前观测值对齐。
axis: 指定计算的轴。默认为 0,表示按行计算。
closed: 定义区间的开闭。 它可以是 'right','left','both' 或 'neither'。 对于基于偏移量的窗口,它默认为 'right'。 对于固定大小的窗口,它默认为 'both'。
rolling 方法的使用Pandas rolling 方法是 Series 和 DataFrame 对象的一个方法,用于创建 Rolling 对象。Rolling 对象提供了一系列方法,用于计算移动窗口统计量。
基本语法:
DataFrame.rolling(window, min_periods=None, center=False, axis=0, closed=None) Series.rolling(window, min_periods=None, center=False, axis=0, closed=None)
常用方法:
mean(): 计算移动平均值。
std(): 计算移动标准差。
max(): 计算移动最大值。
min(): 计算移动最小值。
sum(): 计算移动总和。
median(): 计算移动中位数。
apply(func): 应用自定义函数 func 到每个窗口。
count(): 计算每个窗口中非 NaN 值的数量。
quantile(q): 计算移动分位数,q 是一个介于 0 和 1 之间的浮点数。
corr(other): 计算与另一个序列或 DataFrame 的移动相关性。
cov(other): 计算与另一个序列或 DataFrame 的移动协方差。
下面通过一些示例来演示 rolling 方法的使用。
示例 1:计算移动平均值
import pandas as pd import numpy as np # 创建一个时间序列 dates = pd.date_range('2023-01-01', periods=10) data = np.random.randn(10) ts = pd.Series(data, index=dates) # 计算 3 天的移动平均值 rolling_mean = ts.rolling(window=3).mean() print(rolling_mean)
输出:
2023-01-01 NaN 2023-01-02 NaN 2023-01-03 -0.045529 2023-01-04 -0.258396 2023-01-05 -0.381773 2023-01-06 -0.385574 2023-01-07 -0.482358 2023-01-08 -0.744464 2023-01-09 -0.395579 2023-01-10 0.151686 Freq: D, dtype: float64
解释:
ts.rolling(window=3) 创建了一个 Rolling 对象,窗口大小为 3。
.mean() 计算每个窗口的平均值。
由于前两个窗口的观测值数量小于 3,因此前两个结果为 NaN。
示例 2:指定 min_periods
# 计算 3 天的移动平均值,但至少需要 2 个观测值 rolling_mean = ts.rolling(window=3, min_periods=2).mean() print(rolling_mean)
输出:
2023-01-01 NaN 2023-01-02 0.044916 2023-01-03 -0.045529 2023-01-04 -0.258396 2023-01-05 -0.381773 2023-01-06 -0.385574 2023-01-07 -0.482358 2023-01-08 -0.744464 2023-01-09 -0.395579 2023-01-10 0.151686 Freq: D, dtype: float64
解释:
min_periods=2 意味着只要窗口中至少有 2 个观测值,就可以计算平均值。因此,第二个结果不再是 NaN。示例 3:使用时间偏移量作为窗口大小
# 使用 1 周的时间偏移量作为窗口大小 rolling_mean = ts.rolling(window='7D').mean() print(rolling_mean)
输出:
2023-01-01 NaN 2023-01-02 NaN 2023-01-03 NaN 2023-01-04 NaN 2023-01-05 NaN 2023-01-06 NaN 2023-01-07 -0.482358 2023-01-08 -0.744464 2023-01-09 -0.395579 2023-01-10 0.151686 Freq: D, dtype: float64
解释:
window='7D' 表示窗口的大小为 7 天。
当使用时间偏移量时,窗口的大小会根据时间序列的频率自动调整。
示例 4:应用自定义函数
# 定义一个自定义函数,计算窗口内的最大值和最小值之差 def range_func(x): return x.max() - x.min() # 应用自定义函数到每个窗口 rolling_range = ts.rolling(window=3).apply(range_func) print(rolling_range)
输出:
2023-01-01 NaN 2023-01-02 NaN 2023-01-03 1.372181 2023-01-04 0.836947 2023-01-05 0.547766 2023-01-06 0.528234 2023-01-07 0.182156 2023-01-08 0.442903 2023-01-09 0.823505 2023-01-10 1.019451 Freq: D, dtype: float64
解释:
apply(range_func) 将 range_func 应用到每个窗口,计算窗口内的最大值和最小值之差。示例 5: 使用 center=True
rolling_mean_centered = ts.rolling(window=3, center=True).mean() print(rolling_mean_centered)
输出:
2023-01-01 NaN 2023-01-02 -0.045529 2023-01-03 -0.258396 2023-01-04 -0.381773 2023-01-05 -0.385574 2023-01-06 -0.482358 2023-01-07 -0.744464 2023-01-08 -0.395579 2023-01-09 0.151686 2023-01-10 NaN Freq: D, dtype: float64
当 center=True 时,移动窗口会居中对齐,这会导致序列的头部和尾部出现更多的 NaN 值。
示例 6: 使用 closed 参数
rolling_sum_right = ts.rolling(window=3, closed='right').sum() rolling_sum_left = ts.rolling(window=3, closed='left').sum() rolling_sum_both = ts.rolling(window=3, closed='both').sum() rolling_sum_neither = ts.rolling(window=3, closed='neither').sum() print("Right Closed:\n", rolling_sum_right) print("\nLeft Closed:\n", rolling_sum_left) print("\nBoth Closed:\n", rolling_sum_both) print("\nNeither Closed:\n", rolling_sum_neither)
输出结果会因随机数生成而异,但会展示不同 closed 参数的效果。
移动窗口函数在时间序列分析中有着广泛的应用,例如:
平滑数据: 消除噪声,突出趋势。
识别趋势: 通过计算移动平均值或移动标准差,可以识别时间序列数据的趋势。
计算波动率: 通过计算移动标准差,可以衡量时间序列数据的波动率。
信号处理: 在信号处理中,移动窗口函数可以用于滤波和降噪。
金融分析: 在金融分析中,移动窗口函数可以用于计算移动平均线、移动标准差等技术指标。
可以使用 Mermaid 图表来可视化移动窗口函数的概念。
解释:
时间序列数据: 原始的时间序列数据。
定义窗口大小: 指定移动窗口的大小,例如 3 天、1 周等。
窗口滑动: 窗口沿着时间序列数据滑动。
计算窗口内统计量: 在每个窗口内计算统计量,例如平均值、标准差等。
输出结果: 输出计算得到的移动窗口统计量。
Pandas rolling 方法是一个强大的工具,用于计算时间序列数据的移动窗口统计量。通过灵活地设置窗口大小、min_periods、center 和 closed 参数,以及应用自定义函数,可以满足各种时间序列分析的需求。移动窗口函数在平滑数据、识别趋势、计算波动率等方面有着广泛的应用。掌握 rolling 方法的使用,可以帮助我们更好地理解和分析时间序列数据。