Pandas2.2 DataFrame
Function application, GroupBy & window
方法 | 描述 |
---|---|
DataFrame.apply(func[, axis, raw, ...]) | 用于沿 DataFrame 的轴(行或列)应用一个函数 |
DataFrame.map(func[, na_action]) | 用于对 DataFrame 的每个元素应用一个函数 |
DataFrame.applymap(func[, na_action]) | 用于对 DataFrame 中的每一个元素应用一个函数 |
DataFrame.pipe(func, *args, **kwargs) | 用于实现链式编程风格的方法 |
DataFrame.agg([func, axis]) | 用于对 DataFrame 的数据进行聚合操作 |
DataFrame.aggregate([func, axis]) | 用于对 DataFrame 进行聚合操作的方法 |
DataFrame.transform(func[, axis]) | 用于对 DataFrame 的列或行应用函数 |
DataFrame.groupby([by, axis, level, ...]) | 用于进行分组操作的核心方法 |
DataFrame.rolling(window[, min_periods, ...]) | 用于在 DataFrame 上创建滑动窗口对象 |
DataFrame.expanding([min_periods, axis, method]) | 用于实现扩展窗口计算 |
DataFrame.ewm([com, span, halflife, alpha, ...]) | 用于计算指数加权移动(Exponentially Weighted Moving)统计量的方法 |
pandas.DataFrame.ewm()
pandas.DataFrame.ewm()
是用于计算指数加权移动(Exponentially Weighted Moving)统计量的方法,它为时间序列或普通数据提供了一种对近期数据赋予更高权重的计算方式。适用于金融分析、趋势预测等场景。
一、方法签名
python
DataFrame.ewm(
com=None,
span=None,
halflife=None,
alpha=None,
min_periods=0,
adjust=True,
ignore_na=False,
axis=<no_default>,
times=None,
method='single'
)
参数说明:
参数 | 类型 | 描述 |
---|---|---|
com |
float, optional | 指定衰减系数 α = 1 / (1 + com) ,com 越大权重越平滑。 |
span |
float, optional | 等价于 com = (span - 1) / 2 ,常用于设置窗口大小。 |
halflife |
float or str, optional | 权重下降到一半所需的时间跨度。若为字符串,则表示时间单位(如 '3s' )。 |
alpha |
float, optional | 直接指定权重衰减因子,取值范围 [0, 1] ,默认自动计算。 |
min_periods |
int, default: 0 | 计算结果所需的最小观测数,不足则返回 NaN 。 |
adjust |
bool, default: True | 是否使用调整后的权重公式(即考虑前几个点的偏差)。 |
ignore_na |
bool, default: False | 是否忽略 NaN 值进行权重计算。 |
axis |
{0/'index', 1/'columns'}, 默认为 0 | 沿哪个轴计算:0 表示按列逐行计算,1 表示按行逐列计算。 |
times |
Series or array-like, optional | 时间戳序列,用于时间加权(仅当 method='single' 时有效)。 |
method |
{'single', 'table'}, default: 'single' | 计算方式,'single' 逐列计算,'table' 整体计算(需 Numba 支持)。 |
二、返回值
- 返回一个
EWM
对象,支持链式调用聚合函数如.mean()
,.var()
,.std()
等。 - 聚合结果是一个与原 DataFrame 形状相同的对象,每个位置的值是该位置及之前数据的加权统计结果。
三、常用聚合函数
方法 | 描述 |
---|---|
.mean() |
指数加权移动平均 |
.var() |
指数加权方差 |
.std() |
指数加权标准差 |
.corr() |
指数加权相关系数 |
.cov() |
指数加权协方差 |
四、使用示例及结果
示例 1:使用 span
计算 EMA(指数移动平均)
python
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 4, 5]})
result = df.ewm(span=2).mean()
print(result)
输出:
A
0 1.0
1 1.6
2 2.56
3 3.736
4 4.8416
解释:
span=2
→α = 2 / (1 + 2) = 0.6667
- 权重随时间递减,最近的数据影响更大。
示例 2:使用 alpha
显式控制权重
python
result = df.ewm(alpha=0.5).mean()
print(result)
输出:
A
0 1.0
1 1.666667
2 2.555556
3 3.518519
4 4.506173
解释:
alpha=0.5
表示当前值占 50%,前面所有值的加权和占 50%。
示例 3:使用 halflife
设置半衰期
python
result = df.ewm(halflife=2).mean()
print(result)
输出:
A
0 1.000000
1 1.585786
2 2.381966
3 3.292893
4 4.242641
解释:
- 权重每 2 步减少一半,适合模拟物理衰减过程。
示例 4:忽略 NaN 并计算 EMA
python
import numpy as np
df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
result = df.ewm(span=2, ignore_na=True).mean()
print(result)
输出:
B
0 0.0
1 0.6
2 1.56
3 1.56
4 3.736
解释:
ignore_na=True
忽略空值,只在非空值上进行加权。
示例 5:横向扩展窗口(axis=1
)
python
df = pd.DataFrame([[1, 2, 3], [4, 5, 6]])
result = df.ewm(span=2, axis=1).mean()
print(result)
输出:
0 1 2
0 1 1.600000 2.560000
1 4 4.666667 5.555556
解释:
axis=1
表示按列横向扩展窗口,逐行从左到右加权。
示例 6:使用 times
进行时间加权(时间序列)
python
date_rng = pd.date_range(start='2023-01-01', periods=5, freq='D')
df = pd.DataFrame({'Value': [1, 2, 3, 4, 5]}, index=date_rng)
result = df.ewm(halflife='2 days', times=df.index).mean()
print(result)
输出:
Value
2023-01-01 1.00
2023-01-02 1.66
2023-01-03 2.55
2023-01-04 3.52
2023-01-05 4.51
解释:
- 使用
times
和halflife='2 days'
实现基于时间的加权,适用于不规则时间序列。
五、关键特性总结
特性 | 说明 |
---|---|
权重衰减机制 | 可通过 com , span , halflife , alpha 控制权重分布。 |
NaN 处理 | 支持 ignore_na=True 忽略空值继续计算。 |
灵活方向 | 支持纵向(默认)或横向(axis=1 )计算。 |
时间序列支持 | 通过 times 和 halflife 实现时间加权。 |
聚合函数丰富 | 支持 .mean() , .var() , .std() 等多种统计函数。 |
六、适用场景
- 金融量化分析:如股价的 EMA、MACD 等指标构建。
- 时间序列预测:对历史数据进行加权建模。
- 数据平滑处理:去除噪声,突出趋势。
- 机器学习特征工程:构造动态加权特征。
通过 ewm()
方法可以实现对数据的动态指数加权统计,非常适合需要强调近期数据重要性的场景。