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

Python生成交易信号'Call'列时触发KeyError:'Symbol'问题求助

排查KeyError: 'Symbol'问题及代码优化

一、先解决KeyError: 'Symbol'的核心问题

出现这个错误的原因无非两种,你可以按以下步骤快速排查:

  • 步骤1:确认CSV文件的列名
    在读取数据后立刻添加一行代码打印所有列名,确认是否存在Symbol列,以及列名的大小写/空格情况:
    dt = pd.read_csv(r"C:\Subhro\ML_Internship\MARUTI_2.csv")
    print("CSV文件的所有列名:", dt.columns.tolist())  # 新增这行用于排查
    
    如果输出里没有Symbol,那说明你的CSV里根本没有这个列——要么是你在修正代码时不小心引用了不存在的列,要么是你误把其他列名写成了Symbol(比如实际是小写的symbol,或者列名前后带空格)。
  • 步骤2:检查修正后的代码
    仔细扫一遍你修改后的代码,有没有任何地方写了data['Symbol']或者data.loc[:, 'Symbol']这类语句?如果有,要么删除这段逻辑,要么确认CSV里确实包含这个列。

二、原代码的其他问题优化

你的原代码还有几个可以改进的地方,比如循环效率极低、索引处理不够简洁,我帮你重新优化了代码,同时避免了循环带来的各种潜在问题:

优化后的完整代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 读取数据并预处理
dt = pd.read_csv(r"C:\Subhro\ML_Internship\MARUTI_2.csv")
data = dt.copy()  # 直接复制原数据,无需额外转成DataFrame
# 打印列名排查Symbol问题
print("CSV文件的所有列名:", data.columns.tolist())

# 删除不需要的列
data.drop(['Date', 'Unnamed: 0'], axis=1, inplace=True)

# 计算布林带指标
window = 14
data['Roll_Avg'] = data['Close Price'].rolling(window=window).mean()
data['Standard_Dev'] = data['Close Price'].rolling(window=window).std()
data['Upper_Band'] = data['Roll_Avg'] + 2 * data['Standard_Dev']
data['Lower_Band'] = data['Roll_Avg'] - 2 * data['Standard_Dev']

# 去掉前14行无指标数据的行(更简洁的写法)
data = data.iloc[window:]

# 初始化Call列,避免出现空值
data['Call'] = ''

# 用Pandas向量化条件判断代替循环(效率更高,更稳定)
# 按条件优先级从高到低赋值,避免被后续条件覆盖
data.loc[data['Close Price'] > data['Upper_Band'], 'Call'] = 'Short'
data.loc[(data['Close Price'] > data['Roll_Avg']) & (data['Close Price'] <= data['Upper_Band']), 'Call'] = 'Hold Short/Liquidate Buy'
data.loc[(data['Close Price'] >= data['Lower_Band']) & (data['Close Price'] <= data['Roll_Avg']), 'Call'] = 'Hold Buy/Liquidate Short'
data.loc[data['Close Price'] < data['Lower_Band'], 'Call'] = 'Buy'

print(data)

优化点说明

  • 去掉低效循环:用Pandas的loc结合布尔索引实现向量化操作,比逐个遍历索引快几十倍,还能避免索引匹配错误。
  • 简化数据处理:直接用data.iloc[14:]代替drop(data.head(14).index),代码更简洁易懂。
  • 初始化列:先创建空的Call列再赋值,避免出现部分行缺失值的情况。
  • 调整条件顺序:把优先级高的条件(比如突破上轨/下轨)放在前面,避免被后续条件覆盖。

三、如果还是出现Symbol错误

如果按上面的步骤排查后,还是出现KeyError: 'Symbol',那大概率是你的CSV文件列名有问题——比如第一行不是列名,或者列名里有隐藏的特殊字符。你可以尝试用pd.read_csv的header参数指定列名行,或者手动指定列名:

# 假设CSV的列是['Date', 'Close Price', 'Average Price', 'Unnamed: 0'],手动指定列名
data = pd.read_csv(r"C:\Subhro\ML_Internship\MARUTI_2.csv", header=0, names=['Date', 'Close Price', 'Average Price', 'Unnamed: 0'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:47:44