如何在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
相关产品推荐
相关产品推荐

