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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 15:06:06