Python 如何使滚动窗口从pandas中的未来(后续)窗口迭代?
假设我有这样的df: |id |日期|目标|行| |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个目标行值是否为1-包括当前值,因此它应该为1。(Python 如何使滚动窗口从pandas中的未来(后续)窗口迭代?,python,pandas,max,rolling-computation,Python,Pandas,Max,Rolling Computation,假设我有这样的df: |id |日期|目标|行| |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个目标行值是否为1-包括当前值,因此它应该为1。(groupby('id')是必需的) 因
groupby('id')是必需的
)
因此,期望输出如下:
|id |日期|目标|行|下一个| 6 |目标
|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')。滚动(window=6)[['target_row']].max()。重置索引(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
""")
很高兴看到您在访问/调用pandas数据帧时遇到了问题 以下是基于
滚动(win)
和max()
的可能解决方案:
哇,可能是索引问题-因为我还需要使用groupby ID。无论如何,感谢您的解决方案,我不知道负移位)
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