Числовой эквивалент if / elif / else, который сохраняет последнее значение, если условие не выполняется

1

У меня есть следующий код, где переменные " close ", " closeLow " и " closeHigh " - это массивы Numpy 1D того же размера.

Я хочу вычислить массив " showData ", как показано в приведенном ниже коде, используя некоторую функцию как "np.where" или любой другой векторный/эффективный способ.

showData = np.full(len(close), True)
for i in range(len(close)):
    if close[i] < closeLow[i]:
        showData[i] = True
    elif close[i] > closeHigh[i]:
        showData[i] = False
    else:
        showData[i] = showData[i-1]

Проблема здесь в том, что я не могу найти простой способ воспроизвести эффект последней строки, где мы сохраняем результат последней итерации, если 2 условия (if и elif) не выполняются.

Заранее спасибо!

Теги:
pandas
numpy
loops
vectorization

1 ответ

1
Лучший ответ

Используйте np.select и pd.Series.ffill для пересылки данных заполнения.

showdata = pd.Series(np.select(
        [close < closeLow, close > closeHigh], [1., 0.], default=np.nan)
    ).ffill().astype(bool)

Работает, назначая 1 или 0, где выполняется соответствующее условие, или NaN в противном случае. ffill то просто вперед заполняет NaN с последним ненулевым значением.

NaNs в начале массива/серии не могут быть заполнены таким образом.

  • 1
    Вау, это работает как шарм! Ty! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню