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

如何在Pandas DataFrame中应用ATR计算公式

解决ATR递推计算的问题

你的需求是基于前一行的Atr值,用公式 Atr = (prev_Atr * 13 + tr) / 14 计算后续行的Atr,直接用lambda表达式赋值是行不通的——因为lambda只是定义了函数逻辑,但没有处理行与行之间的依赖关系,也没有触发计算。下面是几种实用的实现方式:

方法1:直接循环(直观高效,适合小数据集)

利用索引遍历从第1行开始的每一行,直接引用前一行的Atr值进行计算:

import pandas as pd

# 构造目标DataFrame
data = {
    'tr': [0.00276, 0.01455, 0.00895, 0.00816, 0.00596, 0.00816, 0.00844, 0.01150, 0.00473, 0.00502],
    'Atr': [0.00276, None, None, None, None, None, None, None, None, None]
}
df = pd.DataFrame(data)

# 递推计算Atr
for i in range(1, len(df)):
    df.loc[i, 'Atr'] = (df.loc[i-1, 'Atr'] * 13 + df.loc[i, 'tr']) / 14

方法2:用iterrows遍历(可读性强)

通过遍历行对象,维护前一个Atr的变量来计算:

prev_atr = df.loc[0, 'Atr']
for idx, row in df.iloc[1:].iterrows():
    current_atr = (prev_atr * 13 + row['tr']) / 14
    df.loc[idx, 'Atr'] = current_atr
    prev_atr = current_atr

方法3:用expanding.apply实现(贴合pandas风格)

利用扩展窗口函数,自定义累积计算逻辑:

def calculate_atr(window):
    # 窗口第一个元素直接返回初始Atr
    if len(window) == 1:
        return window.iloc[0]
    # 取窗口倒数第二个值作为前一个Atr,结合当前行的tr计算
    prev_atr = window.iloc[-2]
    current_tr = df.loc[window.index[-1], 'tr']
    return (prev_atr * 13 + current_tr) / 14

df['Atr'] = df['Atr'].expanding().apply(calculate_atr)

为什么你的lambda写法无效?

你写的df["Atr"] = lambda x, y: (x * 13 + y)/14只是把一个匿名函数赋值给了Atr列,并没有传入实际的prev_Atr(x)和tr(y)参数进行计算。pandas的列赋值需要的是计算后的数值结果,而非函数对象,而且这种递推计算依赖前一行的结果,无法通过简单的向量化lambda实现。

内容的提问来源于stack exchange,提问作者Praisi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:10:35