gpt4 book ai didi

python - Pandas 在群体中移动缓慢

转载 作者:行者123 更新时间:2023-11-28 21:53:27 25 4
gpt4 key购买 nike

使用 Pandas tshift 非常棒。这相当快!

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

但是当我在 groupby 之后执行 tshift 时,它会慢很多:

df = pd.DataFrame(index=pd.date_range(pd.datetime(1970,1,1),pd.datetime(1970,2,1)))
df['data']=.5
df['A'] = randint(0,2,len(df.index))
%timeit df.groupby('A').sum()
#100 loops, best of 3: 2.72 ms per loop
%timeit df.groupby('A').tshift(-1)
#10 loops, best of 3: 16 ms per loop #x6 slower!

为什么在分组时 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

令我惊讶的是,随着组数的增加,速度变慢了!有没有更聪明的方法来做到这一点?

最佳答案

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 相提并论,后者是 cythonized 的。欢迎投稿!

使用你的第二个数据集(更大的组),你可以这样做:

In [59]: def f(df):
....: x = df.reset_index()
....: x['Year_ts'] = pd.DatetimeIndex(x['Year'])-pd.offsets.YearBegin(5)
....: return x.drop(['Year'],axis=1).rename(columns={'Year_ts' : 'Year'}).set_index(['A','B','Year'])
....:

In [60]: result = df.reset_index(['A','B']).groupby(['A','B']).tshift(-1,'5AS')

In [61]: %timeit df.reset_index(['A','B']).groupby(['A','B']).tshift(-1,'5AS')
1 loops, best of 3: 10.8 s per loop

In [62]: result2 = f(df)

In [63]: %timeit f(df)
1 loops, best of 3: 2.51 s per loop

In [64]: result.equals(result2)
Out[64]: True

因此,在 groupby 之外进行日期减法可以使速度提高大约 4 倍。这(和缓存)可能是加快分组转换速度的第一步。

关于python - Pandas 在群体中移动缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26295861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com