Как создать фиксированные новые значения массива numpy на основе условий - цены на акции

input_array =
       ([[13,  93,  47,  857],
         [16,  91,  55,  800], 
         [18, 105,  85,  821],
         [17, 106,  89,  890],
         [19, 105,  60,  961],
         [20, 106,  41,  988],
         [21, 107,  45,  999],])

take_profit =
       ([[15,  105,  90,  960]])

stop_loss =
       ([[10,   92,  45,  750]])

Каждый столбец в массиве - это цены отдельных акций, когда цена находится между тейк_профитом и стоп_лоссом, сделка открыта, а значение остается неизменным. Если цена становится выше или равна тейк-профиту, статус сделки — TP, а когда цена ниже или равна стоп-лоссу — статус SL для оставшейся части столбца.

desired_output_array = 
        ([[13,  93,  47,  857],
         [TP,   SL,  55,  800],
         [TP,   SL,  85,  821],
         [TP,   SL,  89,  890],
         [TP,   SL,  60,  TP],
         [TP,   SL,  SL,  TP],
         [TP,   SL,  SL,  TP],])

Может ли кто-нибудь помочь мне решить эту проблему? Массив имеет длину 3000 строк. Мой подход был следующим:

# My approach:

for value in input_array:
    if value > take_profit:
        value == "TP"
    if value < stop_loss:
        value == "SL"
    else:
        value == value

Это не сработало, поэтому попробовал

output_array = np.where(input_array> take_profit , "TP", input_array)

Проблема с этим заключается в том, что выход сначала изменится на TP, но затем вернется между SL и числами между ними, если цена вернется. Как только цена меняет статус, сделка закрывается, поэтому для остальных значений, идущих вниз в столбце, она должна оставаться фиксированной до конца!


person henryhong    schedule 25.01.2021    source источник


Ответы (1)


Давайте попробуем np.select , пройти к pandas с mask и fillna

cond1 = (input_array > take_profit)
cond2 = (input_array < stop_loss)
s = pd.DataFrame(np.select([cond1,cond2],['TP',"SL"],default=input_array))

out_putary = s.mask(s.isin(['TP',"SL"]).cumsum()>0).fillna(s.where(s.isin(['TP',"SL"]).cumsum()>0).bfill().iloc[0]).values


out_putary
Out[65]: 
array([['13', '93', '47', '857'],
       ['TP', 'SL', '55', '800'],
       ['TP', 'SL', '85', '821'],
       ['TP', 'SL', '89', '890'],
       ['TP', 'SL', '60', 'TP'],
       ['TP', 'SL', 'SL', 'TP'],
       ['TP', 'SL', 'SL', 'TP']], dtype=object)
person BENY    schedule 25.01.2021