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