当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python dask.bag.Bag.foldby用法及代码示例


用法:

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 方法接受两个二元运算符 binopcombine 。二元运算符的两个输入和输出必须具有相同的类型。

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))]

相关用法


注:本文由纯净天空筛选整理自dask.org大神的英文原创作品 dask.bag.Bag.foldby。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。