问题描述
我要读取历史的成分股,代码如下
trade_days_str = np.load('data/trade_days_str.npy')# 交易日数据文件
stocks_dict = dict() # 使用字典进行存储
for i in trade_days_str[-500:]:
print(i)
stocks = get_index_stocks('000905.XSHG', i)
stocks_dict[i]= stocks
print(stocks_dict)
# 字典的保存与读取
#保存
f = open('data//stocks_dict.txt','w')
f.write(str(stocks_dict))
f.close()
结果出现如下错误:
IOPub data rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
--NotebookApp.iopub_data_rate_limit.
Current values:
NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec)
NotebookApp.rate_limit_window=3.0 (secs)
这个问题要怎么解决啊?
解决方案
错误原因分析
您遇到的 IOPub data rate exceeded 错误是 Jupyter Notebook(JoinQuant 研究环境底层使用的工具)的一个常见保护机制。当您在一个代码单元格中尝试输出(print)的数据量过大、过快时,Jupyter 为了防止浏览器卡死或崩溃,会强制切断输出并抛出此警告。
在您的代码中,stocks_dict 包含了 500 个交易日的数据,每天对应 500 只中证500成分股的代码。当您执行 print(stocks_dict) 时,相当于一次性向屏幕输出几十万个字符,从而触发了该限制。
解决方案
1. 最直接的解决方法:取消打印大对象
既然错误是因为打印数据量过大引起的,最简单的解决办法就是不要打印整个大字典。您可以注释掉或删除 print(stocks_dict) 这一行。如果需要查看数据是否正确,可以只打印字典的键,或者打印其中一天的数据:
# 不要打印整个字典
# print(stocks_dict)
# 如果想检查,可以只打印一天的数据看看
print('数据获取完成,总天数:', len(stocks_dict))
# print(stocks_dict[trade_days_str[-1]])
2. 优化数据保存方式(最佳实践)
您目前使用 f.write(str(stocks_dict)) 将字典转换为字符串保存到 txt 文件中。这种方式虽然能存下来,但后续读取时非常麻烦(需要用 eval 或 ast.literal_eval 解析,容易出错且效率低)。
建议使用 Python 标准库 json 或 pickle 来保存字典数据。在 JoinQuant 环境中,推荐结合 json 模块进行保存。
修改后的完整代码如下:
import numpy as np
import json
from jqdata import *
# 假设 trade_days_str 已经正确加载
trade_days_str = np.load('data/trade_days_str.npy')
stocks_dict = dict()
for i in trade_days_str[-500:]:
# print(i) # 如果觉得打印 500 次太长,也可以注释掉,或者每 50 次打印一次进度
stocks = get_index_stocks('000905.XSHG', i)
stocks_dict[i] = stocks
print(f'成功获取 {len(stocks_dict)} 天的成分股数据。')
# 推荐使用 json 保存字典
file_path = 'data/stocks_dict.json'
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(stocks_dict, f)
print('数据已成功保存至', file_path)
# 后续读取的方法:
# with open(file_path, 'r', encoding='utf-8') as f:
# loaded_dict = json.load(f)
3. 使用 JoinQuant 专属 API 保存(可选)
如果您在 JoinQuant 的研究环境中,也可以直接使用平台提供的 write_file API 来保存文件,这在处理相对路径时更加方便:
import json
# 将字典转为 json 格式的字符串
json_str = json.dumps(stocks_dict)
# 使用 JoinQuant API 写入文件
write_file('stocks_dict.json', json_str, append=False)
print('保存成功!')
总结:遇到 IOPub data rate exceeded 时,核心原则就是减少控制台的输出量。将大数据的展示改为保存到文件,即可完美解决此问题。