Python 如何矢量化滚动和移位操作以提高性能
使用Pandas 1.0和Numpy 1.18,我需要对包含大量组的大型数据帧应用多次滚动,并使用不同的窗口大小和摘要函数。在应用summary函数之前,序列也会移位1以放弃当前行值。这是滚动最大值移动1的示例:Python 如何矢量化滚动和移位操作以提高性能,python,pandas,numpy,vectorization,Python,Pandas,Numpy,Vectorization,使用Pandas 1.0和Numpy 1.18,我需要对包含大量组的大型数据帧应用多次滚动,并使用不同的窗口大小和摘要函数。在应用summary函数之前,序列也会移位1以放弃当前行值。这是滚动最大值移动1的示例: import pandas as pd import numpy as np df = pd.DataFrame({'a': [5,2,4,5,4,2,3,5,5,2,4,1], 'b': [18,37,60,45,40,40,50,10,30,2,46,19]}) df = df
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [5,2,4,5,4,2,3,5,5,2,4,1], 'b': [18,37,60,45,40,40,50,10,30,2,46,19]})
df = df.sort_values('a').reset_index(drop=True)
df['max'] = df.groupby('a', sort=False, as_index=False)['b'].rolling(2, min_periods=1).apply(lambda x: np.max(x[:-1])).reset_index(drop=True)
结果:
df
a b max
0 1 19 NaN
1 2 37 NaN
2 2 40 37.0
3 2 2 40.0
4 3 50 NaN
5 4 60 NaN
6 4 40 60.0
7 4 46 40.0
8 5 18 NaN
9 5 45 18.0
10 5 10 45.0
11 5 30 10.0
结果是正确的,但是一旦应用到一个大的数据帧,它会花费太长的时间,我想知道是否有一种方法可以重构这个逻辑,以利用矢量化,而不是依赖
应用
,正如我读到的,作为引擎盖下的一个循环实现,它的性能很差。这看起来是一个不错的解决方案。如果你说“太长”是什么意思?大约一分钟。我有一些这样的滚动操作,对脚本的整体执行有15分钟的限制。我不是在抱怨Pandas groupby/apply函数的性能,我只是在尝试找到一个最优的解决方案,并在其他操作中发现矢量化显著减少了执行时间。我只是不知道如何通过矢量化重构滚动和移位操作,我正在寻求建议。这是否回答了你的问题?这看起来是一个不错的解决方案。如果你说“太长”是什么意思?大约一分钟。我有一些这样的滚动操作,对脚本的整体执行有15分钟的限制。我不是在抱怨Pandas groupby/apply函数的性能,我只是在尝试找到一个最优的解决方案,并在其他操作中发现矢量化显著减少了执行时间。我只是不知道如何通过矢量化重构滚动和移位操作,我正在寻求建议。这是否回答了你的问题?