python - 在执行范围分箱时处理 Python 中的值错误
问题描述
我正在尝试将 pandas 列值分类为范围值。但是当我使用Bisect时出现值错误
from pandas_datareader import data
import pandas
import bisect
import fix_yahoo_finance as yf
yf.pdr_override()
df = data.get_data_yahoo('SPY', '2015-01-01', '2018-04-05')
df.tail(2)
def Daily_Returns(A, B):
return (B - A)*100/A
df['OC_Return_%'] = Daily_Returns(df['Open'], df['Close'])
def b(value):
intervals = ['Less Than -10 %','-10% to -5%','-5% to -2.5%','-2.5% to -2%','-2% to -1.5%','-1.5% to -1%','-1% to -0.5%','-0.5% to 0%','0% to 0.5%','0.5% to 1%','1% to 1.5%','1.5% to 2%','2% to 2.5%','2.5% to 5%','5% to 10%','Greater Than 10 %']
return intervals[bisect.bisect_left([-float('inf'),-10,-5,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,5,10,float('inf')], value)-1]
df['OC_Return_Bin'] = b(df["OC_Return_%"])
df
如果我使用 a.any() 或 a.all(),错误就会消失。但它用错误的值填充结果列。
这是评论中要求的整个追溯。
ValueError Traceback (most recent call last)
<ipython-input-80-a571e502f6a6> in <module>()
17 return intervals[bisect.bisect_left([-float('inf'),-10,-5,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,5,10,float('inf')], value)-1]
18
19 df['OC_Return_Bin'] = b(df["OC_Return_%"])
20 df
<ipython-input-80-a571e502f6a6> in b(value)
15 def b(value):
16 intervals = ['Less Than -10 %','-10% to -5%','-5% to -2.5%','-2.5% to -2%','-2% to -1.5%','-1.5% to -1%','-1% to -0.5%','-0.5% to 0%','0% to 0.5%','0.5% to 1%','1% to 1.5%','1.5% to 2%','2% to 2.5%','2.5% to 5%','5% to 10%','Greater Than 10 %']
17 return intervals[bisect.bisect_left([-float('inf'),-10,-5,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,5,10,float('inf')], value)-1]
18
19 df['OC_Return_Bin'] = b(df["OC_Return_%"])
C:\Users\USER\Anaconda2\lib\site-packages\pandas\core\generic.pyc in __nonzero__(self)
953 raise ValueError("The truth value of a {0} is ambiguous. "
954 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
955 .format(self.__class__.__name__))
956
957 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
解决方案
问题是您的函数“b”不能处理一系列值,它只能处理单个值。为了修复它,您可以使用DataFrame.apply,例如,df['OC_Return_Bin'] = df["OC_Return_%"].apply(b)
或者使其能够与系列一起使用。
推荐阅读
- c# - 反正有没有得到控制台光标所在的字符?
- python - 具有不同颜色编码和不同标记的 Sns 散点图
- sql-server - 如何使用 EF Core Fluent API 使用 IGNORE_DUP_KEY 定义索引
- javascript - Serenity/JS - 如何测试文件下载?
- redis - Nextcloud 更新后内存缓存出现问题
- java - JPA 转换器对“convertToDatabaseColumn”的不必要调用导致 ClassCastException
- kubernetes - GKE Kubernetes 集群从一个组织迁移到另一个组织后使用 kubectl 的权限错误
- android-mediaplayer - 如何使用 MediaPlayer#_prepare() C++ 源代码?
- javascript - 如何在可编辑的 DIV 中输出原始 HTML 代码
- ethereum - 批准时无法添加流动性