Создайте функцию в пандах на основе другого столбца

У меня есть следующий набор данных:

data = {'ROC_9':  [0.006250, 0.087230, 0.045028, 0.165738, -0.006993, -0.432736, -0.11162, 0.057466, 0.203138, -0.008234]}

price_data = pd.DataFrame (data)

Это индикатор цены акции, а именно скорости ее изменения.

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

Это проще объяснить на примере: воспользуемся функцией ROC9.

Я создаю новую переменную с именем ROC9_signal и устанавливаю ее равной 0:

`price_data['ROC9_signal'] = 0`

Когда ROC_9 изменится с negative на positive, я хочу изменить ROC9_signal с 0 на 1.

Когда ROC_9 изменится с positive на negative, я хочу изменить ROC9_signal с 0 на -1.

Глядя на данные, я бы хотел, чтобы ROC9_signal изменилось с 0 на -1, поскольку значение изменилось с 0.16 (positive) на -0.006 (negative).

Глядя на данные, я бы хотел, чтобы сигнал ROC_9 изменился с 0 на 1, поскольку значение изменилось с -0.11 (negative) на 0.05 (positive).

Глядя на данные, я бы хотел, чтобы ROC9_signal изменилось с 0 на -1, поскольку значение изменилось с 0.20 (положительное) на -0.008 (negative).

Я хочу изменить только строку, в которой происходит изменение, с 0 на 1 или с 0 на -1, остальные строки должны оставаться равными 0.

Затем я применю ту же логику для создания столбца momentum10_signal и столбца chalkin_money_flow_signal. Поэтому мне нужно решение, которое можно применять к разным столбцам, а не вручную.

Заранее спасибо за помощь.

Вот как выглядят полные данные:

Полные данные


person alitkie    schedule 01.06.2020    source источник
comment
Предоставьте небольшой набор образцов данных в виде текста, который мы можем скопировать и вставить. Включите соответствующий желаемый результат. Ознакомьтесь с руководством по как сделать хорошие воспроизводимые примеры pandas.   -  person timgeb    schedule 01.06.2020
comment
Извинения. Я предоставил некоторые образцы данных сейчас. Спасибо @timgeb   -  person alitkie    schedule 01.06.2020


Ответы (2)


Попробуйте использовать np.where:

Сначала создайте столбец «ROC9_prev», используя сдвиг:

price_data['ROC9_prev'] = price_data['ROC9'].shift(1)

Возможно, вам придется сгруппировать по столбцу перед сдвигом, чтобы убедиться, что вы берете предыдущую ROC9 каждой акции, а не текущую ROC9 другой акции.

Затем создание столбца сигнала будет происходить следующим образом:

price_data['ROC9_Signal'] = np.where(price_data['ROC9'] > 0 & price_data['ROC9_prev'] < 0, 1, 0)
price_data['ROC9_Signal'] = np.where(price_data['ROC9'] < 0 & price_data['ROC9_prev'] > 0, -1, 0)

Надеюсь это поможет.

person Shrinath Viswanathan    schedule 01.06.2020

Данные

data = {'ROC_9':  [0.006250, 0.087230, 0.045028, 0.165738, -0.006993, -0.432736, -0.11162, 0.057466, 0.203138, -0.008234]}

price_data = pd.DataFrame (data)
price_data['ROC9_signal'] = 0
price_data

Используйте логическое выделение, чтобы найти два разных пересечения:

 ZeroCrossing1=price_data.ROC_9.ge(0)&price_data.ROC_9.shift(1).le(0)#from 0 to 1
 ZeroCrossing2=price_data.ROC_9.ge(0)&price_data.ROC_9.shift(-1).le(0)# from 0 to -1.

Поместите вероятные результаты Zerocrossing в список

 ZeroCrossingOutcomes=[1,-1]

Условно вычислите price_data['ROC9_signal'], используя np.where

price_data['ROC9_signal']=np.select([ZeroCrossing1,ZeroCrossing2],ZeroCrossingOutcomes,0)
print(price_data)

В качестве альтернативы используйте вложенный np.where(if condition, ye, else no)

price_data['ROC9_signal']=np.where(ZeroCrossing1,1,np.where(ZeroCrossing2,-1,0)))

введите здесь описание изображения

person wwnde    schedule 01.06.2020
comment
Спасибо вам за помощь! Это работает очень хорошо. Ценить это! - person alitkie; 02.06.2020