Работа с pandas фреймом данных и условиями объединения дает ошибку неоднозначности - PullRequest
1 голос
/ 01 февраля 2020

Я пытаюсь вычислить свечную модель, называемую Доджи. Требуется два вычисления двух значений условий: pandas фрейм данных с историческими данными запаса со столбцами Дата, Высокий, Низкий, открытый и закрытый.

С условием if я пытался явно сделать условие 1 и условие 2 булевым а также попробовал, набрав его с помощью any (). Оба из них не дали желаемого результата. Условие печати 1 и условие 2 по отдельности дают соответствующее логическое значение, но объединение его с '&' ужасно неправильно.

51315    True
51316    True
51317    True
51318    True
51319    True
         ... 
53790    True
53791    True
53792    True
53793    True
53794    True
Length: 2480, dtype: bool

ValueError                                Traceback (most recent call last)
<ipython-input-58-3f42eed169f4> in <module>
      4 values = pd.DataFrame(stocks_data.loc[stocks_data['Company']=='TCS'])
      5 values.reset_index()
----> 6 study_candlesticks(values)

<ipython-input-57-fd67b4117699> in study_candlesticks(values)
     21 #     for row in values
     22 
---> 23     if calc_doji(values):
     24         values['Pattern']='Doji'
     25 

<ipython-input-57-fd67b4117699> in calc_doji(values)
     81     condition2=((values['High'] - values['Low'])>values['Close']*min_candle_size)
     82     print(condition2)
---> 83     if ((condition1).bool()&(condition2).any()):
     84         return True
     85     else:

~\Anaconda3\lib\site-packages\pandas\core\generic.py in bool(self)
   1581             )
   1582 
-> 1583         self.__nonzero__()
   1584 
   1585     def __abs__(self):

~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1553             "The truth value of a {0} is ambiguous. "
   1554             "Use a.empty, a.bool(), a.item(), a.any() or a.all().".format(
-> 1555                 self.__class__.__name__
   1556             )
   1557         )

ValueError: True Ценность Серии неоднозначна. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Я не уверен, где я иду не так. Есть предложения?

Ниже приведен код

calc_doji(values)

def calc_doji(values):
    max_candle_size=0.1/100
    min_candle_size=1/100
    condition1 =(abs(values['Open'] - values['Close'])<values['Close']*max_candle_size)
    print(condition1)
    condition2=((values['High'] - values['Low'])>values['Close']*min_candle_size)
    print(condition2)
    if ((condition1).bool()&(condition2).any()): 
        return True
    else:
        return False

1 Ответ

0 голосов
/ 01 февраля 2020

Если у вас есть два pd.Series, где dtype('bool'). Вы можете сравнить их следующим образом. Не зная, как выглядят ваши данные, я создал два pd.Series с True или False.

import pandas as pd
import numpy as np

condition1= pd.Series(np.random.choice([True, False], 100)) 
condition2= pd.Series(np.random.choice([True, False], 100)) 

Затем вы можете сравнить, выполнив следующие действия:

(condition1) & (condition2) # which returns a `pd.Series` where each row is either `True` or `False`.

Чтобы найти любую позицию индекса из каждого pd.Series, где оба значения равны True.

((condition1) & (condition2)).any() # Which returns either `True` or `False`

Из вашего кода я бы предположил, что эта строка является проблемой.

if ((condition1).bool()&(condition2).any()):

, которая должна быть

if ((condition1) & (condition2)).any():
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...