加快从 python 中的滚动 window 中查找前 5 个数字的平均值
Speed up finding the average of top 5 numbers from a rolling window in python
我想创建一列 30 的滚动 window 中的 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
一种方法是在 rolling
中使用 lambda 函数,例如获取排序列表的前 5 个元素的平均值:
df['column'].rolling(30).apply(lambda x: np.mean(sorted(x,reverse=True)[:5]))
最小示例:
在一个包含 15 个元素的数据帧上,我们可以得到 window 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
我想创建一列 30 的滚动 window 中的 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
一种方法是在 rolling
中使用 lambda 函数,例如获取排序列表的前 5 个元素的平均值:
df['column'].rolling(30).apply(lambda x: np.mean(sorted(x,reverse=True)[:5]))
最小示例:
在一个包含 15 个元素的数据帧上,我们可以得到 window 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