Объединение и фильтрация нескольких столбцов одного информационного кадра с логической логикой - PullRequest
0 голосов
/ 04 октября 2018

Цель: выводить индикаторы покупки / продажи / нейтральности / ошибки в один df [столбец] при фильтрации «ложных» значений.Индикаторы основаны на приведенном ниже столбце данных, а затем формулируются с помощью логического выражения:

df['sma_10'] = pd.DataFrame(ta.SMA(df['close'], timeperiod=10), dtype=np.float, columns=['close'])      
df['buy'] = pd.DataFrame(df['close'] > df['sma_10'], columns=['buy'])   
df['buy'] = df['buy'].replace({True: 'BUY'})        
df['sell'] = pd.DataFrame(df['close'] < df['sma_10'], columns=['sell'])     
df['sell'] = df['sell'].replace({True: 'SELL'})         
df['neutral'] = pd.DataFrame(df['close'] == df['sma_10'], columns=['neutral'])       
df['neutral'] = df['neutral'].replace({True: 'NEUTRAL'})        
df['error'] = pd.DataFrame((df['buy'] == False) & (df['sell'] == False) & (df['neutral'] == False), columns=['Error'])      
df['error'] = df['error'].replace({True: 'ERROR'})

Токовый выход df

buy  sell  Neutral Error
False False False ERROR
BUY False False False
False SELL False False
False False NEUTRAL False

Желаемый вывод df

Indicator
ERROR
BUY
SELL
NEUTRAL

Попытки и методы: 1-й метод: объединить все столбцы «купить / продать / нейтральный / ошибка» и попытаться сбросить «ложные» значения.Кадр данных повторяется только один раз, прежде чем происходит сбой.

df['sma_10_indic']=[df['buy'].astype(str)+df['sell'].astype(str)+df['neutral'].astype(str)+df['error'].astype(str)].drop("False")

Я пробовал подпрограмму if & elif, такую ​​как: Этот метод также выдает ошибку перед первым индексом

df['buy'] = pd.DataFrame(df['close'] > df['sma_10'])
df['sell'] = pd.DataFrame(df['close'] < df['sma_10'])
df['neutral'] = pd.DataFrame(df['close'] == df['sma_10'])
error = ((buy == False) and (sell == False) and (neutral == False))
if (df['buy'] == "True"):
   df['sma_10_indic'] = pd.DataFrame("BUY",columns=['indicator'])
elif (df['sell'] == "True"):
   df['sma_10_indic'] = pd.DataFrame("SELL",columns=['indicator'])
elif (df['neutral'] == "True"):
   df['sma_10_indic'] = pd.DataFrame("NEUTRAL",columns=['indicator'])
elif (error == True):
   df['sma_10_indic'] = pd.DataFrame("ERROR",columns=['indicator'])

Я не уверенна пути вперед я около 14 часов бью головой об стену, и впереди не было четкого пути.Я также попытался создать еще один отдельный фрейм данных и объединить их с помощью concat, но безуспешно из-за логического значения.Я относительно новичок в python и pandas / dataframes, поэтому, пожалуйста, будьте терпеливы со мной.Заранее спасибо!

1 Ответ

0 голосов
/ 04 октября 2018

Использование numpy.select:

m1 = df['close'] > df['sma_10']
m2 = df['close'] < df['sma_10']
m3 = df['close'] == df['sma_10']

df['Indicator'] = np.select([m1, m2, m3], ['BUY','SELL','NEUTRAL'], 'ERROR')
...