如何借助new bing修复 pyfolio: AttributeError: ‘numpy.int64‘ object has no attribute ‘to_pydatetime‘
如何修复 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‘相关推荐
- import obspy报错‘numpy.int64‘ object has no attribute ‘split‘`
line = line.split(comment, 1)[0] AttributeError: 'numpy.int64' object has no attribute 'split' impor ...
- Python 保存数组至.mat文件,报错:AttributeError: 'numpy.ndarray' object has no attribute 'items'
Python保存数组的方式有很多种,如savetxt,但这个函数只能保存一维或二维数组.为了保存高维数组,同时能够在matlab载入,可以使用scipy.io.savemat()函数,例子: impo ...
- AttributeError: 'numpy.ndarray' object has no attribute 'value_counts'
<python机器学习及实践>第二章第一个代码运行报错: AttributeError: 'numpy.ndarray' object has no attribute 'value_co ...
- [转载] AttributeError: ‘numpy.ndarray‘ object has no attribute ‘insert‘的解决方法
参考链接: Python中的numpy.insert AttributeError: 'numpy.ndarray' object has no attribute 'insert' 代码: imp ...
- 利用sns.boxplot绘制箱型图的时候报错:AttributeError: ‘numpy.ndarray‘ object has no attribute ‘boxplot‘
(1)问题介绍 最近在做一个机器学习入门项目,鸢尾花种类的预测,在利用sns.boxplot()绘制箱型图的时候,程序报错: AttributeError: 'numpy.ndarray' objec ...
- 【Anaconda-Error】'numpy.ufunc' object has no attribute '__module__'
运行mxnet的测试程序的时候报错如下: Traceback (most recent call last): File "test_rec.py", line 4, in & ...
- [转载] python 调用自己的方法报错,numpy.ndarray object has no attribute brighten
参考链接: Python中的numpy.eye 在使用python写美颜算法时,出现一个bug,AttributeError: 'numpy.ndarray' object has no attrib ...
- 成功解决AttributeError: 'collections.defaultdict' object has no attribute 'iteritems'
成功解决AttributeError: 'collections.defaultdict' object has no attribute 'iteritems' 目录 解决问题 解决思路 解决方法 ...
- 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 ...
最新文章
- GitHub 高速上手 ---- 创建密钥,连接
- 用神经网络二分类理论重述双原子化合物的成键过程
- 0x0800 IP数据包格式分析
- hihocoder offer收割编程练习赛12 B 一面砖墙
- python基础===将Flask用于实现Mock-server
- 深度学习领域专业词汇_深度学习时代的人文领域专业知识
- 1个月时间整理了2019年上千道Java面试题,近500页文档!
- .net上传大文件不成功
- Linux复习-硬盘相关知识点
- Linux下udev详细介绍
- UGUI小技巧之Text随文本内容自动变化大小
- CSRF与XSS攻击的原理与防范
- 解决被卡巴斯基提示说KEY被列为黑名单
- 维修涉及行业2021-11-15
- 【观察】UCloud:决胜东南亚“正当时”,做出海企业“加速器”
- 关于node-pyg的路径问题导致build失败
- 网页播放全景视频和全景图片
- win10添加右键sublime打开方式
- S3C2440 开发板实战(10):signal async 异步通信
- PTA 7-152 百钱百鸡
热门文章
- Grafana 8.4.4安装
- 51单片机实训(二)————基于Proteus的花样流水灯设计
- Debian9 stretch xfce4桌面开启超时熄屏并锁屏不生效问题分析解决
- 编写一个程序实现两个一元多项式相加的运算。
- 云贝餐饮外卖020v2版v1.7.7 O2O新零售 外卖/店内/预定/排号 同城便民分类信息
- 摸鱼--页面透明化设置和QQ页面透明化设置
- 30万字的Java自学笔记免费分享啦,并谈谈我的编程自学心得体会
- Atlas800-9000 开发环境搭建
- 仿朋友圈功能 后台关系型数据库设计构想
- 计算机辅助教育自考真题,自考真题在线学习-考试类(爱考题)学习软件站