熊猫:快速自定义聚合

Honza S.

我有一个需要时间采样的数据,必须重新采样:

interval = pd.Timedelta(1/8, "s")
resampled_df = df[["T", "N"]].resample(interval).max()

它的工作速度非常快,但是我需要自定义聚合函数(极端)而不是max

def extreme_agg(array_like):
    # return max or min - which absolute value is greater
    return max(array_like.max(), array_like.min(), key=abs)

interval = pd.Timedelta(1/8, "s")
resampled_df = df[["T", "N"]].resample(interval).apply(extreme_agg)

我也尝试过

resampled_df = df[["T", "N"]].resample(interval).agg(extreme_agg)

但是两种方法都非常慢。您知道如何使其更快吗?

还是有一个与我相当的商品extreme_agg

耶斯列尔

您可以使用更改此功能通过与选定的最小值和最大值的工作DataFrame.xs,也通过第一是聚合值minmax

np.random.seed(2021)

N = 10000
df = pd.DataFrame({'T':np.random.randint(100, size=N),
                   'N':np.random.randint(100, size=N)},
                  index=pd.timedelta_range(0, freq='100ms', periods=N)).sub(50)
# print (df)
    

def npwhere(df):
    interval = pd.Timedelta(1/8, "s")
    resampled_df = df[["T", "N"]].resample(interval).agg(['max','min'])
    amax = resampled_df.xs('max', axis=1, level=1)
    amin = resampled_df.xs('min', axis=1, level=1)
    return pd.DataFrame(np.where(-amin > amax, amin, amax), 
                                index=resampled_df.index,
                                columns=['T','N'])

resampled_df = npwhere(df)
print (resampled_df.head(10))

def extreme_agg(array_like):
    # return max or min - which absolute value is greater
    return max(array_like.max(), array_like.min(), key=abs)

interval = pd.Timedelta(1/8, "s")
resampled_df1 = df[["T", "N"]].resample(interval).agg(extreme_agg)
print (resampled_df1.head(10))

print (resampled_df.equals(resampled_df1))
True

In [206]: %timeit npwhere(df)
12.4 ms ± 46.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [207]: %timeit df[["T", "N"]].resample(interval).agg(lambda x: max(x, key = abs))
306 ms ± 4.47 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [208]: %timeit df[["T", "N"]].resample(interval).agg(extreme_agg)
2.29 s ± 14 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章