此代码的执行时间太长。
df.rolling(window=255).apply(myFunc)
我的 Dataframe 形状是(500,10000)。
0 1 ... 9999
2021-11-01 0.011111 0.054242
2021-11-04 0.025244 0.003653
2021-11-05 0.524521 0.099521
2021-11-06 0.054241 0.138321
...
我用最后255个日期值对每个日期进行计算。myFunc看起来像:
def myFunc(x):
coefs = ...
return np.sqrt(np.sum(x ** 2 * coefs))
我尝试使用更快的速度,但效果相同:
import swifter
df.swifter.rolling(window=255).apply(myFunc)
我也尝试过Dask,但我想我并没有很好地理解它,因为性能并没有好到哪里去:
import dask.dataframe as dd
ddf = dd.from_pandas(df)
ddf = ddf.rolling(window=255).apply(myFunc, raw=False)
ddf.execute()
我没有设法用分区来并行执行。我如何使用dask来提高性能?我使用的是Windows。
1条答案
按热度按时间p5cysglq1#
使用
numpy
+numba
可以非常高效地完成此操作。快速MRE:
使用
numba.njit(parallel=True)
和numba.prange
,使用纯numpy运算和简单循环编写函数:此命令运行非常快:
注意事项:我是dask的忠实粉丝。但是dask性能的第一条规则是don't use dask。如果它足够小,可以轻松地放入内存中,那么通常可以通过调整panda或numpy操作并利用cython、numba等的加速来获得最佳性能。一旦问题大到可以转移到dask,这些相同的调整规则也适用于在dask块/分区上执行的操作。我也是!