Оператор If для фрейма данных Pandas для добавления столбца

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь создать новый столбец в фрейме данных, который помечает «сигналы». Кажется, я не могу понять, как добиться этого в pandas без установки переменных и выполнения следующих действий:

 all_candles = pd.read_csv('ExportTest.csv', index_col=0)
all_candles.reset_index(level=0, inplace=True)
rows = len(all_candles.index)

for i in range(1,rows):
    current_RSI = all_candles.loc[i]['RSI']
    prev_RSI = all_candles.loc[i-1]['RSI']

    if prev_RSI < 30 and current_RSI >= 30:
        print('BULL SIGNAL')
    elif prev_RSI >= 70 and current_RSI < 70:
        print('BEAR SIGNAL')
  

Там, где он указывает БЫЧИЙ СИГНАЛ или МЕДВЕЖИЙ СИГНАЛ, я хочу, чтобы он заполнял новый столбец с именем all_candles[‘SIGNAL’] . Идеальное решение, которое я хочу, — это чтобы все это содержалось в pandas, поэтому мне не нужно выполнять цикл for.

например (простите за грубый способ отметить это, я знаю, что синтаксис вообще недействителен.)

     if all_candles['RSI'].shift(-1) < 30 and all_candles['RSI'] >= 30:
        all_candles['SIGNAL'] = 'BULL'
    elif all_candles['RSI'].shift(-1) >= 70 and all_candles['RSI'] < 70:
        all_candles['SIGNAL'] = 'BEAR'
    else
        all_candles['SIGNAL'] = 'NON'
  

Любая помощь будет высоко оценена в отношении искусства возможного.

Ответ №1:

Вы можете сделать это с помощью функции and .apply()

 import pandas as pd

def signal_cat(RSI_col) :
    current_RSI=RSI_col['RSI']
    prev_RSI=RSI_col['prev_RSI']
    if prev_RSI < 30 and current_RSI >= 30:
        return 'BULL SIGNAL'
    elif prev_RSI >= 70 and current_RSI < 70:
        return 'BEAR SIGNAL'
    else:
        return 'NON'

#définition of your dataframe
all_candles=pd.DataFrame({'RSI':[10,40,75,79,10,20,30]})
all_candles['prev_RSI'] =all_candles['RSI'].shift(1)

all_candles['SIGNAL']=all_candles[['prev_RSI', 'RSI']].apply(signal_cat, axis=1)
print(all_candles)
  

Результат:

    RSI  prev_RSI       SIGNAL
0   10       NaN          NON
1   40      10.0  BULL SIGNAL
2   75      40.0          NON
3   79      75.0          NON
4   10      79.0  BEAR SIGNAL
5   20      10.0          NON
6   30      20.0  BULL SIGNAL
  

Комментарии:

1. Похоже, именно то, что я ищу, однако я получаю сообщение об ошибке, когда я его реализовал… signal_cat() missing 1 required positional argument: 'current_RSI'