當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。