【Pandas】pandas Exponentially-weighted window mean

Pandas2.2 Window

Exponentially-weighted window functions

方法描述
ExponentialMovingWindow.mean([numeric_only, …])用于计算指数加权移动窗口内元素平均值的方法

pandas.Window.ExponentialMovingWindow.mean()

方法描述

ExponentialMovingWindow.mean() 是 pandas 中用于计算指数加权移动窗口内元素平均值的方法。它返回一个与原数据形状相同的对象,其中每个元素表示对应窗口内所有非空值的指数加权平均值。

指数加权移动平均(EWMA)与简单移动平均不同,它给近期数据赋予更高的权重,而给远期数据赋予较低的权重,权重呈指数衰减。这种方法对最新的数据变化更加敏感,能够更快地反映数据趋势的变化。

计算公式为:

  • 权重: wi=(1−α)iw_i = (1-\alpha)^iwi=(1α)i,其中 α=11+com\alpha = \frac{1}{1+com}α=1+com1α=2span+1\alpha = \frac{2}{span+1}α=span+12 或其他参数定义
  • 指数加权平均: EWMAt=∑i=0twixt−i∑i=0twiEWMA_t = \frac{\sum_{i=0}^{t} w_i x_{t-i}}{\sum_{i=0}^{t} w_i}EWMAt=i=0twii=0twixti
参数说明
  • numeric_only: bool, default False

    • 如果为 True,则只对数值类型的列进行平均值计算
    • 如果为 False(默认),则对所有列进行平均值计算(非数值列会产生错误)
  • [engine]: str, default None

    • 计算引擎,可选 ‘cython’ 或 ‘numba’
    • None 表示使用默认引擎
  • engine_kwargs: dict, default None

    • 传递给计算引擎的额外参数
返回值

返回与原始对象相同维度的对象,其中每个值表示当前指数加权窗口内所有非空元素的平均值。

使用示例
import pandas as pd
import numpy as np

# 示例1: Series基本用法
print("=== 示例1: Series基本用法 ===")
data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print("原始数据:")
print(data)
print()

# 使用center of mass参数
ewm_mean_com = data.ewm(com=2).mean()
print("com=2的指数加权移动平均:")
print(ewm_mean_com)
print()

# 使用span参数
ewm_mean_span = data.ewm(span=5).mean()
print("span=5的指数加权移动平均:")
print(ewm_mean_span)
print()

# 使用halflife参数
ewm_mean_halflife = data.ewm(halflife=3).mean()
print("halflife=3的指数加权移动平均:")
print(ewm_mean_halflife)
print()

# 使用alpha参数
ewm_mean_alpha = data.ewm(alpha=0.3).mean()
print("alpha=0.3的指数加权移动平均:")
print(ewm_mean_alpha)
print()

# 示例2: 包含NaN值的情况
print("=== 示例2: 包含NaN值的情况 ===")
data_with_nan = pd.Series([1, 2, np.nan, 4, 5, 6, 7, 8, 9, 10])
print("包含NaN的原始数据:")
print(data_with_nan)
print()

ewm_mean_nan = data_with_nan.ewm(com=2).mean()
print("com=2的指数加权移动平均:")
print(ewm_mean_nan)
print()

# 示例3: DataFrame中的应用
print("=== 示例3: DataFrame中的应用 ===")
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5, 6, 7, 8],
    'B': [10, 20, 30, 40, 50, 60, 70, 80],
    'C': [100, 200, 300, 400, 500, 600, 700, 800]
})
print("原始DataFrame:")
print(df)
print()

ewm_mean_df = df.ewm(com=2).mean()
print("com=2的指数加权移动平均:")
print(ewm_mean_df)
print()

# 示例4: 使用numeric_only参数处理混合类型数据
print("=== 示例4: 使用numeric_only参数处理混合类型数据 ===")
df_mixed = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': ['a', 'b', 'c', 'd', 'e']
})
print("包含数值和非数值列的DataFrame:")
print(df_mixed)
print()

try:
    # 这会引发错误,因为有非数值列
    ewm_mean_error = df_mixed.ewm(com=2).mean()
    print(ewm_mean_error)
except Exception as e:
    print(f"错误信息: {e}")
    print()

# 正确做法:使用numeric_only=True
ewm_mean_numeric = df_mixed.ewm(com=2).mean(numeric_only=True)
print("仅对数值列进行指数加权移动平均计算:")
print(ewm_mean_numeric)
print()

# 示例5: 不同参数的影响
print("=== 示例5: 不同参数的影响 ===")
test_data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8])
print("测试数据:")
print(test_data)
print()

print("com=0.5 (快速衰减,更重视近期数据):")
print(test_data.ewm(com=0.5).mean())
print()

print("com=5 (慢速衰减,更平均地考虑历史数据):")
print(test_data.ewm(com=5).mean())
print()

# 示例6: 在时间序列数据中的应用
print("=== 示例6: 在时间序列数据中的应用 ===")
dates = pd.date_range('2023-01-01', periods=8, freq='D')
ts_data = pd.Series([100, 200, np.nan, 400, 500, 600, 700, 800], index=dates)
print("时间序列数据:")
print(ts_data)
print()

ewm_ts = ts_data.ewm(com=2).mean()
print("com=2的指数加权移动平均:")
print(ewm_ts)
print()

# 示例7: 股票价格分析示例
print("=== 示例7: 股票价格分析示例 ===")
stock_prices = pd.Series([100, 102, 98, 105, 110, 108, 112, 115, 113, 118])
print("股票价格数据:")
print(stock_prices.values)
print()

# 计算不同参数的指数加权移动平均
ewm_fast = stock_prices.ewm(com=1).mean()  # 快速响应
ewm_slow = stock_prices.ewm(com=5).mean()  # 慢速响应

price_analysis = pd.DataFrame({
    '价格': stock_prices,
    '快速EWMA(com=1)': ewm_fast,
    '慢速EWMA(com=5)': ewm_slow
})
print("价格与不同参数的指数加权移动平均:")
print(price_analysis.round(2))
print()
执行结果
=== 示例1: Series基本用法 ===
原始数据:
0     1
1     2
2     3
3     4
4     5
5     6
6     7
7     8
8     9
9    10
dtype: int64

com=2的指数加权移动平均:
0    1.000000
1    1.333333
2    1.888889
3    2.592593
4    3.395062
5    4.263374
6    5.175583
7    6.117055
8    7.078037
9    8.052025
dtype: float64

span=5的指数加权移动平均:
0    1.000000
1    1.333333
2    1.888889
3    2.592593
4    3.395062
5    4.263374
6    5.175583
7    6.117055
8    7.078037
9    8.052025
dtype: float64

halflife=3的指数加权移动平均:
0    1.000000
1    1.225368
2    1.644622
3    2.214214
4    2.900801
5    3.680641
6    4.534513
7    5.447609
8    6.407966
9    7.405309
dtype: float64

alpha=0.3的指数加权移动平均:
0    1.000000
1    1.300000
2    1.810000
3    2.467000
4    3.226900
5    4.058830
6    4.941181
7    5.858827
8    6.801179
9    7.760823
dtype: float64

=== 示例2: 包含NaN值的情况 ===
包含NaN的原始数据:
0     1.0
1     2.0
2     NaN
3     4.0
4     5.0
5     6.0
6     7.0
7     8.0
8     9.0
9    10.0
dtype: float64

com=2的指数加权移动平均:
0    1.000000
1    1.333333
2    1.333333
3    2.444444
4    3.473214
5    4.569620
6    5.703458
7    6.859602
8    7.037521
9    8.024598
dtype: float64

=== 示例3: DataFrame中的应用 ===
原始DataFrame:
   A   B    C
0  1  10  100
1  2  20  200
2  3  30  300
3  4  40  400
4  5  50  500
5  6  60  600
6  7  70  700
7  8  80  800

com=2的指数加权移动平均:
          A          B            C
0  1.000000  10.000000   100.000000
1  1.333333  13.333333   133.333333
2  1.888889  18.888889   188.888889
3  2.592593  25.925926   259.259259
4  3.395062  33.950617   339.506173
5  4.263374  42.633745   426.337449
6  5.175583  51.755827   517.558267
7  6.117055  61.170551   611.705511

=== 示例4: 使用numeric_only参数处理混合类型数据 ===
包含数值和非数值列的DataFrame:
   A   B  C
0  1  10  a
1  2  20  b
2  3  30  c
3  4  40  d
4  5  50  e

错误信息: unsupported operand type(s) for -: 'str' and 'float'

仅对数值列进行指数加权移动平均计算:
          A          B
0  1.000000  10.000000
1  1.333333  13.333333
2  1.888889  18.888889
3  2.592593  25.925926
4  3.395062  33.950617

=== 示例5: 不同参数的影响 ===
测试数据:
0    1
1    2
2    3
3    4
4    5
5    6
6    7
7    8
dtype: int64

com=0.5 (快速衰减,更重视近期数据):
0    1.000000
1    1.333333
2    1.888889
3    2.592593
4    3.395062
5    4.263374
6    5.175583
7    6.117055
dtype: float64

