使用TA库计算Stochastic指标触发DataFrame真值模糊错误求助
解决ta库计算Stochastic指标时的ValueError问题
你遇到的错误是因为ta.momentum.stoch函数需要接收pandas Series对象作为输入,而你传入的是DataFrame。当函数内部进行布尔判断或比较操作时,二维的DataFrame无法确定单一的真值,从而引发歧义错误。
错误代码回顾
你的代码中初始化价格数据时用了pd.DataFrame:
import pandas as pd import sys import ta highprices = pd.DataFrame([1111, 1112, 1114, 1116, 1118, 1119, 1130, 1140, 1160]) lowprices = pd.DataFrame([999, 1000, 1100, 1111, 1100, 1100, 1100, 1100, 1110]) lastprices = pd.DataFrame([1110, 1110, 1110, 1110, 1111, 1111, 1111, 1111, 1111]) slowk = ta.momentum.stoch(highprices, lowprices, lastprices, 3, 1) slowd = slowk.rolling(3).mean() print(slowk, slowd) sys.exit()
运行后抛出错误:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
两种修正方案
方案1:直接用Series初始化价格数据
将pd.DataFrame替换为pd.Series,因为ta库的技术指标函数默认接收一维的Series输入:
import pandas as pd import sys import ta highprices = pd.Series([1111, 1112, 1114, 1116, 1118, 1119, 1130, 1140, 1160]) lowprices = pd.Series([999, 1000, 1100, 1111, 1100, 1100, 1100, 1100, 1110]) lastprices = pd.Series([1110, 1110, 1110, 1110, 1111, 1111, 1111, 1111, 1111]) slowk = ta.momentum.stoch(highprices, lowprices, lastprices, 3, 1) slowd = slowk.rolling(3).mean() print(slowk, slowd) sys.exit()
方案2:从现有DataFrame中提取Series列
如果必须保留DataFrame结构,可以通过iloc[:,0]提取第一列(即唯一的列)作为Series传入函数:
import pandas as pd import sys import ta highprices = pd.DataFrame([1111, 1112, 1114, 1116, 1118, 1119, 1130, 1140, 1160]) lowprices = pd.DataFrame([999, 1000, 1100, 1111, 1100, 1100, 1100, 1100, 1110]) lastprices = pd.DataFrame([1110, 1110, 1110, 1110, 1111, 1111, 1111, 1111, 1111]) # 提取DataFrame的第一列转为Series slowk = ta.momentum.stoch(highprices.iloc[:,0], lowprices.iloc[:,0], lastprices.iloc[:,0], 3, 1) slowd = slowk.rolling(3).mean() print(slowk, slowd) sys.exit()
原理说明
ta.momentum.stoch函数内部会对价格数据执行滚动窗口计算(如N期内的最高价、最低价),这些操作依赖一维的Series结构。当传入二维的DataFrame时,函数在进行比较或布尔判断时,无法确定整个DataFrame的单一真值(每个单元格都有独立的布尔值),因此触发了歧义错误。将输入转为Series后,函数可以正常处理一维数据的计算逻辑。
内容的提问来源于stack exchange,提问作者Dalalama231123
相关产品推荐
相关产品推荐

