在Pandas中创建新列时触发KeyError: '0'错误的技术求助
问题描述
在Pandas DataFrame中使用py_vollib_vectorized库计算隐含波动率时,触发KeyError: '0'错误。相关代码如下:
val_1 = [data['OPTION_TYP'] == 'CE',data['OPTION_TYP'] == 'PE'] val_2 = ['c','p'] data['FLAG'] = np.select(val_1,val_2) r=0.1 data['t'] = data['DTE']/365 idf['LINK'] = idf['DATE'].astype(str) + idf['SYMBOL'] data['LIK'] = data['TIMESTAMP'].astype(str) + data['SYMBOL'] data = data.merge(idf,left_on='LIK',right_on='LINK',how='inner') data = data[['INSTRUMENT','SYMBOL_x','EXPIRY_DT','STRIKE_PR','OPTION_TYP','CLOSE_x','TIMESTAMP','DTE','t','FLAG','CLOSE_y']] data.rename(columns = {'CLOSE_x':'OPT_CLOSE' , 'CLOSE_y':'SPOT_CLOSE'} , inplace =True) data['IV'] = vectorized_implied_volatility(data['OPT_CLOSE'],data['SPOT_CLOSE'],data['STRIKE_PR'],data['t'],r,data['FLAG']) data
报错堆栈信息:
KeyError Traceback (most recent call last) > ~\AppData\Local\Temp\ipykernel_16596\1435533800.py in <module> 9 data = data[['INSTRUMENT','SYMBOL_x','EXPIRY_DT','STRIKE_PR','OPTION_TYP','CLOSE_x','TIMESTAMP','DTE','t','FLAG','CLOSE_y']] 10 data.rename(columns = {'CLOSE_x':'OPT_CLOSE' , 'CLOSE_y':'SPOT_CLOSE'} , inplace =True) 11 data['IV'] = vectorized_implied_volatility(data['OPT_CLOSE'],data['SPOT_CLOSE'],data['STRIKE_PR'],data['t'],r,data['FLAG']) 12 data > ~\anaconda3\lib\site-packages\py_vollib_vectorized\implied_volatility.py in vectorized_implied_volatility(price, S, K, t, r, flag, q, on_error, model, return_as, dtype, **kwargs) 40 array([0.02621257, 0.12585767]) 41 """ 42 flag = _preprocess_flags(flag, dtype) 43 price, S, K, t, r, flag = maybe_format_data_and_broadcast(price, S, K, t, r, flag, dtype=dtype) 44 _validate_data(price, S, K, t, r, flag) > ~\anaconda3\lib\site-packages\py_vollib_vectorized\util\data_format.py in _preprocess_flags(flags, dtype) 9 10 def _preprocess_flags(flags, dtype): 11 return np.array([binary_flag[f] for f in flags], dtype=dtype) 12 13 > ~\anaconda3\lib\site-packages\py_vollib_vectorized\util\data_format.py in <listcomp>(.0) 9 10 def _preprocess_flags(flags, dtype): 11 return np.array([binary_flag[f] for f in flags], dtype=dtype) 12 13
具体错误:KeyError: '0'
错误原因
错误源于_preprocess_flags函数:该函数会遍历传入的flag序列,用每个值匹配binary_flag字典的键。出现KeyError: '0'说明data['FLAG']列中存在值为'0'的行,而binary_flag仅接受'c'/'C'或'p'/'P'作为合法键。
问题本质是生成FLAG列时,调用np.select未指定default参数:当val_1中的两个条件都不满足时,np.select会默认填充0,导致FLAG列混入非预期的0值。
解决方法
方法1:为np.select添加默认值
确保所有行都能映射到合法的'c'或'p',可根据实际需求设置default参数:
val_1 = [data['OPTION_TYP'] == 'CE', data['OPTION_TYP'] == 'PE'] val_2 = ['c', 'p'] # 针对不满足CE/PE条件的行,默认设为'c',可按需调整 data['FLAG'] = np.select(val_1, val_2, default='c')
方法2:先清理异常数据
先检查OPTION_TYP列的异常值,再过滤无效行:
# 查看OPTION_TYP的所有唯一值,确认是否存在非CE/PE的情况 print(data['OPTION_TYP'].unique()) # 仅保留OPTION_TYP为CE或PE的行 data = data[data['OPTION_TYP'].isin(['CE', 'PE'])] # 再生成FLAG列 data['FLAG'] = np.select(val_1, val_2)
内容的提问来源于stack exchange,提问作者smg_08
相关产品推荐
相关产品推荐

