加快从python滚动窗口中找到前5个数字的平均值的速度

时间:2018-07-20 15:03:43

标签: python pandas rolling-average

我想从30的滚动窗口中创建5个最大值的平均值的列。对于大型DataFrame,使用for循环非常慢。我尝试将rolling()与nlargest()结合使用,但无法正常工作。有什么建议可以加快速度吗?

def top_values(df, column, days):
    top5 = df.nlargest(days, column)
    top = top5[column].sum() / days

x = 0
w = 0
for i in df.index:
    if x > 30:
        df['tops'][x] = top_values(df[w:x], 'column', 5)
        w += 1
        x += 1

1 个答案:

答案 0 :(得分:4)

一种方法是在rolling中使用lambda函数,例如,获取排序列表的前5个元素的均值:

df['column'].rolling(30).apply(lambda x: np.mean(sorted(x,reverse=True)[:5]))

最小示例

在一个包含15个元素的数据帧上,我们可以在5个窗口中获得前3个值的平均值,以进行演示:

>>> df
    column
0       48
1        9
2       36
3       71
4       59
5       16
6        9
7       18
8       43
9        3
10      54
11      23
12      12
13      38
14      54

>>> df['column'].rolling(5).apply(lambda x: np.mean(sorted(x,reverse=True)[:3]))
0           NaN
1           NaN
2           NaN
3           NaN
4     59.333333
5     55.333333
6     55.333333
7     49.333333
8     40.000000
9     25.666667
10    38.333333
11    40.000000
12    40.000000
13    38.333333
14    48.666667
Name: column, dtype: float64