如何调整函数位置参数数量,解决Pandas apply调用OI函数的参数报错
报错解决方法
核心报错的修复方案
你遇到的TypeError是因为DataFrame.apply()调用传入的函数时,会默认将当前迭代的行/列作为第一个位置参数传给目标函数,你定义的OI()没有设置形参接收该参数,因此触发参数数量不匹配错误。
仅修复这个参数报错,只需要给OI函数添加1个形参即可,哪怕你暂时不需要使用这个参数:
# 仅修复参数数量错误的示例,后续逻辑仍需调整 def OI(row): # 你的逻辑代码 pass
其余伴随问题修复
你的代码还存在多处逻辑问题,即使修复参数报错也无法正常运行,需要一并调整:
sigmaV_B、sigmaV_A是函数对象,没有加()调用就直接相减属于无效运算- 两个sigma函数内部直接对整列做
if判断,会触发ValueError: The truth value of a Series is ambiguous错误 - 跨行取前一行值的逻辑不需要用
apply逐行计算,直接用pandas矢量化运算效率更高
完整可运行代码
import pandas as pd # 矢量化计算sigmaV_B mask_b1 = data['BidPrice'].shift(1) - data['BidPrice'] > 0 mask_b2 = data['BidPrice'].shift(1) - data['BidPrice'] == 0 sigmaV_B = pd.Series(index=data.index) sigmaV_B[mask_b1] = 0 sigmaV_B[mask_b2] = data['BidVolume'] - data['BidVolume'].shift(1) sigmaV_B[~(mask_b1 | mask_b2)] = data['BidVolume'] # 矢量化计算sigmaV_A mask_a1 = data['AskPrice'] - data['AskPrice'].shift(1) > 0 mask_a2 = data['AskPrice'] - data['AskPrice'].shift(1) == 0 sigmaV_A = pd.Series(index=data.index) sigmaV_A[mask_a1] = 0 sigmaV_A[mask_a2] = data['AskVolume'] - data['AskVolume'].shift(1) sigmaV_A[~(mask_a1 | mask_a2)] = data['AskVolume'] # 直接生成OI列,不需要调用apply data['OI'] = sigmaV_B - sigmaV_A
内容的提问来源于stack exchange,提问作者lee ho wang
相关产品推荐
相关产品推荐

