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

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



