pandas使用math.isclose报TypeError: cannot convert the series to <class 'float'>如何解决
股票历史新高检测代码报错验证与修复
报错原因推测验证
你对报错原因的推测是正确的,可通过以下两种方法验证:
- 单值测试:取数据的某一行单值传入
math.isclose,执行math.isclose(data['High'].iloc[0], data['lifetime'].iloc[0], rel_tol=0.003),单值场景下无报错,说明函数本身逻辑没问题。 - 全量Series测试:直接执行
math.isclose(data['High'], data['lifetime'], rel_tol=0.003),会抛出完全相同的TypeError,可确认math模块的函数仅支持标量数值输入,无法直接处理pandas Series这类数组类参数。
该报错和你查到的参考问题「类型错误:无法将序列转换为<class 'float'>类型」描述完全一致,进一步佐证推测的正确性。
修复方案
直接替换math.isclose为numpy原生支持数组运算的np.isclose即可,修改后代码如下:
import pandas as pd from pandas_datareader import data as web import numpy as np import math data = web.DataReader('goog', 'yahoo') data['lifetime'] = data['High'].asfreq('D').rolling(window=999999, min_periods=1).max() # 检测是否为历史新高 data['lifetime'] = data['lifetime'].astype(float) # 替换math.isclose为支持数组运算的np.isclose data['isclose'] = np.where(np.isclose(data['High'], data['lifetime'], rtol = 0.003), 1, 0)
如果有逐行处理的需求,也可以用apply方法实现,但执行效率低于numpy向量化运算,适合小数据量场景:
data['isclose'] = data.apply(lambda x: 1 if math.isclose(x['High'], x['lifetime'], rel_tol=0.003) else 0, axis=1)
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

