我有两个数据帧:
lastrongignal:
Unnamed: 0 coresym Lots open_orders direction
0 0 AUDUSD 110.39 0.0 9.0
1 1 EURUSD 88.19 0.0 9.0
2 2 GBPUSD -87.65 0.0 9.0
信号:
coresym Lots open_orders direction
0 AUDUSD 250.00 0.0 1.0
1 EURUSD 112.50 0.0 0.0
2 GBPUSD -97.11 0.0 0.0
我想根据lastrongignal:更改信号的值
if ((last_signal[last_signal['coresym']=='AUDUSD']['direction'] == 9) & (signal[signal['coresym']=='AUDUSD']['Lots'] >100)):
signal[signal['coresym']=='AUDUSD']['direction'] = 9
我得到错误
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-36-0b88b27047e9> in <module>
----> 1 if ((last_signal[last_signal['coresym']=='AUDUSD']['direction'] == 9) & (signal[signal['coresym']=='AUDUSD']['Lots'] >100)):
2 signal[signal['coresym']=='AUDUSD']['direction'] = 9
~anaconda3libsite-packagespandascoregeneric.py in __nonzero__(self)
1327
1328 def __nonzero__(self):
-> 1329 raise ValueError(
1330 f"The truth value of a {type(self).__name__} is ambiguous. "
1331 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我试着调试自己:
last_signal[last_signal['coresym']=='AUDUSD']['direction'] == 9
0 True
Name: direction, dtype: bool
signal[signal['coresym']=='AUDUSD']['Lots'] >100
0 True
Name: Lots, dtype: bool
((last_signal[last_signal['coresym']=='AUDUSD']['direction'] == 9) & (signal[signal['coresym']=='AUDUSD']['Lots'] >100))
0 True
dtype: bool
我真的不明白为什么,我想其他人可能也有同样的问题,所以我把它贴在这里
如果你从最终输出中注意到,在应用所有操作后,你会得到一个序列,因此你不能像这样得到它的真值:
condition = ((last_signal[last_signal['coresym']=='AUDUSD']['direction'] == 9) & (signal[signal['coresym']=='AUDUSD']['Lots'] >100))
truth_value = bool(condition) # will give you the current error
因此,您的if
声明存在问题。为了克服它,做这个
if condition.any():
# your code
对于包含单个True
的序列的.any()
(至少一个True
足以使.any()
评估为True
(将评估为True
。所以基本上这样做:
if ((last_signal[last_signal['coresym']=='AUDUSD']['direction'] == 9) & (signal[signal['coresym']=='AUDUSD']['Lots'] >100)).any():
signal[signal['coresym']=='AUDUSD']['direction'] = 9
由于使用&
后得到的序列只包含一个布尔值,因此也可以使用.bool()
:
((last_signal[last_signal['coresym']=='AUDUSD']['direction'] == 9) & (signal[signal['coresym']=='AUDUSD']['Lots'] >100)).bool()