You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用双公式计算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

代码说明

  1. 初始化Series:创建与delta_up同索引的空Series,确保索引对齐,避免赋值错位
  2. 初始值计算:直接取滚动均值的第一个有效值(对应第period个数据点)
  3. 迭代逻辑:
    • 从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:01:06