问题描述
开启set_option("avoid_future_data", True)出现以下报错,是我的代码有问题,还是聚宽有问题?以下为LOG:
2020-02-04 09:40:00 - WARNING - /tmp/jqcore/jqdata/jqdata/apis/db.py:352: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
pub_date_idx_list = pub_date_df[pub_date_df['actual_unlimited_date']==convert_date(row.day)][pub_date_df['code']==row.code].index
解决方案
您好!出现这个提示不是您的代码有问题,而是聚宽(JoinQuant)底层库的代码引发的警告。
详细原因分析
-
这是一个警告(Warning)而非错误(Error)
日志中明确标明了WARNING和UserWarning。这意味着程序并没有崩溃或停止运行,只是 Python 的 Pandas 库在提醒开发者某段代码的写法不推荐。 -
报错指向了聚宽的底层代码
从日志路径/tmp/jqcore/jqdata/jqdata/apis/db.py:352可以看出,触发警告的代码位于聚宽的jqdata核心库中。当您开启set_option("avoid_future_data", True)时,底层引擎在过滤未来数据时执行了这行代码。 -
Pandas 链式布尔索引问题
引发警告的具体代码是:
pub_date_df[pub_date_df['actual_unlimited_date']==convert_date(row.day)][pub_date_df['code']==row.code]
在较新的 Pandas 版本中,连续使用两个中括号进行布尔索引(即链式索引)会触发Boolean Series key will be reindexed警告。规范的写法应该是使用&符号连接两个条件:
pub_date_df[(pub_date_df['actual_unlimited_date']==convert_date(row.day)) & (pub_date_df['code']==row.code)]
解决建议
- 直接忽略:由于这只是一个警告,并不会影响您策略的逻辑和最终的回测/模拟结果,您可以安全地忽略它。
- 关闭警告显示(可选):如果您觉得日志太乱,可以在策略的
initialize函数中加入 Python 的 warnings 模块来屏蔽此类警告(不过通常不建议屏蔽所有警告,以免漏掉重要信息):import warnings warnings.filterwarnings('ignore', category=UserWarning, module='pandas') - 向官方反馈:您可以将此日志反馈给聚宽官方客服或在社区发帖,提醒官方开发人员在后续的系统更新中优化
jqdata/apis/db.py中的 Pandas 语法。