提升pandas groupby的性能

16 浏览
0 Comments

提升pandas groupby的性能

我有一个用Python编写的机器学习应用程序,其中包括一个数据处理步骤。起初,我是在Pandas的DataFrames上进行数据处理,但是由于性能太差,我最终改用纯Python进行重写,使用for循环代替矢量化操作,使用列表和字典代替DataFrames和Series。令我惊讶的是,用纯Python编写的代码性能比使用Pandas编写的代码要高得多。

由于我手写的数据处理代码比原始的Pandas代码要复杂得多,所以我还没有完全放弃使用Pandas,目前我正在尝试优化Pandas代码,但并没有取得太大的成功。

数据处理步骤的核心包括以下内容:首先,我将行分成几个组,因为数据包含几千个时间序列(每个“个体”一个),然后我对每个组进行相同的数据处理:大量的汇总、将不同的列合并成新的列等等。

我使用Jupyter Notebook的lprun对代码进行了性能分析,大部分时间都花在以下类似的行上:

grouped_data = data.groupby('pk')
data[[v + 'Diff' for v in val_cols]] = grouped_data[val_cols].transform(lambda x: x - x.shift(1)).fillna(0)
data[[v + 'Mean' for v in val_cols]] = grouped_data[val_cols].rolling(4).mean().shift(1).reset_index()[val_cols]
(...)

这是一种混合了矢量化和非矢量化处理的方法。我理解非矢量化操作不会比我手写的for循环更快,因为本质上它们就是for循环,但为什么它们会比我手写的代码慢这么多呢?我们谈论的是我的手写代码和Pandas代码之间性能下降了10-20倍。

我是不是做错了什么非常、非常严重的错误?

0