如何使滚动 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
假设我有这样的 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