У меня есть pandas df с 3 столбцами:
Close Top_Barrier Bottom_Barrier
0 441.86 441.964112 426.369888
1 448.95 444.162225 425.227108
2 449.99 446.222271 424.285063
3 449.74 447.947051 423.678282
4 451.97 449.879254 423.029413
...
996 436.97 446.468790 426.600543
997 438.16 446.461401 426.599265
998 437.00 446.093899 426.641434
999 437.52 446.024365 426.631635
1000 437.75 446.114093 426.715907
Цель: Для каждой строки мне нужно проверить, касается ли какая-либо из следующих 30 строк цены закрытия верхнего или нижнего барьера (из строки 0), например, начать с индекса строки 0, проверить, не касается ли цена закрытия (441,86) больше, чем Верхний_барьер (441,96) или ниже, чем Нижний_барьер (426,36), если он больше, чем Верхний_барьер, вернуть 1, если он ниже, чем Нижний_барьер, вернуть -1. В противном случае перейдите к следующей строке, например, по индексу 1 цена закрытия равна 448,95, но она все еще тестируется относительно цены барьера с индексом 0, т. е. верхний_барьер равен 441,96, нижний_барьер равен 426,36. Этот цикл продолжается до индекса 29, если цена закрытия никогда не касается барьеров - в этом случае возвращается 0. Следующий скользящий цикл начинается с индекса 1 до 30 и т. д.
Попытки: я пытался использовать .rolling.apply со следующей функцией, но не смог устранить ошибки. С удовольствием изучу любые другие методы, если они достигают моей цели, указанной выше. Спасибо!
def tbl_rolling(x):
start_i = x.index[0]
for i in range(len(x)):
# the barrier freeze at index 0
if x.loc[i, 'Close'] > x.loc[start_i, 'Top_Barrier']:
return 1
elif x.loc[i, 'Close'] < x.loc[start_i, 'Bottom_Barrier']:
return -1
return 0
Затем следующее выдает IndexingError: слишком много индексаторов.
test = df.rolling(30).apply(tbl_rolling, raw=False)