首页 > 解决方案 > 如何在熊猫中同时进行向前和向后滚动?

问题描述

我需要检查当前值是否高于接下来的两个和前三个值。否则,它通过前一个数字。

前任:

日期 位置
2007-01-01 3.0
2007-01-02 5.0
2007-01-03 6.0
2007-01-10 11.0
2007-01-11 9.0
2007-01-20 8.0
2007-01-21 10.0
2007-01-22 13.0
2007-01-23 4.0
2007-01-27 2.0
2007-01-28 1.0
2007-01-29 2.0

日期 位置
2007-01-01 不适用
2007-01-02 不适用
2007-01-03 不适用
2007-01-10 11.0
2007-01-11 11.0
2007-01-20 11.0
2007-01-21 11.0
2007-01-22 13.0
2007-01-23 13.0
2007-01-27 13.0
2007-01-28 13.0
2007-01-29 13.0

我知道如何分别进行向后滚动和向前滚动。但无法弄清楚如何同时做到这一点。

标签: pythonpython-3.xpandasrolling-computation

解决方案


您可以使用np.where替换未通过您的条件的值,nan然后使用ffill将先前的值向前转换。

在这种情况下,我们使用最小周期为 4 的第一个条件的扩展窗口,而对于第二个条件,我们反转数据并执行 2 的滚动窗口。

import pandas as pd
import numpy as np

df = pd.DataFrame({'date': {0: '2007-01-01',
  1: '2007-01-02', 2: '2007-01-03', 3: '2007-01-10', 4: '2007-01-11',
  5: '2007-01-20', 6: '2007-01-21', 7: '2007-01-22', 8: '2007-01-23',
  9: '2007-01-27', 10: '2007-01-28', 11: '2007-01-29'},
 'pos': {0: 3.0, 1: 5.0, 2: 6.0, 3: 11.0, 4: 9.0, 5: 8.0,
  6: 10.0, 7: 13.0, 8: 4.0, 9: 2.0, 10: 1.0, 11: 2.0}})

df.pos = np.where((df.pos.ge(df.pos.rolling(len(df), min_periods=4).max())) & 
         (df.pos.ge(df.iloc[::-1].pos.rolling(2).max())),
        df.pos,np.nan)
df.ffill()

输出

    date    pos
0   2007-01-01  NaN
1   2007-01-02  NaN
2   2007-01-03  NaN
3   2007-01-10  11.0
4   2007-01-11  11.0
5   2007-01-20  11.0
6   2007-01-21  11.0
7   2007-01-22  13.0
8   2007-01-23  13.0
9   2007-01-27  13.0
10  2007-01-28  13.0
11  2007-01-29  13.0

推荐阅读