У меня есть следующий код, где переменные " 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) не выполняются.
Заранее спасибо!
Используйте 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 в начале массива/серии не могут быть заполнены таким образом.