【Pandas】pandas Exponentially-weighted window sum

Pandas2.2 Window

Exponentially-weighted window functions

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

pandas.Window.ExponentialMovingWindow.sum()

方法描述

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

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

计算公式为:

  • 权重: w i = ( 1 − α ) i w_i = (1-\alpha)^i wi=(1α)i,其中 α = 1 1 + c o m \alpha = \frac{1}{1+com} α=1+com1 α = 2 s p a n + 1 \alpha = \frac{2}{span+1} α=span+12 或其他参数定义
  • 指数加权总和: E W M S u m t = ∑ i = 0 t w i x t − i EWMSum_t = \sum_{i=0}^{t} w_i x_{t-i} EWMSumt=i=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_sum_com = data.ewm(com=2).sum()
print("com=2的指数加权移动总和:")
print(ewm_sum_com)
print()

# 使用span参数
ewm_sum_span = data.ewm(span=5).sum()
print("span=5的指数加权移动总和:")
print(ewm_sum_span)
print()

# 使用halflife参数
ewm_sum_halflife = data.ewm(halflife=3).sum()
print("halflife=3的指数加权移动总和:")
print(ewm_sum_halflife)
print()

# 使用alpha参数
ewm_sum_alpha = data.ewm(alpha=0.3).sum()
print("alpha=0.3的指数加权移动总和:")
print(ewm_sum_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_sum_nan = data_with_nan.ewm(com=2).sum()
print("com=2的指数加权移动总和:")
print(ewm_sum_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_sum_df = df.ewm(com=2).sum()
print("com=2的指数加权移动总和:")
print(ewm_sum_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_sum_error = df_mixed.ewm(com=2).sum()
    print(ewm_sum_error)
except Exception as e:
    print(f"错误信息: {e}")
    print()

# 正确做法:使用numeric_only=True
ewm_sum_numeric = df_mixed.ewm(com=2).sum(numeric_only=True)
print("仅对数值列进行指数加权移动总和计算:")
print(ewm_sum_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).sum())
print()

print("com=5 (慢速衰减,更平均地考虑历史数据):")
print(test_data.ewm(com=5).sum())
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).sum()
print("com=2的指数加权移动总和:")
print(ewm_ts)
print()

# 示例7: 股票交易量分析示例
print("=== 示例7: 股票交易量分析示例 ===")
trade_volumes = pd.Series([1000, 1200, 800, 1500, 2000, 1800, 2200, 2500, 2100, 2800])
print("股票交易量数据:")
print(trade_volumes.values)
print()

# 计算不同参数的指数加权移动总和
ewm_sum_fast = trade_volumes.ewm(com=1).sum()  # 快速响应
ewm_sum_slow = trade_volumes.ewm(com=5).sum()  # 慢速响应

volume_analysis = pd.DataFrame({
    '交易量': trade_volumes,
    '快速EWMSum(com=1)': ewm_sum_fast,
    '慢速EWMSum(com=5)': ewm_sum_slow
})
print("交易量与不同参数的指数加权移动总和:")
print(volume_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     2.333333
2     4.222222
3     6.740741
4     9.796296
5    13.255556
6    17.037037
7    21.098765
8    25.400412
9    30.000275
dtype: float64

span=5的指数加权移动总和:
0     1.000000
1     2.333333
2     4.222222
3     6.740741
4     9.796296
5    13.255556
6    17.037037
7    21.098765
8    25.400412
9    30.000275
dtype: float64

halflife=3的指数加权移动总和:
0     1.000000
1     2.225368
2     4.069990
3     6.571184
4     9.715136
5    13.434545
6    17.638179
7    22.255215
8    27.221172
9    32.503539
dtype: float64

alpha=0.3的指数加权移动总和:
0     1.000000
1     2.300000
2     4.010000
3     6.107000
4     8.574900
5    11.382430
6    14.507701
7    17.935391
8    21.644773
9    25.613341
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     2.333333
2     2.333333
3     5.111111
4     8.052381
5    11.368254
6    15.022837
7    18.981891
8    23.201261
9    27.640847
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  2.333333  23.333333   233.333333
2  4.222222  42.222222   422.222222
3  6.740741  67.407407   674.074074
4  9.796296  97.962963   979.629630
5 13.255556 132.555556  1325.555556
6 17.037037 170.370370  1703.703704
7 21.098765 210.987654  2109.876543

=== 示例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  2.333333  23.333333
2  4.222222  42.222222
3  6.740741  67.407407
4  9.796296  97.962963

=== 示例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     2.333333
2     3.888889
4     6.592593
5     8.395062
6    10.263374
7    12.175583
dtype: float64

com=5 (慢速衰减,更平均地考虑历史数据):
0     1.000000
1     2.166667
2     3.638889
3     5.435185
4     7.520988
5     9.852160
6    12.391294
7    15.109382
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     233.333333
2023-01-03     233.333333
2023-01-04     511.111111
2023-01-05     805.238095
2023-01-06    1136.825397
2023-01-07    1502.283679
2023-01-08    1898.189119
Freq: D, dtype: float64

=== 示例7: 股票交易量分析示例 ===
股票交易量数据:
[1000 1200  800 1500 2000 1800 2200 2500 2100 2800]

交易量与不同参数的指数加权移动总和:
    交易量  快速EWMSum(com=1)  慢速EWMSum(com=5)
0  1000        1000.00        1000.00
1  1200        1400.00        1333.33
2   800        1066.67        1111.11
3  1500        1933.33        1370.37
4  2000        2622.22        1723.46
5  1800        2340.74        1963.91
6  2200        2853.58        2187.95
7  2500        3169.04        2395.31
8  2100        2612.36        2462.55
9  2800        3670.79        2652.13
关键要点
  1. sum() 方法计算的是指数加权移动窗口内所有非空值的总和,近期数据权重更高
  2. 可以通过 com(center of mass)、spanhalflifealpha 参数控制权重衰减速度
  3. NaN 值会被自动忽略,不影响其他值的计算
  4. numeric_only 参数对于包含非数值列的数据非常重要
  5. 指数加权移动总和比简单移动总和对数据变化更敏感,能更快反映趋势变化
  6. [engine] 参数允许指定计算引擎以优化性能
  7. 在金融分析中,指数加权移动总和常用于累积交易量等指标的计算
  8. 结果保留了原始数据的形状,便于后续分析和可视化
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

liuweidong0802

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

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

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

打赏作者

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

抵扣说明:

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

余额充值