为什么在groupby中重采样比pd.Grouper慢得多?

时间:2018-06-26 19:29:09

标签: python pandas

根据pandas documention

  

resample()是一个基于时间的分组依据,其后是每个分组的归约方法。

但是,当我在分组方式中比较resamplepd.Grouper的使用情况(赞成pd.Grouper)时,我发现性能存在巨大差异

我有一个数据框,其中的每一行代表某天某种类型(例如传感器)的值。看起来像这样:

date         type  value
2018-01-01   1     12
2018-01-02   1     14
....
2018-01-01   2     12
....

在该数据帧上

df.set_index('DT').sort_index().groupby(['type']).resample('W').first()

df.groupby(['type', pd.Grouper(key='DT', freq='W')]).first()

做完全一样的事情。但是,在下面的示例数据集中,resample方法比pd.Grouper方法慢30倍(这与我在真实数据集中观察到的一致)。

这种性能下降是从哪里来的?

# Creating the frame
date_range = pd.date_range(start=dt.datetime(2017,1,1), end=dt.datetime(2025,12,31), freq='W')
to_concat = []
for val in range(1,100):
    frame_tmp = pd.DataFrame()
    frame_tmp['DT'] = date_range
    frame_tmp['type'] = val
    frame_tmp['value'] = np.random.randint(1, 6, frame_tmp.shape[0])
    to_concat.append(frame_tmp)

df = pd.concat(to_concat, ignore_index=True)

%%timeit 
df.set_index('DT').sort_index().groupby(['type']).resample('W').first()

%%timeit
df.sort_values('DT').groupby(['type', pd.Grouper(key='DT', freq='W')]).first()

# Checking that they are indeed equals
res_groupby = df.sort_values('DT').groupby(['type', pd.Grouper(key='DT', freq='W')]).first()
res_resample = df.set_index('DT').sort_index().groupby(['type']).resample('W').first()
pd.DataFrame.equals(res_groupby, res_resample[['value']] )

1 个答案:

答案 0 :(得分:1)

实际上,它们是等效的,该示例的设计很差。 如果改为在freq='14D'中使用date_range,则帧将不相等。 res_resample将与NaN一起排行(每隔一周),其中res_groupby根本没有它们。

实际上,在相同的情况下,重采样似乎较慢,但它们不是同一件事,因此无法真正进行比较。