как одновременно выполнять движение вперед и назад в pandas?

#python #python-3.x #pandas #rolling-computation

#python #python-3.x #pandas #rolling-вычисление

Вопрос:

Мне нужно проверить, превышает ли текущее значение следующие два и предыдущие три значения. В противном случае он передает предыдущее число.

Пример:

Дата позиция
2007-01-01 3.0
2007-01-02 5.0
2007-01-03 6.0
2007-01-10 11.0
2007-01-11 9.0
2007-01-20 8.0
2007-01-21 10.0
2007-01-22 13.0
2007-01-23 4.0
2007-01-27 2.0
2007-01-28 1.0
2007-01-29 2.0

Для

Дата позиция
2007-01-01 NA
2007-01-02 NA
2007-01-03 NA
2007-01-10 11.0
2007-01-11 11.0
2007-01-20 11.0
2007-01-21 11.0
2007-01-22 13.0
2007-01-23 13.0
2007-01-27 13.0
2007-01-28 13.0
2007-01-29 13.0

Я знаю, как выполнять обратную прокатку и прямую прокатку отдельно. Но не могу понять, как это сделать одновременно.

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

1. Похоже, вы просто хотите заполнить NA первую строку. Это правильно? Пожалуйста, дважды проверьте.

2. Какой вывод вам нужен? Можете ли вы привести несколько примеров? Что делать, если значение выше или ниже? Каких результатов вы ожидаете?

3. Таблица была изменена при публикации. Кстати, я изменил его

4. Итак, какова логика, которая делает 2007-01-21 равным 11?

5. @DanailPetrov, он должен использовать предыдущий номер, если условие равно false

Ответ №1:

Вы можете использовать np.where для замены значений, которые не соответствуют вашим условиям nan , а затем использовать ffill для переноса предыдущих значений вперед.

В этом случае мы используем расширяющееся окно для первого условия с минимальным периодом 4, а для второго мы инвертируем данные и делаем скользящее окно 2.

 import pandas as pd
import numpy as np

df = pd.DataFrame({'date': {0: '2007-01-01',
  1: '2007-01-02', 2: '2007-01-03', 3: '2007-01-10', 4: '2007-01-11',
  5: '2007-01-20', 6: '2007-01-21', 7: '2007-01-22', 8: '2007-01-23',
  9: '2007-01-27', 10: '2007-01-28', 11: '2007-01-29'},
 'pos': {0: 3.0, 1: 5.0, 2: 6.0, 3: 11.0, 4: 9.0, 5: 8.0,
  6: 10.0, 7: 13.0, 8: 4.0, 9: 2.0, 10: 1.0, 11: 2.0}})

df.pos = np.where((df.pos.ge(df.pos.rolling(len(df), min_periods=4).max())) amp; 
         (df.pos.ge(df.iloc[::-1].pos.rolling(2).max())),
        df.pos,np.nan)
df.ffill()
 

Вывод

     date    pos
0   2007-01-01  NaN
1   2007-01-02  NaN
2   2007-01-03  NaN
3   2007-01-10  11.0
4   2007-01-11  11.0
5   2007-01-20  11.0
6   2007-01-21  11.0
7   2007-01-22  13.0
8   2007-01-23  13.0
9   2007-01-27  13.0
10  2007-01-28  13.0
11  2007-01-29  13.0
 

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

1. Это потрясающе!