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=0twixt−i
参数说明
-
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
关键要点
sum()方法计算的是指数加权移动窗口内所有非空值的总和,近期数据权重更高- 可以通过
com(center of mass)、span、halflife或alpha参数控制权重衰减速度 - NaN 值会被自动忽略,不影响其他值的计算
numeric_only参数对于包含非数值列的数据非常重要- 指数加权移动总和比简单移动总和对数据变化更敏感,能更快反映趋势变化
- [engine] 参数允许指定计算引擎以优化性能
- 在金融分析中,指数加权移动总和常用于累积交易量等指标的计算
- 结果保留了原始数据的形状,便于后续分析和可视化
2247

被折叠的 条评论
为什么被折叠?



