The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()


次のコードを実行します.
condition1 = df['MACD'] < 0 and df['MACD'].shift(3) > 0
condition2 = df['DIF'] < 0 and df['DIF'].shift(3) > df['DEA']
condition3 = df['volume'] > df['volume_ma']*n
df.loc[condition1 & condition2 & condition3, 'signal_short'] = 1

エラー:
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
  File "C:\Users\kawujeilu\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py", line 121, in worker
    result = (True, func(*args, **kwds))
  File "C:\Users\kawujeilu\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py", line 44, in mapstar
    return list(map(*args))
  File "D:\  \  \   \coin_quant_class_2019_0623  \my\optimize_youhua_macd.py", line 77, in backtest
    df = signal_macd4(self.all_data.copy(), para)
  File "D:\  \  \   \coin_quant_class_2019_0623  \my\xbxSignals3.py", line 239, in signal_macd4
    condition1 = df['MACD'] < 0 and df['MACD'].shift(3) > 0
  File "C:\Users\kawujeilu\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py", line 1478, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "optimize_youhua_macd.py", line 212, in 
    rtn_list = pool.map(yh.backtest, para_list)         #  para_list       
  File "C:\Users\kawujeilu\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py", line 268, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "C:\Users\kawujeilu\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py", line 657, in get
    raise self._value
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

エラーはこの行の問題である:condition 1=df['MACD']<0 and df['MACD'].shift(3) > 0
問題を解決する
なぜならpythonにおけるorおよびandの宣言にはtruth-values、すなわち真のTrueまたはFalseが必要であるからである.
しかしdf['MACD']<0 and df['MACD'].shift(3)>0戻りはTrueまたはFalseではありません
コードを
condition1 = df['MACD'] < 0 & df['MACD'].shift(3) > 0

それでも無効です.最終的に最も愚かな方法で、何行も書きました.
condition1 = df['MACD'] < 0 
condition2 = df['MACD'].shift(3) > 0
condition3 = df['DIF'] < 0 
condition4 = df['DIF'].shift(3) > df['DEA']
condition5 = df['volume'] > df['volume_ma']*n
df.loc[condition1 & condition2 & condition3 & condition4 & condition5, 'signal_short'] = 1

問題解決