熊猫:功能和应用于系列之间的时间差异

时间:2014-04-16 05:09:06

标签: python pandas

我想弄清楚为什么这两种方法在%timeit结果中有所不同。

import pandas as pd
import numpy as np
d = pd.DataFrame(data={'S1' : [2,3,4,5,6,7,2], 'S2' : [4,5,2,3,4,6,8]}, \
                 index=[1,2,3,4,5,6,7])

%timeit pd.rolling_mean(d, window=3, center=True)
10000 loops, best of 3: 182 µs per loop

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3, center=True))
1000 loops, best of 3: 695 µs per loop

为什么apply(lambda)方法要慢3.5 x。在更复杂的数据帧中,我注意到了更大的差异(~10 x)。

lambda方法是否在此操作中创建数据副本?

1 个答案:

答案 0 :(得分:4)

看起来使用raw=True选项可以消除此示例中的大多数性能差异:

%timeit pd.rolling_mean(d, window=3, center=True)
1000 loops, best of 3: 281 µs per loop

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3, center=True))
1000 loops, best of 3: 1.02 ms per loop

现在添加Raw=True选项:

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3, center=True),raw=True)
1000 loops, best of 3: 289 µs per loop

添加reduce=False可以让您获得较小的加速,因为大熊猫不必猜测回报:

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3,center=True),raw=True,reduce=False)
1000 loops, best of 3: 285 µs per loop

因此,在这种情况下,大多数性能差异都是相关的,将每列转换为Series并将每个系列分别传递给rolling_mean。让它使用Raw=True它只是传递ndarrays。