Как использовать min/max с функцией сдвига в пандах?

У меня есть данные таймсерии (евро/доллар США). Я хочу создать новый столбец с условиями, которые

(Легче читать в моем коде, чтобы понять условия.) Если минимум 3 предыдущих высоких цены меньше или равны текущей цене, тогда это будет «BUY_SIGNAL», и если максимум 3 предыдущих низких цены выше или равны текущая цена, то она будет "SELL_SIGNAL".

Вот как выглядит моя таблица

DATE    OPEN    HIGH    LOW CLOSE
0   1990.09.28  1.25260 1.25430 1.24680 1.24890
1   1990.10.01  1.25170 1.26500 1.25170 1.25480
2   1990.10.02  1.25520 1.26390 1.25240 1.26330
3   1990.10.03  1.26350 1.27000 1.26030 1.26840
4   1990.10.04  1.26810 1.27750 1.26710 1.27590

и это мой код (пытаюсь создать 2 функции и не работает)

def target_label(df):
   if df['HIGH']>=[df['HIGH'].shift(1),df['HIGH'].shift(2),df['HIGH'].shift(3)].min(axis=1):
      return 'BUY_SIGNAL'
   if df['LOW']>=[df['LOW'].shift(1),df['LOW'].shift(2),df['LOW'].shift(3)].min(axis=1):
        return 'SELL_SIGNAL'
   else:
        return 'NO_SIGNAL'

def target_label(df):
   if df['HIGH']>=df[['HIGH1','HIGH2','HIGH3'].min(axis=1):
      return 'BUY_SIGNAL'
   if df['LOW']<=df[['LOW1','LOW2','LOW3']].max(axis=1):
        return 'SELL_SIGNAL'
   else:
        return 'NO_SIGNAL'


d_df.apply (lambda df: target_label(df), axis=1)

person Korn Tawe    schedule 22.07.2020    source источник


Ответы (1)


Вы можете использовать rolling(3).min(), чтобы получить минимум из трех предыдущих строк. То же самое будет работать для других функций, таких как max, mean и т. д. Что-то вроде следующего:

df['signal'] = np.where(
    df['HIGH'] >= df.shift(1).rolling(3)['HIGH'].min(), 'BUY_SIGNAL',
    np.where(
        df['LOW'] >= df.shift(1).rolling(3)['LOW'].min(), 'SELL_SIGNAL',
        'NO_SIGNAL'
    )
)
person Daniel R    schedule 22.07.2020