【问题标题】:Computing dask delayed objects stored in dataframe计算存储在数据框中的延迟对象
【发布时间】:2019-08-12 20:09:30
【问题描述】:

我正在寻找计算存储在数据框中的许多 dask delayed 对象的最佳方法。我不确定是否应该将 pandas 数据帧转换为带有 delayed 对象的 dask 数据帧,或者是否应该对 pandas 数据帧的所有值调用 compute 调用。

一般来说,我会很感激任何建议,因为在嵌套 for 循环中传递 delayed 对象的逻辑有问题。

import numpy as np
import pandas as pd
from scipy.stats import hypergeom
from dask import delayed, compute

steps = 5
sample = [int(x) for x in np.linspace(5, 100, num=steps)]
enr_df = pd.DataFrame()

for N in sample:
    enr = []
    for i in range(20):
        k = np.random.randint(1, 200)
        enr.append(delayed(hypergeom.sf)(k=k, M=10000, n=20, N=N, loc=0))
    enr_df[N] = enr

如果不对所有单元格应用该函数,我就无法在此数据帧上调用 compute,如下所示:enr_df.applymap(compute)(我相信在每个值上单独调用 compute)。

但是,如果我转换为 dask 数据帧,我想要计算的 delayed 对象将分层在 dask 数据帧结构中:

enr_dd = dd.from_pandas(enr_df, npartitions=1)
enr_dd.compute()

我期望的计算输出没有继续。

【问题讨论】:

    标签: python-3.x pandas dask dask-delayed


    【解决方案1】:

    您可以将延迟对象列表传递给dask.compute

    results = dask.compute(*list_of_delayed_objects)
    

    因此,您需要从 Pandas 数据框中获取列表。这是您可以使用普通 Python 代码执行的操作。

    【讨论】:

    • 对,如果所有延迟的对象都存储在一个列表中,性能会最好,dask.compute() 被调用,然后重新格式化?即使列表很大?
    • 性能不会有什么不同。无论任务如何呈现,Dask 的每个任务都有大约 300us 的开销。
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多