用法:
Bag.foldby(key, binop, initial='__no__default__', combine=None, combine_initial='__no__default__', split_every=None)
组合归约和分组。
Foldby 为高效的并行 split-apply-combine 任务提供组合的 groupby 和 reduce。
计算
>>> b.foldby(key, binop, init)
等效于以下内容:
>>> def reduction(group): ... return reduce(binop, group, init)
>>> b.groupby(key).map(lambda (k, v): (k, reduction(v)))
但是使用最少的通信,因此速度更快。
>>> import dask.bag as db >>> b = db.from_sequence(range(10)) >>> iseven = lambda x: x % 2 == 0 >>> add = lambda x, y: x + y >>> dict(b.foldby(iseven, add)) {True: 20, False: 25}
按键函数
关键函数决定了如何对包中的元素进行分组。在您的包中装有字典的常见情况下,关键函数通常会从其中一个元素中取出。
>>> def key(x): ... return x['name']
这种情况很常见,以至于它是特殊情况,如果您提供的键不是可调用函数,那么 dask.bag 会自动将其变为一个。以下是等价的:
>>> b.foldby(lambda x: x['name'], ...) >>> b.foldby('name', ...)
比诺普斯
构建正确的二元运算符来执行分析查询可能很棘手。
foldby
方法接受两个二元运算符binop
和combine
。二元运算符的两个输入和输出必须具有相同的类型。Binop 采用一个运行总计和一个新元素并产生一个新总计:
>>> def binop(total, x): ... return total + x['amount']
Combine 取两个总数并将它们组合起来:
>>> def combine(total1, total2): ... return total1 + total2
在看到任何其他值之前,这些二元运算符中的每一个都可能具有默认的第一个总计值。对于像上面这样的附加二元运算符,这通常是
0
或您的操作的标识元素。split_every
在执行缩减时将分区分组为该大小的组。默认为 8。
>>> b.foldby('name', binop, 0, combine, 0)
例子:
我们可以计算一些
(key, value)
对的最大值,按key
分组。 (最好将Bag
转换为dask.dataframe
并使用它的groupby)。>>> import random >>> import dask.bag as db
>>> tokens = list('abcdefg') >>> values = range(10000) >>> a = [(random.choice(tokens), random.choice(values)) ... for _ in range(100)] >>> a[:2] [('g', 676), ('a', 871)]
>>> a = db.from_sequence(a)
>>> def binop(t, x): ... return max((t, x), key=lambda x: x[1])
>>> a.foldby(lambda x: x[0], binop).compute() [('g', ('g', 984)), ('a', ('a', 871)), ('b', ('b', 999)), ('c', ('c', 765)), ('f', ('f', 955)), ('e', ('e', 991)), ('d', ('d', 854))]
相关用法
- Python dask.bag.Bag.fold用法及代码示例
- Python dask.bag.Bag.frequencies用法及代码示例
- Python dask.bag.Bag.flatten用法及代码示例
- Python dask.bag.Bag.filter用法及代码示例
- Python dask.bag.Bag.to_textfiles用法及代码示例
- Python dask.bag.Bag.repartition用法及代码示例
- Python dask.bag.Bag.join用法及代码示例
- Python dask.bag.Bag.accumulate用法及代码示例
- Python dask.bag.Bag.map_partitions用法及代码示例
- Python dask.bag.Bag.groupby用法及代码示例
- Python dask.bag.Bag.reduction用法及代码示例
- Python dask.bag.Bag.remove用法及代码示例
- Python dask.bag.Bag.random_sample用法及代码示例
- Python dask.bag.Bag.distinct用法及代码示例
- Python dask.bag.Bag.topk用法及代码示例
- Python dask.bag.Bag.any用法及代码示例
- Python dask.bag.Bag.pluck用法及代码示例
- Python dask.bag.Bag.to_avro用法及代码示例
- Python dask.bag.Bag.map用法及代码示例
- Python dask.bag.Bag.count用法及代码示例
注:本文由纯净天空筛选整理自dask.org大神的英文原创作品 dask.bag.Bag.foldby。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。