Python股票程序如何编写更简洁?如何规避KeyError与列表索引越界错误?
解决方案
1. 列表索引越界问题处理
你目前直接按下标取列表元素的写法,只要财报列表长度不足就会触发报错,建议封装通用取值工具函数,缺失值统一用Python内置的float('nan')标记:
import math def get_eps_value(eps_list, index, key): # 校验列表有效性和长度 if not eps_list or len(eps_list) <= index: return float('nan') item = eps_list[index] # 校验字典有效性和键存在性 if not isinstance(item, dict) or key not in item: return float('nan') val = item[key] # 校验值为数值类型 return val if isinstance(val, (int, float)) else float('nan')
你的原有业务代码可以简化为:
stock_eps = get_earnings_history('STOCK') stock_latest_eps4_rate = get_eps_value(stock_eps, 4, "epsactual") stock_latest_eps4_date = get_eps_value(stock_eps, 4, "startdatetime")
float('nan')是Python标准的数值空值标记,后续做数值计算、条件判断时都不会和真实业务值冲突,判断空值只要用math.isnan(变量)即可。
2. 字典缺Key问题处理
不需要手动写None判断逻辑,直接用Python字典内置的get()方法,找不到对应键时直接返回预设的默认值即可:
mapping = stock.info # 字符串类型字段缺值返回空字符串 stock_sec = mapping.get('sector', '') # 数值类型字段缺值返回nan trailing_pe = mapping.get('trailingPE', float('nan'))
后续条件判断写法参考:
# 市盈率有效值判断 if not math.isnan(trailing_pe) and trailing_pe < 10: # 低市盈率业务逻辑 pass # 行业字段有效值判断 if stock_sec: # 行业分类逻辑 pass
额外优化建议
- 把通用的数据清洗、取值逻辑抽成独立的
.py工具文件,在Jupyter Notebook中导入使用,3000行单文件的维护成本极高,抽离后冗余代码会大幅减少 - 所有空值统一约定标记:数值类用
float('nan'),字符串类用'',不要用-1、0这类有实际业务含义的数值当空标记,避免后续逻辑冲突 - 批量处理时可以把原始数据转为pandas DataFrame结构,内置了大量缺失值处理、统计计算的原生方法,当前9秒的分析耗时还有很大优化空间
内容的提问来源于stack exchange,提问作者Anon Omiss
相关产品推荐
相关产品推荐

