我想从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
答案 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