Pandas DataFrame数据比较报错:Series真值歧义问题求助
问题:Pandas DataFrame比较时报错:ValueError: The truth value of a Series is ambiguous
我用Pandas处理股票MACD数据,想通过大于/小于符号做条件判断,但运行代码时报错。相关信息如下:
代码
import time import json import requests import pandas as pd import numpy as np money = 0 def runfunction(): i = 0 go = True while go == True: #try: bought = False if googl_macd["macd"][i] >= 4 & bought != True: print("here") #do strategy if googl_macd["macd"][i] > googl_macd["signal"] & googl_macd["hist"] > 2.5: print("here") #alpacaorder("GOOGL", BUY) print("Bought at", googl["close"]) bought = True boughtprice = googl_macd["macd"] elif googl_macd["macd"] >= 4 and googl_macd["macd"] < googl_macd["signal"] & bought == True: #alpacaorder("GOOGL", SELL) print("Sold at", googl["close"]) sellprice = googl_macd["macd"] money += sellprice - boughtprice i += 1 #except Exception as e: #print(e) #go = False runfunction() print(money)
样本数据
macd signal hist 2020-01-02 0.000000 0.000000 0.000000 2020-01-03 -0.571168 -0.114234 -0.456934 2020-01-06 1.882773 0.285168 1.597606 2020-01-07 3.568536 0.941841 2.626695 2020-01-08 5.640760 1.881625 3.759135
报错信息
Traceback (most recent call last): File "c:\Users\zackz\Desktop\Zack-Emil.py", line 161, in <module> runfunction() File "c:\Users\zackz\Desktop\Zack-Emil.py", line 144, in runfunction if googl_macd["macd"][i] > googl_macd["signal"]: #& googl_macd["hist"] > 2.5: File "C:\Users\zackz\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pandas\core\generic.py", line 1537, in __nonzero__ raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
问题原因与解决方法
核心错误点
- 逻辑运算符误用:用了Pandas的按位运算符
&,而非Python的逻辑与and。&用于Series逐元素比较,而条件判断需要单个布尔值的逻辑连接。 - 未取单个元素:部分Series未加
[i]索引(比如googl_macd["signal"]),导致拿整个Series去和单个值比较,Pandas无法判断整个Series的布尔值,触发报错。 - 循环无终止条件:原while循环会无限执行直到索引越界。
- 全局变量未声明:修改全局变量
money时未用global声明,会被当成局部变量处理。 - 持仓状态逻辑错误:
bought变量放在循环内,每次循环都会重置为False,无法正确跟踪持仓状态。
修正后的代码
import pandas as pd import numpy as np # 构造样本数据(模拟已加载的股票数据) macd_data = { 'macd': [0.000000, -0.571168, 1.882773, 3.568536, 5.640760], 'signal': [0.000000, -0.114234, 0.285168, 0.941841, 1.881625], 'hist': [0.000000, -0.456934, 1.597606, 2.626695, 3.759135] } googl_macd = pd.DataFrame(macd_data, index=['2020-01-02', '2020-01-03', '2020-01-06', '2020-01-07', '2020-01-08']) googl = pd.DataFrame({'close': [1300, 1290, 1310, 1320, 1330]}, index=googl_macd.index) money = 0 def runfunction(): global money # 声明使用全局变量money i = 0 bought = False # 将持仓状态变量移到循环外,避免重置 while i < len(googl_macd): # 设置循环终止条件,防止索引越界 # 买入判断:MACD>=4且未持仓 if googl_macd["macd"][i] >= 4 and not bought: print("触发买入条件") # 细化策略:MACD上穿信号线且柱状图>2.5 if googl_macd["macd"][i] > googl_macd["signal"][i] and googl_macd["hist"][i] > 2.5: print("执行买入操作") print(f"买入价格:{googl['close'][i]}") bought = True boughtprice = googl_macd["macd"][i] # 卖出判断:MACD>=4且下穿信号线且已持仓 elif googl_macd["macd"][i] >= 4 and googl_macd["macd"][i] < googl_macd["signal"][i] and bought: print("执行卖出操作") print(f"卖出价格:{googl['close'][i]}") sellprice = googl_macd["macd"][i] money += sellprice - boughtprice bought = False # 卖出后重置持仓状态 i += 1 runfunction() print(f"总收益:{money}")
额外说明
- 加入了样本数据的构造代码,确保代码可直接运行测试。
- 调整了持仓状态变量的位置,保证交易逻辑连贯。
- 给输出信息增加了可读性描述,方便调试。
内容的提问来源于stack exchange,提问作者Shiny
相关产品推荐
相关产品推荐

