【发布时间】:2019-09-08 23:37:59
【问题描述】:
我正在做一个半小时的约会 groupby 并申请计算我的数据集的每日统计信息,但它很慢。有没有办法提高以下功能的性能?我读过矢量化,但不确定如何实现它。
我已经使用 apply 和 transform 来获得我想要的输出,但是一整年的数据大约需要 2-3 秒,我希望做得更快,因为我有很多数据。任何人都可以指出正确的方向吗?
import pandas as pd
import numpy as np
import timeit
# dummy data
date_range = pd.date_range('2017-01-01 00:00', '2018-01-01 00:00', freq='30Min')
df = pd.DataFrame(np.random.randint(2, 20, (date_range.shape[0], 2)), index=date_range, columns=['Electricity', 'Natural Gas'])
print(df.head())
print(df.shape)
t1 = timeit.default_timer()
onhour = df.groupby([pd.Grouper(freq='D')]).apply(lambda x: np.count_nonzero(
x[x > x.quantile(0.05) + x.mean() * .1] >
x.quantile(0.05) + 0.25 * (x.quantile(0.95)-x.quantile(0.05)),
axis=0) / 2)
onhour = pd.DataFrame(
onhour.values.tolist(),
index=onhour.index,
columns=df.columns)
print(f"start_time in {timeit.default_timer() - t1}")
print(onhour.head())
t1 = timeit.default_timer()
onhour = df.groupby([pd.Grouper(freq='D')]).transform(lambda x: np.count_nonzero(
x[x > x.quantile(0.05) + x.mean() * .1] >
x.quantile(0.05) + 0.25 * (x.quantile(0.95)-x.quantile(0.05)),
axis=0) / 2).resample('D').mean()
print(f"start_time in {timeit.default_timer() - t1}")
print(onhour.head())
【问题讨论】: