Python Pandas计算EMA对比K线收盘价时出现KeyError及值异常问题
问题修复方案
根因分析
KeyError: 'worth'报错原因:未提前在DataFrame中初始化worth列,直接对不存在的列做索引赋值会触发该错误。- 历史值同步变更、判定结果不符合预期的原因:
- 循环内的判定条件写死了用
last_fifty_rows对应行的EMA和收盘价做判断,全程使用同一个固定行的数值,没有调用当前循环行current的数值 - 去掉
[current]索引后,赋值操作会把整个worth列都设为同一个值,自然所有历史行都会同步变更 - 原判定逻辑漏掉了ema等于close场景的首行边界处理,第一行(
last_fifty_rows对应行)没有上一行的值可以继承,会触发索引异常
- 循环内的判定条件写死了用
修正后代码
import pandas as pd import ta # 提前初始化worth列,避免KeyError报错 df['worth'] = False last_fifty_rows = len(df.index) - 100 # 计算100周期EMA df['ema'] = ta.trend.ema_indicator(df['close'], 100) for current in range(last_fifty_rows, len(df.index)): # 取当前循环行的ema和收盘价做差值计算 ema_close_diff = df.loc[current, 'ema'] - df.loc[current, 'close'] if ema_close_diff < 0: df.loc[current, 'worth'] = True elif ema_close_diff > 0: df.loc[current, 'worth'] = False else: # 差值等于0时继承上一行的worth值,补充首行边界判断避免索引报错 if current > last_fifty_rows: df.loc[current, 'worth'] = df.loc[current-1, 'worth'] print(df.tail(5))
核心修改点说明
- 提前初始化
worth列,解决KeyError报错问题 - 把判定条件里的固定行索引
last_fifty_rows替换为当前循环索引current,每行都用自身的EMA和收盘价做判定 - 采用
df.loc的方式做行索引赋值,符合Pandas语法规范,避免链式索引警告 - 补充首行边界判断,避免差值等于0时首行取上一行值触发索引错误
内容的提问来源于stack exchange,提问作者Pavan Alur
相关产品推荐
相关产品推荐