com=5 (慢速衰减,更平均地考虑历史数据):
0    1.000000
1    1.166667
2    1.472222
3    1.893519
4    2.407716
5    2.996430
6    3.647025
7    4.349188
dtype: float64

=== 示例6: 在时间序列数据中的应用 ===
时间序列数据:
2023-01-01    100.0
2023-01-02    200.0
2023-01-03      NaN
2023-01-04    400.0
2023-01-05    500.0
2023-01-06    600.0
2023-01-07    700.0
2023-01-08    800.0
Freq: D, dtype: float64

com=2的指数加权移动平均:
2023-01-01    100.000000
2023-01-02    133.333333
2023-01-03    133.333333
2023-01-04    244.444444
2023-01-05    347.321429
2023-01-06    456.962025
2023-01-07    570.345752
2023-01-08    685.960168
Freq: D, dtype: float64

=== 示例7: 股票价格分析示例 ===
股票价格数据:
[100 102  98 105 110 108 112 115 113 118]

价格与不同参数的指数加权移动平均:
    价格  快速EWMA(com=1)  慢速EWMA(com=5)
0  100       100.00       100.00
1  102       101.00       100.33
2   98       99.33        99.89
3  105       102.44       100.96
4  110       106.53       102.63
5  108       107.15       103.74
6  112       109.82       105.29
7  115       112.61       107.05
8  113       112.77       108.24
9  118       115.59       109.70
关键要点
  1. mean() 方法计算的是指数加权移动窗口内所有非空值的平均值,近期数据权重更高
  2. 可以通过 com(center of mass)、spanhalflifealpha 参数控制权重衰减速度
  3. NaN 值会被自动忽略,不影响其他值的计算
  4. numeric_only 参数对于包含非数值列的数据非常重要
  5. 指数加权移动平均比简单移动平均对数据变化更敏感,能更快反映趋势变化
  6. [engine] 参数允许指定计算引擎以优化性能
  7. 在金融分析中,指数加权移动平均常用于平滑价格数据和识别趋势
  8. 结果保留了原始数据的形状,便于后续分析和可视化
同步定位与地图构建(SLAM)技术为移动机器人或自主载具在未知空间中的导航提供了核心支撑。借助该技术,机器人能够在探索过程中实时构建环境地图并确定自身位置。典型的SLAM流程涵盖传感器数据采集、数据处理、状态估计及地图生成等环节,其核心挑战在于有效处理定位与环境建模中的各类不确定性。 Matlab作为工程计算与数据可视化领域广泛应用的数学软件,具备丰富的内置函数与专用工具箱,尤其适用于算法开发与仿真验证。在SLAM研究方面,Matlab可用于模拟传感器输出、实现定位建图算法,并进行系统性能评估。其仿真环境能显著降低实验成本,加速算法开发与验证周期。 本次“SLAM-基于Matlab的同步定位与建图仿真实践项目”通过Matlab平台完整再现了SLAM的关键流程,包括数据采集、滤波估计、特征提取、数据关联与地图更新等核心模块。该项目不仅呈现了SLAM技术的实际应用场景,更为机器人导航与自主移动领域的研究人员提供了系统的实践参考。 项目涉及的核心技术要点主要包括:传感器模型(如激光雷达与视觉传感器)的建立与应用、特征匹配与数据关联方法、滤波器设计(如扩展卡尔曼滤波与粒子滤波)、图优化框架(如GTSAM与Ceres Solver)以及路径规划与避障策略。通过项目实践,参与者可深入掌握SLAM算法的实现原理,并提升相关算法的设计与调试能力。 该项目同时注重理论向工程实践的转化,为机器人技术领域的学习者提供了宝贵的实操经验。Matlab仿真环境将复杂的技术问题可视化与可操作化,显著降低了学习门槛,提升了学习效率与质量。 实践过程中,学习者将直面SLAM技术在实际应用中遇到的典型问题,包括传感器误差补偿、动态环境下的建图定位挑战以及计算资源优化等。这些问题的解决对推动SLAM技术的产业化应用具有重要价值。 SLAM技术在工业自动化、服务机器人、自动驾驶及无人机等领域的应用前景广阔。掌握该项技术不仅有助于提升个人专业能力,也为相关行业的技术发展提供了重要支撑。随着技术进步与应用场景的持续拓展,SLAM技术的重要性将日益凸显。 本实践项目作为综合性学习资源,为机器人技术领域的专业人员提供了深入研习SLAM技术的实践平台。通过Matlab这一高效工具,参与者能够直观理解SLAM的实现过程,掌握关键算法,并将理论知识系统应用于实际工程问题的解决之中。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuweidong0802

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值