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

