如何修复 pyfolio的报错
AttributeError: ‘numpy.int64’ object has no attribute ‘to_pydatetime’ 的报错?
最近使用Python跑回测,环境是Python+backtrader+pandas+pyfolio

Python 3.11.2
Name: pandas
Version: 2.0.0
Name: pyfolio
Version: 0.9.2
Name: backtrader
Version: 1.9.76.123

是如何引发报错的?

在执行以下语句的时候报错,位置是timeseries.py:1008

import pyfolio as pf
pf.create_full_tear_sheet(returns)
File ~\PycharmProjects\pythonProject\venv\Lib\site-packages\pyfolio\timeseries.py:1008, in gen_drawdown_table(returns, top)1003     df_drawdowns.loc[i, 'Duration'] = len(pd.date_range(peak,1004                                                         recovery,1005                                                         freq='B'))1006 df_drawdowns.loc[i, 'Peak date'] = (peak.to_pydatetime()1007                                     .strftime('%Y-%m-%d'))
-> 1008 df_drawdowns.loc[i, 'Valley date'] = (valley.to_pydatetime()1009                                       .strftime('%Y-%m-%d'))1010 if isinstance(recovery, float):1011     df_drawdowns.loc[i, 'Recovery date'] = recovery
AttributeError: 'numpy.int64' object has no attribute 'to_pydatetime'

报了什么错?

报错是因为valley是一个numpy.int64的类型,没有to_pydatetime的属性,但是peak是有该属性的,
因此追踪该属性出现的方法:pyfolio.timeseries.get_max_drawdown_underwater

借助new bing 翻译该方法含义

def get_max_drawdown_underwater(underwater):"""Determines peak, valley, and recovery dates given an 'underwater'DataFrame.An underwater DataFrame is a DataFrame that has precomputedrolling drawdown.Parameters----------underwater : pd.SeriesUnderwater returns (rolling drawdown) of a strategy.Returns-------peak : datetimeThe maximum drawdown's peak.valley : datetimeThe maximum drawdown's valley.recovery : datetimeThe maximum drawdown's recovery."""valley = np.argmin(underwater)  # end of the period # 找到 underwater 中最小值的索引,表示回撤期间的最低点,并赋值给 valley# Find first 0peak = underwater[:valley][underwater[:valley] == 0].index[-1] # 找到 underwater 从开始到 valley 索引的部分数据中第一个等于 0 的元素的索引,表示回撤期间的最高点,并赋值给 peak# Find last 0try:recovery = underwater[valley:][underwater[valley:] == 0].index[0] # 尝试找到 underwater 从 valley 索引开始的部分数据中第一个等于 0 的元素的索引,表示回撤期间的恢复点,并赋值给 recoveryexcept IndexError: # 如果没有找到这样的元素,就抛出 IndexError 异常recovery = np.nan  # drawdown not recovered # 把 recovery 赋值为 np.nan,表示回撤没有恢复return peak, valley, recovery # 返回 peak, valley, recovery 这三个变量的值

通过debug发现,peak、recovery,分别都获取到了 underwater : pd.Series 的索引,是一个日期datetime格式。

只有valley 是获取了underwater : pd.Series 索引对应的值,是一个numpy.int64的格式。

pd.Series是什么?

