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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:25:31