Zipline导入报错:无法导入'ABCIndexClass'及'normalize_date'问题咨询
解决Zipline导入时的两类兼容错误
我之前在部署Zipline的时候也碰到过一模一样的问题,本质都是Zipline旧版本和高版本pandas的API不兼容导致的。下面给你分享两种可行的解决思路:
方案一:降级pandas到兼容版本(推荐,最简单)
Zipline(尤其是1.x及更早版本)对pandas的版本限制非常严格,高版本pandas废弃了很多Zipline依赖的旧API。你可以直接把pandas降级到经过验证的兼容版本:
- 先卸载当前的pandas:
pip uninstall -y pandas
- 安装指定兼容版本(推荐
0.22.0,这个版本和Zipline 1.3.0及大部分旧版本适配性最好):
pip install pandas==0.22.0
- 如果安装后还有numpy相关的报错,可以顺便把numpy降级到
1.16.6(和pandas 0.22.0匹配):
pip install numpy==1.16.6
完成后重新导入Zipline,这两个错误应该都会消失。
方案二:手动修改Zipline源码适配高版本pandas(适合不想降级依赖的场景)
如果你的项目必须使用高版本pandas,可以手动修改Zipline的源码,替换那些废弃的API:
针对pandas.tslib相关的警告和normalize_date导入错误
- 打开报错的文件
/home/hadoop/anaconda3/lib/python3.6/site-packages/zipline/utils/calendars/exchange_calendar_ice.py,把第一行的:
from pandas.tslib import Timestamp
替换为:
from pandas import Timestamp
- 打开
/home/hadoop/anaconda3/lib/python3.6/site-packages/zipline/finance/trading.py,把:
from pandas.tslib import normalize_date
替换为:
from pandas.api.types import normalize_date
(如果替换后还是报错,可以尝试用pd.Timestamp(date).normalize()替代normalize_date(date)的调用)
针对ABCIndexClass导入错误
找到Zipline中导入ABCIndexClass的文件(通常是和索引相关的模块),把:
from pandas.tslib import ABCIndexClass
替换为:
from pandas.core.indexes.base import Index as ABCIndexClass
或者如果是用于类型检查,可以直接改用isinstance(obj, pd.Index)来替代。
这种方式需要你对Zipline的代码结构有一定了解,而且后续Zipline更新会覆盖你的修改,所以只推荐在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Jingwei WU
相关产品推荐
相关产品推荐

