功能说明
expanding()创建一个扩展窗口对象,窗口从数据起点开始,逐步向后扩展至当前数据点。每个位置的统计量包含从起点到当前位置的所有数据。DataFrame.expanding(min_periods=1, axis=0) Series.expanding(min_periods=1, axis=0)
📦 参数详解
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
min_periods | int | 1 | 计算统计量所需的最少观测值数量。不足则结果为 NaN |
axis | int / str | 0 | 沿哪个轴计算(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()更快