Есть ли способ выполнить такого рода вычисления, где столбцы взаимозависимы с numpy.where без цикла forPython

Программы на Python
Anonymous
Есть ли способ выполнить такого рода вычисления, где столбцы взаимозависимы с numpy.where без цикла for

Сообщение Anonymous »

У меня есть небольшой файл df с одним столбцом z_score. Затем я создам 3 столбца — «продажа», «позиция» и «short_exit».
введите здесь описание изображения

Код: Выделить всё

                     z_score
2024-05-23 21:00:00  0.639482
2024-05-23 22:00:00  1.133366
2024-05-23 23:00:00 -0.267677
2024-05-24 00:00:00  0.681130
2024-05-24 01:00:00  2.283615
2024-05-24 02:00:00  1.916469
2024-05-24 03:00:00  2.284099
2024-05-24 04:00:00  2.283456
2024-05-24 05:00:00  2.699485
2024-05-24 06:00:00  2.393399
2024-05-24 07:00:00  1.871835
2024-05-24 08:00:00  1.824887
Правило торговли таково: если z_score больше 2 И нет открытой позиции, продавайте. Это означает, что значение продажи в этой строке станет 1. Позиция со значением по умолчанию 0 также станет 1 (это означает, что у меня есть открытая позиция). Оно остается 1 до закрытия позиции. Когда z_score падает ниже 0, позиция закрывается, т. е. позиция снова становится 0. В этом случае short_exit получает значение 1, а позиция снова становится 0, потому что у нас нет открытой позиции.
Я думаю, это не так уж и сложно сделать. Но мне как-то не удалось.

Код: Выделить всё

import pandas as pd
import numpy as np

df = pd.read_excel("gate.xlsx", sheet_name="Sheet3")
# Assuming your data is in a DataFrame called df
# Initialize sell and positions columns with zeros
df['sell'] = 0
df['positions'] = 0
df['short_exit'] = 0

df['sell'] = np.where((df['z_score'] > 2) & (df['positions'].shift(1) == 0), 1, 0)
df['positions'] = np.where(((df['sell'] == 1) | (df['positions'].shift(1) == 1)) & (df['short_exit'] == 0), 1, df['positions'])
df['short_exit'] = np.where((df['z_score'] < 0) & (df['positions'] == 1), 1 ,0)

# Display the resulting DataFrame
print(df)

Ожидаемый результат должен быть таким, как на прикрепленном изображении. В том, что я получаю, столбец позиции получает значение 0 в некоторых строках, в которых этого не должно быть.
Введите здесь описание изображения
Любая помощь или подсказка приветствуются.
Кстати, это возможно сделать это нумпи? На одном форуме мне сказали, что для этого требуется рекурсия, поэтому сделать так, как я хочу, невозможно.

Подробнее здесь: https://stackoverflow.com/questions/785 ... ependent-w

Вернуться в «Python»