如何使滚动 windows 从 pandas 中的未来(以下)window 迭代?

How make rolling windows iterate from future (following) window in pandas?

假设我有这样的 df:

|编号|日期 | 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).

所以想要输出这个: |编号|日期 | 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)

pandasql 的可能解决方案。有没有办法避免使用它?

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
      """)

很高兴看到您在 accessing/calling 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