Как заставить windows повторяться из будущего (следующего) окна в pandas? - PullRequest
0 голосов
/ 30 апреля 2020

Предположим, у меня есть такой df:

| ID | дата | target_row |

| 1 | 2016-01-01 | 0 |

| 1 | 2016-02-01 | 0 |

| 1 | 2016-03-01 | 0 |

| 1 | 2016-04-01 | 0 |

| 1 | 2016-05-01 | 1 |

| 1 | 2016-06-01 | 0 |

| 1 | 2016-07-01 | 0 |

| 1 | 2016-08-01 | 0 |

Моя задача состоит в том, чтобы проверить, равны ли следующие 4 target_row значения 1, включая текущие, поэтому оно должно быть одним. (groupby('id') is needed).

Итак, желаемый вывод это: | ID | дата | target_row | next_6_target

| 1 | 2016-01-01 | 0 | 0

| 1 | 2016-02-01 | 0 | 1

| 1 | 2016-03-01 | 0 | 1

| 1 | 2016-04-01 | 0 | 1

| 1 | 2016-05-01 | 1 | 1

| 1 | 2016-06-01 | 0 | 0

| 1 | 2016-07-01 | 0 | 0

| 1 | 2016-08-01 | 0 | 0

Я пробовал следующим образом: df['next_6_target'] = df.groupby('id').rolling(window=6)[['target_row']].max().reset_index(drop=True) и затем выполняю сдвиг - но это дает неправильные результаты

В SQL решение должно выглядеть примерно так:

MAX(target_row) OVER (PARTITION BY ID ORDER BY DATE ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING)

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Было бы приятно видеть, что именно у вас возникли проблемы с доступом / вызовом pandas фрейма данных.

Вот возможное решение на основе rolling(win) и max():

import pandas as pd
d  = dict(row = [0,0,0,0,0,0,0,1,0,0,0,0,0,0])
df = pd.DataFrame(d)

win = 6
df['winMax'] = df.rolling(win).max().shift(-win+1)
print(df)

>
    row  winMax
0     0     0.0
1     0     0.0
2     0     1.0
3     0     1.0
4     0     1.0
5     0     1.0
6     0     1.0
7     1     1.0
8     0     0.0
9     0     NaN
10    0     NaN
11    0     NaN
12    0     NaN
13    0     NaN
0 голосов
/ 30 апреля 2020

Возможное решение от панды sql. Есть ли способ избежать его использования?

from pandasql import sqldf
df_final = sqldf("""SELECT id, date, target_row, 
MAX(target_row) OVER (PARTITION BY id ORDER BY date ROWS BETWEEN CURRENT ROW AND 6 FOLLOWING)
FROM df
      """)
...