高效的条件滚动计算熊猫

时间:2019-12-19 04:52:33

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

生成数据

random.seed(42)
date_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')
df = pd.DataFrame(np.random.randint(0,10,size=(len(date_rng))),
                  columns=['data'],
                 index= date_rng)
mask = np.random.choice([1, 0], df.shape, p=[.35, .65]).astype(bool)
df[mask] = np.nan

我要计算std()以在窗口= 5时滚动,如果窗口中超过一半的元素= NaN,则滚动计算等于NaN,如果窗口中少于一半的元素= NaN,dropna()并为其余元素计算std()。

我只知道如何计算正常滚动:

df.rolling(5).std()

如何指定滚动计算的条件

2 个答案:

答案 0 :(得分:3)

我认为您可以在min_periods

中使用参数rolling function
df['rollingstd'] = df.rolling(5, min_periods=3).std()
df.head(20)


Out put:
                     data  rollingstd
2018-01-01 00:00:00   1.0         NaN
2018-01-01 01:00:00   6.0         NaN
2018-01-01 02:00:00   1.0    2.886751
2018-01-01 03:00:00   NaN    2.886751
2018-01-01 04:00:00   5.0    2.629956
2018-01-01 05:00:00   3.0    2.217356
2018-01-01 06:00:00   NaN    2.000000
2018-01-01 07:00:00   NaN         NaN
2018-01-01 08:00:00   3.0    1.154701
2018-01-01 09:00:00   NaN         NaN
2018-01-01 10:00:00   5.0         NaN
2018-01-01 11:00:00   9.0    3.055050
2018-01-01 12:00:00   NaN    3.055050
2018-01-01 13:00:00   9.0    2.309401
2018-01-01 14:00:00   1.0    3.829708
2018-01-01 15:00:00   0.0    4.924429
2018-01-01 16:00:00   3.0    4.031129
2018-01-01 17:00:00   0.0    3.781534
2018-01-01 18:00:00   1.0    1.224745
2018-01-01 19:00:00   NaN    1.414214

答案 1 :(得分:1)

这是另一种更自定义的方法:

为您的逻辑编写一个自定义方法,该方法将窗口大小元素数组作为输入并返回该窗口的所需结果:

def cus_mean(x):
    notnone = ~(np.isnan(x))
    if notnone.sum()>2:
        return np.mean([y for y in x if ~(np.isnan(y))])

然后在数据框上调用滚动函数,如下所示:

 df.rolling(5).apply(cus_mean)