resample()是一个基于时间的分组依据,其后是每个分组的归约方法。
但是,当我在分组方式中比较resample
和pd.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']] )
答案 0 :(得分:1)
实际上,它们是不等效的,该示例的设计很差。
如果改为在freq='14D'
中使用date_range
,则帧将不相等。 res_resample
将与NaN
一起排行(每隔一周),其中res_groupby
根本没有它们。
实际上,在相同的情况下,重采样似乎较慢,但它们不是同一件事,因此无法真正进行比较。