You need to enable JavaScript to run this app. Python Pandas计算EMA对比K线收盘价时出现KeyError及值异常问题
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas计算EMA对比K线收盘价时出现KeyError及值异常问题

问题修复方案

根因分析

  • KeyError: 'worth'报错原因:未提前在DataFrame中初始化worth列,直接对不存在的列做索引赋值会触发该错误。
  • 历史值同步变更、判定结果不符合预期的原因:
    1. 循环内的判定条件写死了用last_fifty_rows对应行的EMA和收盘价做判断,全程使用同一个固定行的数值,没有调用当前循环行current的数值
    2. 去掉[current]索引后,赋值操作会把整个worth列都设为同一个值,自然所有历史行都会同步变更
    3. 原判定逻辑漏掉了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 00:57:02