不支持延迟对象的真相

时间:2018-10-04 12:04:04

标签: python dask

我正在使用dask延迟某些返回代码序列的函数的计算。到目前为止,大多数操作似乎都按预期运行-除了我使用np.average之外。

我拥有的函数返回一个pd.Series,然后我要对它计算加权平均值。

以下是非快速版本:

import dask
import numpy as np
import pandas as pd

s = pd.Series([1,2,3])
a = np.average(s, weights=s)
print(a)

ds = dask.delayed(lambda: s)()
a = np.average(ds, weights=ds)
print(a.compute())

np.average调用引发一个TypeError: Truth of Delayed objects is not supported

不确定我的用法中哪一部分是错误的。

1 个答案:

答案 0 :(得分:0)

问题在于您正在对延迟延迟的对象调用Numpy函数np.average。 Numpy函数不知道如何处理Dask Delayed对象,因此会引发错误。解决方案是也延迟numpy函数。

您可以执行以下操作:

a = dask.delayed(np.average)(ds, weights=ds)
a.compute()

这行得通(您得到了答案),但可能并非您所追求的那样。正在对数据调用单个函数-您确实在进行惰性操作,并且如果您有许多这样的计算,则可能会并行化。但是,我想像这样绕过延迟的熊猫系列是很不寻常的。

您可能想阅读high level数组和数据框架接口,其中已完成了将序列和数组拆分的逻辑。