使用双公式计算Pandas Series的问题求助
解决Pandas中迭代计算平均增益(与Excel结果对齐)
问题分析
你需要实现的是类似RSI指标中的平均增益计算逻辑:
- 初始值:用
period个周期的滚动均值计算第一个有效平均增益 - 后续迭代值:使用平滑公式
(前一期平均增益 * (period-1) + 当前周期增益) / period
你之前的代码错误在于误用了avg_gain的当前值代替delta_up的实际增益值,同时Pandas的iloc直接修改可能存在视图/副本的赋值问题,导致结果与Excel偏差。
正确实现代码
import pandas as pd def calculate_avg_gain(data, periods): # 预处理数据 clean_data = data.dropna() delta = clean_data.diff() delta_up = delta.clip(lower=0) # 初始化avg_gain Series,保留索引对齐 avg_gain = pd.Series(index=delta_up.index, dtype='float64') # 计算初始值:第period个位置(索引从0开始)的滚动均值 initial_avg = delta_up.rolling(window=periods, min_periods=periods).mean() avg_gain.iloc[periods] = initial_avg.iloc[periods] # 迭代计算后续值 for i in range(periods + 1, len(delta_up)): prev_avg = avg_gain.iloc[i-1] current_gain = delta_up.iloc[i] avg_gain.iloc[i] = (prev_avg * (periods - 1) + current_gain) / periods return avg_gain
代码说明
- 初始化Series:创建与delta_up同索引的空Series,确保索引对齐,避免赋值错位
- 初始值计算:直接取滚动均值的第一个有效值(对应第period个数据点)
- 迭代逻辑:
- 从
periods+1位置开始遍历(初始值在periods位置) - 每一步取前一期的平均增益
prev_avg和当前周期的实际增益current_gain(来自delta_up) - 代入平滑公式计算当前值,直接赋值到avg_gain的对应位置
- 从
验证与Excel对齐
假设你有测试数据,比如:
# 模拟Excel中的测试数据 test_data = pd.Series([10, 12, 11, 13, 15, 14, 16, 18, 17, 19, 20, 22, 21, 23], name='price') avg_gain_result = calculate_avg_gain(test_data, periods=10)
此时计算出的avg_gain_result会和Excel中用相同逻辑计算的结果完全一致——严格遵循了初始值取前N个增益均值、后续值用平滑公式迭代的规则。
内容的提问来源于stack exchange,提问作者SebastianHeeg
相关产品推荐
相关产品推荐

