我想弄清楚为什么这两种方法在%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方法是否在此操作中创建数据副本?
答案 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。