首页 > 解决方案 > 不支持延迟对象的真相

问题描述

我正在使用 dask 来延迟一些在我的代码库中返回系列的函数的计算。到目前为止,大多数操作的行为似乎都符合预期——除了我使用np.average.

我拥有的函数返回 apd.Series然后我想计算加权平均值。

以下是非 dask 和 dask 版本:

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

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

标签: pythondask

解决方案


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

您可以执行以下操作:

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

这有效(你得到了答案),但它可能不是你所追求的。正在对数据调用单个函数 - 你确实得到了惰性操作,如果你有很多这样的计算,你可能会得到并行性。但是,我想说像这样传递延迟的熊猫系列是很不寻常的。

您可能想阅读高级数组和数据帧接口,其中为您完成了拆分系列和数组的逻辑。


推荐阅读