Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使滚动窗口从pandas中的未来(后续)窗口迭代?_Python_Pandas_Max_Rolling Computation - Fatal编程技术网

Python 如何使滚动窗口从pandas中的未来(后续)窗口迭代?

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')是必需的) 因

假设我有这样的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')是必需的

因此,期望输出如下: |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