3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化平台中,get_history 和 get_price 接口在不同版本(如主干版本与2022补丁版本)之间返回数据格式发生变化,根本原因是底层 Python 环境及 Pandas 库版本的升级。
具体来说,旧版本环境基于 Python 3.5,而新版本环境升级到了 Python 3.11。在较早的 Pandas 版本中,多维数据通常使用 pandas.Panel 对象来存储;但在较新的 Pandas 版本中,Panel 对象已经被官方彻底废弃。因此,ptrade 平台为了适配新版 Pandas,对多股票、多字段查询时的返回数据结构进行了重构,统一改用 pandas.DataFrame。
根据 ptrade API 文档,差异主要体现在查询多只股票的场景下:
pandas.DataFrame,行索引是时间(datetime),列索引是股票代码。pandas.Panel 对象。items 轴是行情字段(如 'open', 'close'),里面包含多个 DataFrame,每个 DataFrame 的列索引是股票代码。pandas.DataFrame。行索引是时间(datetime),列索引是行情字段,并且新增了一列 code 用于标识股票代码。(注:对于单只股票的查询,两个版本均返回 DataFrame,行索引为时间,列索引为行情字段,变化不大。)
如果您的策略从旧版本迁移到新版本,或者需要编写兼容性更好的代码,建议采取以下适配方案:
query 方法筛选数据(针对 Python 3.11)在新版本中,由于返回的是带有 code 列的长表 DataFrame,您需要使用 Pandas 的 query 方法来提取特定股票的数据。
# 获取多只股票数据
dataframe_info = get_history(2, frequency='1d', field=['open','close'], security_list=['600570.SS', '600571.SS'])
# 提取特定股票 (600570.SS) 的数据
df_600570 = dataframe_info.query('code in ["600570.SS"]')
为了避免 Pandas 版本差异带来的兼容性问题,并且提升数据获取速度,强烈建议在调用 get_history 和 get_price 时,传入 is_dict=True 参数。
# 使用 is_dict=True 返回字典格式
his_dict = get_history(5, '1d', 'close', security_list=['600570.SS', '600571.SS'], is_dict=True)
# 返回格式为 OrderedDict,结构清晰且不受 Pandas 版本影响
# OrderedDict([('600570.SS', array([...])), ('600571.SS', array([...]))])
使用字典格式不仅能完美避开 Panel 和 DataFrame 的结构差异,还能在底层获得更快的取数性能,是编写稳健 ptrade 策略的最佳实践。