[Series 是 Python 中的一种数据结构,它是 pandas 库中提供的一种带标签的一维数组,可以存储任意数据类型,如整数、浮点数、字符串、Python 对象等] (https://zhuanlan.zhihu.com/p/131553804)12。Series 的每个元素都有一个索引,可以是默认的从 0 开始的整数,也可以是自定义的标签13。Series 可以用于数据分析和处理,提供了很多方便的方法和属性24。

通过newbing的解释结合debug,可以获知: underwater : pd.Series 索引是datetime日期,元素是numpy.int64

而该方法注释里说明了: valley : datetime The maximum drawdown's valley.

他的期望是一个datetime,实际却是一个numpy.int64,答案已经呼之欲出。

应该如何修改?

如何获取series某个下标的索引?

通过newbing 学习到

有两种方法可以获取 series 某个下标的索引:

  • 使用 index 属性,它返回一个包含所有索引值的列表,然后用下标访问列表中的元素。例如,如果 s 是一个 series 对象,那么 s.index [0] 就表示第一个索引值,s.index [-1] 就表示最后一个索引值。
  • 使用 iloc 属性,它返回一个索引器对象,可以用下标访问 series 中的元素。然后用 name 属性,可以获取元素对应的索引值。例如,如果 s 是一个 series 对象,那么 s.iloc [0].name 就表示第一个元素的索引值,s.iloc [-1].name 就表示最后一个元素的索引值。

valley的索引可以通过如下代码获取:

underwater.index[valley]

那么,只需要把最后一行的返回值修改一下就可以了:

def get_max_drawdown_underwater(underwater):valley = np.argmin(underwater)  # end of the period# Find first 0peak = underwater[:valley][underwater[:valley] == 0].index[-1]# Find last 0try:recovery = underwater[valley:][underwater[valley:] == 0].index[0]except IndexError:recovery = np.nan  # drawdown not recoveredreturn peak, underwater.index[valley], recovery

声明:

我的原来的技术栈是Android那块的,

Python跑回测是最近萌生的想法,连语法都不懂,学习中,

如果有不对的地方欢迎批评指正。

如何借助new bing修复 pyfolio: AttributeError: ‘numpy.int64‘ object has no attribute ‘to_pydatetime‘相关推荐

  1. import obspy报错‘numpy.int64‘ object has no attribute ‘split‘`

    line = line.split(comment, 1)[0] AttributeError: 'numpy.int64' object has no attribute 'split' impor ...

  2. Python 保存数组至.mat文件,报错:AttributeError: 'numpy.ndarray' object has no attribute 'items'

    Python保存数组的方式有很多种,如savetxt,但这个函数只能保存一维或二维数组.为了保存高维数组,同时能够在matlab载入,可以使用scipy.io.savemat()函数,例子: impo ...

  3. AttributeError: 'numpy.ndarray' object has no attribute 'value_counts'

    <python机器学习及实践>第二章第一个代码运行报错: AttributeError: 'numpy.ndarray' object has no attribute 'value_co ...

  4. [转载] AttributeError: ‘numpy.ndarray‘ object has no attribute ‘insert‘的解决方法

    参考链接: Python中的numpy.insert AttributeError: 'numpy.ndarray' object  has no attribute 'insert' 代码: imp ...

  5. 利用sns.boxplot绘制箱型图的时候报错:AttributeError: ‘numpy.ndarray‘ object has no attribute ‘boxplot‘

    (1)问题介绍 最近在做一个机器学习入门项目,鸢尾花种类的预测,在利用sns.boxplot()绘制箱型图的时候,程序报错: AttributeError: 'numpy.ndarray' objec ...

  6. 【Anaconda-Error】'numpy.ufunc' object has no attribute '__module__'

    运行mxnet的测试程序的时候报错如下: Traceback (most recent call last):   File "test_rec.py", line 4, in & ...

  7. [转载] python 调用自己的方法报错,numpy.ndarray object has no attribute brighten

    参考链接: Python中的numpy.eye 在使用python写美颜算法时,出现一个bug,AttributeError: 'numpy.ndarray' object has no attrib ...

  8. 成功解决AttributeError: 'collections.defaultdict' object has no attribute 'iteritems'

    成功解决AttributeError: 'collections.defaultdict' object has no attribute 'iteritems' 目录 解决问题 解决思路 解决方法 ...

  9. AttributeError: ‘pyltp.Postagger‘ object has no attribute ‘load‘

    环境: 组件 版本 ltp         4.0.8 pyltp 0.4.0 Python 3.6.10 报错代码如下: ## 代码片段import os import jieba from pyl ...

最新文章

  1. GitHub 高速上手 ---- 创建密钥,连接
  2. 用神经网络二分类理论重述双原子化合物的成键过程
  3. 0x0800 IP数据包格式分析
  4. hihocoder offer收割编程练习赛12 B 一面砖墙
  5. python基础===将Flask用于实现Mock-server
  6. 深度学习领域专业词汇_深度学习时代的人文领域专业知识
  7. 1个月时间整理了2019年上千道Java面试题,近500页文档!
  8. .net上传大文件不成功
  9. Linux复习-硬盘相关知识点
  10. Linux下udev详细介绍
  11. UGUI小技巧之Text随文本内容自动变化大小
  12. CSRF与XSS攻击的原理与防范
  13. 解决被卡巴斯基提示说KEY被列为黑名单
  14. 维修涉及行业2021-11-15
  15. 【观察】UCloud:决胜东南亚“正当时”,做出海企业“加速器”
  16. 关于node-pyg的路径问题导致build失败
  17. 网页播放全景视频和全景图片
  18. win10添加右键sublime打开方式
  19. S3C2440 开发板实战(10):signal async 异步通信
  20. PTA 7-152 百钱百鸡

热门文章

  1. Grafana 8.4.4安装
  2. 51单片机实训(二)————基于Proteus的花样流水灯设计
  3. Debian9 stretch xfce4桌面开启超时熄屏并锁屏不生效问题分析解决
  4. 编写一个程序实现两个一元多项式相加的运算。
  5. 云贝餐饮外卖020v2版v1.7.7 O2O新零售 外卖/店内/预定/排号 同城便民分类信息
  6. 摸鱼--页面透明化设置和QQ页面透明化设置
  7. 30万字的Java自学笔记免费分享啦,并谈谈我的编程自学心得体会
  8. Atlas800-9000 开发环境搭建
  9. 仿朋友圈功能 后台关系型数据库设计构想
  10. 计算机辅助教育自考真题,自考真题在线学习-考试类(爱考题)学习软件站