pandas遍历行调用np.log报numpy.float64不可调用错误如何解决
错误原因及解决方案
1 核心报错诱因
你遇到的报错:
TypeError: 'numpy.float64' object is not callable
90%以上的概率是你之前的运行过程中意外将np.log这个numpy自带的函数,赋值成了一个浮点数类型的变量,覆盖了原函数定义。后续你再用np.log(xxx)调用计算时,相当于尝试对一个浮点数加括号执行,直接触发类型错误。
另外你的代码还存在变量名不匹配的逻辑问题:循环内你定义的首行收盘价变量是first_row_price,但计算对数比值时除以的reference_price是完全未定义的变量,即使解决了函数覆盖问题也会直接报变量未定义错误。
2 修正方案
第一步:重置运行环境
重启你的Python运行内核(Jupyter/VS Code/PyCharm都直接重启运行环境即可),清除之前的错误变量赋值,确保np.log指向原生的对数计算函数。
第二步:优化代码逻辑
你完全不需要用for循环遍历行,pandas的向量化运算效率远高于手动循环,直接一行代码就能得到所有行的计算结果:
import pandas as pd import numpy as np # 直接向量化计算所有行的current_close_price/first_row_close_price自然对数值 price['log_rt'] = np.log(price['Close'] / price['Close'].iloc[0])
如果你确实需要保留for循环写法的话,修正后的循环代码如下:
# 首行价格只需要提取一次,不要放在循环内重复计算浪费性能 first_row_price = price.iloc[0,0] for index, row in price.iterrows(): current_price = row['Close'] log_rt = np.log(current_price / first_row_price) # 此处添加你需要的后续处理逻辑,例如将log_rt存入新列 price.loc[index, 'log_rt'] = log_rt
内容的提问来源于stack exchange,提问作者Gloria Dalla Costa
相关产品推荐
相关产品推荐

