【Pandas】pandas DataFrame ewm

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

解释:

  • 使用 timeshalflife='2 days' 实现基于时间的加权,适用于不规则时间序列。

五、关键特性总结
特性 说明
权重衰减机制 可通过 com, span, halflife, alpha 控制权重分布。
NaN 处理 支持 ignore_na=True 忽略空值继续计算。
灵活方向 支持纵向(默认)或横向(axis=1)计算。
时间序列支持 通过 timeshalflife 实现时间加权。
聚合函数丰富 支持 .mean(), .var(), .std() 等多种统计函数。

六、适用场景
  • 金融量化分析:如股价的 EMA、MACD 等指标构建。
  • 时间序列预测:对历史数据进行加权建模。
  • 数据平滑处理:去除噪声,突出趋势。
  • 机器学习特征工程:构造动态加权特征。

通过 ewm() 方法可以实现对数据的动态指数加权统计,非常适合需要强调近期数据重要性的场景。

相关推荐
liuweidong080210 小时前
【Pandas】pandas DataFrame abs
pandas
数据系的公考小白3 天前
2025五一杯数学建模C题代码分享
python·数学建模·pandas·五一杯
get lend gua3 天前
Pandas 的透视与逆透视
机器学习·数据挖掘·pandas
跟着杰哥学Python3 天前
一文读懂Python之pandas模块
开发语言·python·pandas
xiaohanbao093 天前
day16 numpy和shap深入理解
python·学习·机器学习·信息可视化·numpy·pandas
CoderJia程序员甲4 天前
PandasAI:对话式数据分析新时代
ai·数据挖掘·数据分析·pandas·deepseek
真智AI5 天前
掌握 Pandas DataFrame 的复杂过滤技巧
python·pandas
engchina5 天前
如何在Dify沙盒中安装运行pandas、numpy
numpy·pandas·dify·代码节点
帮帮志7 天前
Python-pandas-操作Excel文件(读取数据/写入数据)及Excel表格列名操作详细分享
python·excel·pandas