Python Pandas - 窗口函数
Pandas - 窗口函数
Section titled “Pandas - 窗口函数”Pandas 提供了强大的工具,可以在数据的滑动或扩展窗口上执行计算。这些功能对于计算移动平均值、累积总和或时间序列分析(其中特定时期内的趋势和模式非常重要)等任务至关重要。
主要的窗口操作类型有:
- Rolling Windows (滚动窗口): 在固定大小的滑动窗口上计算统计量。
- Expanding Windows (扩展窗口): 累积计算统计量,包括从开始到当前点之前的所有数据点。
- Exponentially Weighted Moving (EWM) Windows (指数加权移动窗口): 类似于滚动窗口,但赋予近期观测值更大的权重。
这些操作通常通过应用于 Series 或 DataFrame 对象上的 .rolling()、.expanding() 和 .ewm() 方法访问,然后接一个聚合函数(例如,.mean()、.sum()、.std()、.max())。
我们来创建一个时间序列示例 DataFrame:
import pandas as pdimport numpy as np
# Create DataFrame with a DatetimeIndexdates = pd.date_range('20230101', periods=10)df = pd.DataFrame(np.random.randn(10, 4), index=dates, columns=list('ABCD'))
print("Sample DataFrame:")print(df)(输出会因随机数而异)
.rolling() 函数 (滑动窗口)
Section titled “.rolling() 函数 (滑动窗口)”.rolling() 方法定义了一个指定大小的窗口,该窗口沿着数据滑动。您必须提供 window 大小(观测值数量)。
# Calculate the 3-period rolling meanprint("\n3-Period Rolling Mean:")print(df.rolling(window=3).mean())输出(示例):
3-Period Rolling Mean: A B C D2023-01-01 NaN NaN NaN NaN2023-01-02 NaN NaN NaN NaN2023-01-03 0.434553 -0.667940 -1.051718 -0.8264522023-01-04 0.628267 -0.047040 -0.287467 -0.1611102023-01-05 0.398233 0.003517 0.099126 -0.4055652023-01-06 0.641798 0.656184 -0.322728 0.4280152023-01-07 0.188403 0.010913 -0.708645 0.1609322023-01-08 0.188043 -0.253039 -0.818125 -0.1084852023-01-09 0.682819 -0.606846 -0.178411 -0.4041272023-01-10 0.688583 0.127786 0.513832 -1.067156解释: 注意前两行的 NaN 值。这是因为直到第三个数据点才存在一个完整的窗口大小为 3 的窗口。‘2023-01-03’ 的值是 ‘2023-01-01’、‘2023-01-02’ 和 ‘2023-01-03’ 值的平均值。窗口然后向前滑动一步进行下一次计算。
您可以在 .rolling() 之后应用其他聚合操作,如 .sum()、.std()、.max() 等。
# Calculate the 3-period rolling sumprint("\n3-Period Rolling Sum:")print(df.rolling(window=3).sum())如果索引是基于时间的,.rolling() 也支持基于时间的窗口(例如,df.rolling('3D').sum()),以及像 center=True 这样的选项来居中对齐窗口标签。
.expanding() 函数 (累积窗口)
Section titled “.expanding() 函数 (累积窗口)”.expanding() 方法创建一个累积增长的窗口。每个点的计算都包括从开始到该点的所有数据。您通常指定 min_periods 来确定生成值所需的最小观测值数量。
# Calculate the expanding mean (requires at least 3 periods)print("\nExpanding Mean (min_periods=3):")print(df.expanding(min_periods=3).mean())输出(示例):
Expanding Mean (min_periods=3): A B C D2023-01-01 NaN NaN NaN NaN2023-01-02 NaN NaN NaN NaN2023-01-03 0.434553 -0.667940 -1.051718 -0.8264522023-01-04 0.743328 -0.198015 -0.852462 -0.2625472023-01-05 0.614776 -0.205649 -0.583641 -0.3032542023-01-06 0.538175 -0.005878 -0.687223 -0.1992192023-01-07 0.505503 -0.108475 -0.790826 -0.0810562023-01-08 0.454751 -0.223420 -0.671572 -0.2302152023-01-09 0.586390 -0.206201 -0.517619 -0.2675212023-01-10 0.560427 -0.037597 -0.399429 -0.376886解释: 与滚动窗口类似,由于设置了 min_periods=3,前两行是 NaN。‘2023-01-03’ 的值是前三行的平均值。‘2023-01-04’ 的值是前 四 行的平均值,以此类推。它对于计算累计统计量(如累计总和或平均值)非常有用。
# Calculate the expanding sum (cumulative sum)print("\nExpanding Sum (min_periods=1):")print(df.expanding(min_periods=1).sum()) # 等同于 df.cumsum().ewm() 函数 (指数加权移动)
Section titled “.ewm() 函数 (指数加权移动)”指数加权移动 (EWM) 函数为观测值分配权重,更重视近期数据点。权重随着观测值变旧而呈指数级下降。与固定窗口大小不同,衰减由以下参数控制:
span: 以周期数指定窗口大小(常用于平滑)。com(质量中心): 指定衰减的另一种方式。halflife: 权重衰减一半所需的周期数。alpha: 直接指定平滑因子 (0 < alpha <= 1)。
您只需要指定这些衰减参数中的 一个。
# Calculate the exponentially weighted moving average with a span of 3print("\nEWM Mean (span=3):")print(df.ewm(span=3).mean())输出(示例):
EWM Mean (span=3): A B C D2023-01-01 1.088512 -0.650942 -2.547450 -0.5668582023-01-02 0.584818 -0.918843 -1.502458 -1.0091552023-01-03 0.160516 -0.852000 -0.862254 -1.2660232023-01-04 0.806731 -0.000790 -0.527406 -0.3177782023-01-05 0.550059 -0.027708 -0.227423 -0.3572302023-01-06 0.659042 0.449324 -0.440189 0.1980162023-01-07 0.277761 0.064759 -0.751578 0.2204422023-01-08 0.221687 -0.282486 -0.685453 -0.0908332023-01-09 0.909541 -0.263199 -0.222084 -0.2291272023-01-10 0.740476 0.240152 0.163507 -0.686182EWM 函数常用于平滑时间序列数据,通过减少噪声来突出潜在趋势,尤其在金融数据分析中。
窗口函数广泛应用于各种领域:
- 时间序列分析: 计算移动平均值/标准差以识别趋势和波动性。
- 金融: 计算股票收益波动率、移动平均收敛散度 (MACD)。
- 信号处理: 平滑嘈杂信号。
- 数据清洗: 基于滚动统计量识别异常值。
- 特征工程: 基于近期趋势(例如,过去 7 天的平均销售额)为机器学习模型创建特征。
通过应用窗口计算并可视化结果,您通常可以揭示原始数据中不立即显而易见的模式和趋势。