Выбор строк, где значение столбца равно 1 в текущей строке, но 0 в предыдущей строке

Я работаю с DataFrame на Python 3.8, где пытаюсь воспроизвести вычисления Excel — базовый if с двумя критериями, один из которых ссылается на саму строку раньше.

Backtest['trade_price']=0
Backtest.loc[(Backtest['z_en_crit']==1) & 
             (Backtest['trade_price'].shift(-1)==0), "trade_price"] = 1

Второй критерий, кажется, полностью игнорируется... так как trade_price должен иметь только один 1

                           z_en_crit  trade_price
Datetime                                         
2020-10-21 11:00:00+01:00        0.0            0
2020-10-21 12:00:00+01:00        0.0            0
2020-10-21 13:00:00+01:00        1.0            1
2020-10-21 14:00:00+01:00        1.0            1
2020-10-21 15:00:00+01:00        1.0            1
2020-10-21 16:00:00+01:00        0.0            0

Если у вас есть идеи, как заставить это работать, а также сделать это быстрее, я был бы очень признателен! Спасибо!

Обновлено:

Требуемый результат:

                           z_en_crit  trade_price
Datetime                                         
2020-10-21 11:00:00+01:00        0.0            0
2020-10-21 12:00:00+01:00        0.0            0
2020-10-21 13:00:00+01:00        1.0            1
2020-10-21 14:00:00+01:00        1.0            0
2020-10-21 15:00:00+01:00        1.0            0
2020-10-21 16:00:00+01:00        0.0            0

Я не думаю, что ваш вопрос объяснен четко, потому что, если для trade_price установлено значение 0, то его смещение также приведет к 0. Не уверен, что пытается передать второе условие. Возможно, объясните, какие вычисления в Excel вы пытаетесь воспроизвести.

cs95 26.12.2020 11:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите вместо этого переключиться на «z_en_crit»? Кроме того, вам следует изменить направление сдвига, если вы хотите совпадать с первым из группы, а не с последним.

df['trade_price'] = np.where(
    df['z_en_crit'].eq(1) & df['z_en_crit'].shift(1).eq(0), 1, 0)

df

                           z_en_crit  trade_price
Datetime                                         
2020-10-21 11:00:00+01:00        0.0            0
2020-10-21 12:00:00+01:00        0.0            0
2020-10-21 13:00:00+01:00        1.0            1
2020-10-21 14:00:00+01:00        1.0            0
2020-10-21 15:00:00+01:00        1.0            0
2020-10-21 16:00:00+01:00        0.0            0

Спасибо за быстрый ответ! Нет, я смотрю на предыдущее значение trade_price, т.е. в 13:00 я смотрю на 12:00 и если оно равно нулю, то это True. Как скользящие критерии

John 26.12.2020 11:39

@John Пожалуйста, укажите ожидаемый результат в вопросе, и я буду рад отредактировать ответ.

cs95 26.12.2020 11:40

@Джон, я все еще думаю, что тебе следует смотреть на z_en_crit, иначе условие не имеет смысла. Проверить правку сейчас?

cs95 26.12.2020 11:58

Да, ты прав cs95, у меня был недостаток в моей логике, кажется. Кроме того, является ли ваш метод векторизацией numpy? т.е. самый быстрый способ сделать это?

John 26.12.2020 12:40

@John, он использует numpy.where, который, насколько мне известно, сильно векторизован. Пожалуйста, запустите код и протестируйте его на своих данных.

cs95 26.12.2020 12:49

Другие вопросы по теме