You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整函数位置参数数量,解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:24:01