Pandas成群结队缓慢地移动

2024-09-28 17:05:46 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Pandastshift非常棒。太快了!在

df = pd.DataFrame(index=pd.date_range(pd.datetime(1970,1,1),pd.datetime(1970,2,1)))
df['data']=.5
%timeit df.sum()
#10000 loops, best of 3: 162 µs per loop 
%timeit df.tshift(-1)
#1000 loops, best of 3: 307 µs per loop #x2 slower

但当我在^{之后做tshift时,速度会慢很多:

^{pr2}$

为什么分组时tshift慢得多?有没有更快的方法?在

更新:

我的实际用例更接近下面的代码。我看到减速乘数的大小取决于组的数量。在

n_A = 50
n_B = 5
index = pd.MultiIndex.from_product([arange(n_A),
                                     arange(n_B),
                                     pd.date_range(pd.datetime(1975,1,1),
                                                   pd.datetime(2010,1,1),
                                                   freq='5AS')],
                                   names=['A', 'B', 'Year'])

df = pd.DataFrame(index=index)
df['data']=.5

%timeit df.reset_index(['A','B']).groupby(['A','B']).sum()
#100 loops, best of 3: 4.34 ms per loop
%timeit df.reset_index(['A','B']).groupby(['A','B']).tshift(-1, freq='5AS')
#10 loops, best of 3: 198 ms per loop # X44 slowdown.

如果我们增加A组和B组的数量:

n_A = 500
n_B = 50
...
%timeit df.reset_index(['A','B']).groupby(['A','B']).sum()
#10 loops, best of 3: 35.8 ms per loop
%timeit df.reset_index(['A','B']).groupby(['A','B']).tshift(-1, freq='5AS')
#1 loops, best of 3: 20.3 s per loop # X567 slowdown

我很惊讶,随着群体数量的增加,增长速度变慢了!有没有更聪明的方法?在


Tags: ofloopdf数量datetimeindexpdbest
1条回答
网友
1楼 · 发布于 2024-09-28 17:05:46

tshift需要一个freq参数用于此用法(因为freq可能是潜在的,而且在您分组后通常不是正则的),因此df.groupby('A').tshift(-1)返回一个空帧(它为每个组提升,也会减慢它的速度)。在

In [44]: %timeit df.groupby('A').tshift(-1,'D')
100 loops, best of 3: 3.57 ms per loop

In [45]: %timeit df.groupby('A').sum()
1000 loops, best of 3: 1.02 ms per loop

除此之外,这个问题here也在等待shift(和tshift)的cythonized实现。这将使它与sum相当,后者是cythenized。欢迎投稿!在

使用第二个数据集(较大的组),可以执行以下操作:

^{pr2}$

所以在groupby之外进行日期减法可以使速度提高4倍。这(和缓存)是使分组tshift更快的第一步。在

相关问题 更多 >