如何对全Pandas DataFrame实现向量化STL高效季节性分解
可行的解决方案
并行化逐列计算(改造成本最低)
因为每列的STL分解完全独立,不存在数据依赖,直接把串行循环替换为多进程并行即可,性能提升幅度和你的CPU物理核心数成正比,16核CPU就能把原来1分52秒的耗时压到7-10秒级别。
示例代码:from concurrent.futures import ProcessPoolExecutor import statsmodels.tsa.seasonal as tsa def stl_fit(col_data): return tsa.STL(col_data, period=288).fit() %%time with ProcessPoolExecutor() as executor: results = list(executor.map(stl_fit, [df[col].values for col in df.columns]))注意:CPU密集型任务请用
ProcessPoolExecutor而非ThreadPoolExecutor,避免GIL限制性能向量化STL实现(性能最优)
目前已有基于numpy向量化实现的STL版本,支持直接传入二维数组一次性处理所有列,无需循环,性能和
seasonal_decompose处于同一数量级,1000列的处理耗时通常在百毫秒级别。
核心逻辑是把STL中每一步的LOESS平滑操作向量化,同时对所有列的对应位置做加权回归,避免单步循环的开销,你可以直接基于公开的向量化LOESS实现封装STL流程,也可以使用已经封装好的向量化STL工具包。参数复用优化
如果所有列的分解参数(周期、LOESS窗口大小、鲁棒迭代次数等)完全一致,可以预计算STL流程中公用的权重矩阵、索引偏移量等固定参数,复用给所有列的计算,能减少30%以上的重复计算开销。
内容的提问来源于stack exchange,提问作者kspr
相关产品推荐
相关产品推荐

