Python 不支持延迟对象的真实性

Python 不支持延迟对象的真实性,python,dask,Python,Dask,我使用dask延迟一些函数的计算,这些函数在我的代码库中返回序列。到目前为止,大多数操作的行为似乎与预期的一样-除了我使用的np.average 我使用的函数返回一个pd.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.de

我使用dask延迟一些函数的计算,这些函数在我的代码库中返回序列。到目前为止,大多数操作的行为似乎与预期的一样-除了我使用的
np.average

我使用的函数返回一个
pd.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:不支持延迟对象的真值


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

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

您可以执行以下操作:

a = dask.delayed(np.average)(ds, weights=ds)
a.compute()
这是可行的(你得到了答案),但它很可能不是你想要的。对数据调用单个函数-您确实得到了惰性操作,如果您有许多这样的计算,您可能会得到并行性。然而,我要说的是,像这样传递延迟的熊猫系列是非常不寻常的


您可能需要阅读阵列和数据帧接口,在这些接口中,可以为您完成拆分系列和阵列的逻辑。

FWIW我经常传阅延迟系列。我认为这是一起使用达斯克和熊猫的自然方式。当然,正如您所说,您必须同时运行多个延迟呼叫才能使其有价值。谢谢。有了numpy不知道dask的想法,我的到期日是它确实可以工作,所以
np.sum().compute()
会工作。我对np.average也有同样的期望。我还直接尝试了dask实现
da.average
,但出现了相同的错误。在这种情况下,延迟序列不是很大,因此目前不需要利用dask,但有许多延迟序列,因此我在该轴上利用dask。我现在已经解决了这个问题,只需使用更原始的*,/,和
np.sum
编写我自己的简单加权平均值。