【问题标题】:how to do forward and backward rolling at the same time in pandas?如何在熊猫中同时进行向前和向后滚动?
【发布时间】:2021-04-05 08:11:16
【问题描述】:

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

例如:

date pos
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

date pos
2007-01-01 NA
2007-01-02 NA
2007-01-03 NA
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

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

【问题讨论】:

  • 看起来您只想为第一行填充 NA。它是否正确?请仔细检查。
  • 你需要什么输出?你能提供一些例子吗?如果价值更高或更低怎么办?你期待什么结果?
  • 发布时表已更改。顺便说一句,我改变了它
  • 那么2007-01-21是11的逻辑是什么?
  • @DanailPetrov,如果条件为假,它应该使用以前的数字

标签: python python-3.x pandas rolling-computation


【解决方案1】:

您可以使用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

【讨论】:

  • 太棒了!
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2018-07-08
  • 1970-01-01
相关资源
最近更新 更多