Pyfolio自定义示例在Jupyter运行遇Pandas双版本报错求助
Pyfolio与Pandas版本兼容问题解决方案
问题描述
在OSX系统的Jupyter Notebook中运行自定义Pyfolio示例时,遇到两类版本相关报错:
- 使用Pandas>2.0.0时,触发报错:
AttributeError: 'Series' object has no attribute 'iteritems' - 使用Pandas<2.0.0时,触发报错:
IndexError: index -1 is out of bounds for axis 0 with size 0
当前基于最新版Pandas的操作流程:
- 创建包含
pyfolio、jupyter、pandas的requirements.txt - 执行
virtualenv --python python3 env创建虚拟环境 - 执行
source ./env/bin/activate激活虚拟环境 - 执行
pip3 install -r requirements.txt安装依赖包 - 启动Jupyter Notebook并运行示例代码,调用
pf.create_full_tear_sheet(returns, positions=positions, transactions=transactions)时触发报错,当前环境版本为pyfolio 0.9.2、pandas 2.1.4
解决方案
1. 解决Pandas>2.0.0的iteritems报错
Pyfolio 0.9.2未适配Pandas 2.0+的API变更——Pandas 2.0移除了Series.iteritems(),统一使用Series.items()替代。提供两种解决方式:
- 修改Pyfolio源码:找到虚拟环境中Pyfolio的安装路径(通常为
./env/lib/python3.x/site-packages/pyfolio),遍历tears.py、timeseries.py等核心文件,将所有series.iteritems()替换为series.items(),保存后重启Jupyter即可。 - 安装适配新版Pandas的Pyfolio分支:直接安装社区维护的适配版本,执行以下命令:
pip install git+https://github.com/quantopian/pyfolio.git@master
2. 解决Pandas<2.0.0的索引越界报错
该报错通常源于输入数据格式不符合Pyfolio要求或数据为空,按以下步骤排查修复:
- 检查
positions和transactions数据是否非空,且时间索引与returns的索引完全对齐。 - 确认
positions为标准DataFrame:行是时间戳,列是资产代码,单元格值对应持仓数量或市值。 - 确认
transactions为标准DataFrame:必须包含date、amount、price、symbol等必填字段,且字段格式符合Pyfolio预期。
推荐最优方案
优先选择适配Pandas 2.0+的Pyfolio版本,同时确保输入数据合规,操作步骤如下:
- 清理并重建虚拟环境:
rm -rf env virtualenv --python python3 env source ./env/bin/activate - 安装适配版依赖:
pip install jupyter pandas>=2.0 git+https://github.com/quantopian/pyfolio.git@master - 验证环境版本:
pip list | grep -E "pyfolio|pandas" - 重启Jupyter Notebook并重新运行示例代码,确认
pf.create_full_tear_sheet()可正常执行。
内容的提问来源于stack exchange,提问作者Sandro
相关产品推荐
相关产品推荐

