【问题标题】:Dask DataFrame aggregate to medianDask DataFrame 聚合到中位数
【发布时间】:2017-10-04 08:49:55
【问题描述】:

我正在尝试将一个 dask 数据框聚合为一组指标,包括中位数,但似乎不支持该中位数。有没有机会聚合并获得中位数?

st_agg = df.groupby(['start station id', 'end station id']).agg({'usertype':'count', 'tripduration':'median'})

>>> ValueError: unknown aggregate median

【问题讨论】:

  • 您可能会惊讶地发现,中位数的并行计算非常具有挑战性
  • 我明白这一点,但有一些相对便宜的近似值。
  • Dask.dataframe 支持近似分位数。我不认为这些是通过 groupby.agg 接口暴露的。您可以open an issue 请求该功能。
  • 谢谢,会的!
  • @Philipp_Kats 你设法解决了这个问题吗?目前正在努力解决它,所以如果你有解决方案......

标签: python dask


【解决方案1】:

截至 2021 年 10 月 6 日,Dask 中尚未实现此功能。有一个开放的功能请求here

特定情况的解决方法

对于同一问题,以下代码适用于每个分组列的数据恰好适合 1 个分区的特定用例:

ddf = dask.datasets.timeseries()
ddf = ddf.set_index('id')

median_fun = dd.Aggregation(
    name="median",
    # this computes the median on each partition
    chunk=lambda s: s.median(),
    # this combines results across partitions; the input should just be a list of length 1
    agg=lambda s0: s0.sum(),
)

median_ddf = ddf.groupby("id")["x"].agg(median_fun)

一般解决方案

对于较大的数据集,您可以构建一个自定义聚合函数,使用“dd.groupby.Aggregation”计算中位数(或第 50 个百分位数)。如果您这样做,请考虑将其作为 PR 提交以解决上面列出的功能请求。

在此处查看文档:https://docs.dask.org/en/stable/generated/dask.dataframe.groupby.Aggregation.html#dask-dataframe-groupby-aggregation

中位数与第 50 个百分位数

请注意,对于大多数实际用途,在处理大型数据集时,第 50 个百分位数和中位数是等效的:https://math.stackexchange.com/questions/2048470/is-50th-percentile-equal-to-median

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多