应用自定义函数处理Tick数据时触发Series真值歧义错误求助
解决Pandas中"The truth value of a Series is ambiguous"错误
错误原因
你写的函数里,x > ES_Data['Bid']是把单个元素和整个Bid列(Series)做比较,得到的是一个布尔值Series。if语句无法直接判断整个Series的真假,这就是报错的根源。而且逻辑上你应该逐行对比当前行的价格和当前行的Bid,而非和整列对比。
正确写法(优先用矢量化操作,效率更高)
假设你的DataFrame包含Price(最新价格)、Bid、Volume列,直接用NumPy的np.where实现条件赋值:
import numpy as np # 生成带符号的成交量:价格高于Bid则为正(主动买入),否则为负(主动卖出) ES_Data['Signed_Volume'] = np.where(ES_Data['Price'] > ES_Data['Bid'], ES_Data['Volume'], -ES_Data['Volume'])
也可以用Pandas的loc方法实现:
# 先默认所有成交量为负 ES_Data['Signed_Volume'] = -ES_Data['Volume'] # 对价格高于Bid的行,将成交量设为正 ES_Data.loc[ES_Data['Price'] > ES_Data['Bid'], 'Signed_Volume'] = ES_Data['Volume']
如果一定要用自定义函数(不推荐,数据量大时效率低)
如果坚持用apply,需要修改函数逻辑,让它处理单行数据而非单个元素:
def VD(row): if row['Price'] > row['Bid']: return row['Volume'] else: return -row['Volume'] # axis=1表示按行应用函数 ES_Data['Signed_Volume'] = ES_Data.apply(VD, axis=1)
内容的提问来源于stack exchange,提问作者Sean Simms
相关产品推荐
相关产品推荐

