功能说明

expanding() 创建一个扩展窗口对象,窗口从数据起点开始,逐步向后扩展至当前数据点。每个位置的统计量包含从起点到当前位置的所有数据。

DataFrame.expanding(min_periods=1, axis=0)
Series.expanding(min_periods=1, axis=0)

📦 参数详解

参数类型默认值说明
min_periodsint1计算统计量所需的最少观测值数量。不足则结果为 NaN
axisint / str0沿哪个轴计算(0 或 ‘index’ 为行方向)

与 rolling() 的关键区别

  • rolling():窗口大小固定
  • expanding():窗口大小从 1 增长到整个数据集
  • expanding() 等价于 rolling(window=len(df)) 但更高效且不会因窗口不够产生 NaN(满足 min_periods 时)

📊 可用方法

方法同 rolling()

expanding() 支持与 rolling() 完全一致的方法集:

方法说明
sum() / mean() / median()累计和 / 均值 / 中位数
std() / var() / sem()累计标准差 / 方差 / 标准误
count()窗口内非缺失值数量
min() / max()累计最小 / 最大值
corr() / cov()累计相关系数 / 协方差
skew() / kurt()累计偏度 / 峰度
apply()应用自定义函数
agg() / aggregate()多个聚合一次完成
quantile()累计分位数
rank()累计排名

⚙️ 基本用法

示例代码

import pandas as pd
import numpy as np
 
s = pd.Series(np.arange(1, 6))
 
# 累计求和(扩展窗口)
s.expanding().sum()
# 0     1.0
# 1     3.0    ← 1+2
# 2     6.0    ← 1+2+3
# 3    10.0    ← 1+2+3+4
# 4    15.0    ← 1+2+3+4+5
 
# 累计均值(扩展窗口)
s.expanding().mean()
 
# 累计最大值
s.expanding().max()
 
# DataFrame 多列
df = pd.DataFrame({'A': np.random.randn(10), 'B': np.random.randn(10)})
df.expanding(min_periods=3).mean()

🎯 典型应用

常见场景

# 1. 累计收益率(cumulative return)
returns = pd.Series([0.01, -0.02, 0.03, 0.02])
(1 + returns).expanding().apply(lambda x: x.prod(), raw=True) - 1
 
# 2. 累计均值线(Cumulative Average Line)
df['value'].expanding().mean().plot()
 
# 3. 累计标准差(风险评估)
df['returns'].expanding(min_periods=10).std()
 
# 4. 累计计数与占比
df['category'].expanding().count()

性能提示

  • expanding() 每次计算都使用从起点到当前点的全部数据,复杂度为 O(n²)
  • 累计求和的场景优先考虑 cumsum()、cummax() 等专用累积方法,性能更优
  • expanding().sum() 与 cumsum() 结果等价,但 cumsum() 更快

🔗 相关链接