繁体   English   中英

如何将dask.dataframe与自定义dsk图一起使用

[英]how can one use dask.dataframe with custom dsk graphs

我将尝试重述我的问题:

如何将dask.dataframe与zip之类的功能结合在一起?

假设我们有一个名为“ accounts.0.csv”的文件,其中包含以下数据

id,names,amount
352,Dan,4837
387,Tim,208
42,Jerry,21
129,Patricia,284

我写了这段代码

import dask.dataframe as dd
import itertools
from dask.threaded import get


df = dd.read_csv('accounts.0.csv')

dsk = {'a': (dd.read_csv,('accounts.0.csv')),       
       'b': (itertools.repeat,(True)),       
       'res': (zip, 'a'[id],'b')       
       }

get(dsk, 'res')

此代码应生成如下内容:

352, True
387, True
42 , True
129, True

我怎样才能做到这一点 ?

你需要的“升降机”从计算内(从单子Haskell中借用的术语)的迭代出来, dask建立任务列表开始任何计算之前,因此你需要获得从“外”的任何计算的迭代器。 您对compute调用使您“脱颖而出”,这就是起作用的原因。

我不确定一个很好的例子,因为您要做的事取决于接下来要执行的其他任务,但是作为一个不太好但最小的例子:

import dask.imperative as di

arr = []
for col in df:
    arr.append(ddf[col].map(lambda x: (x,True)))
task = di.value([])+arr

创建一个任务列表,这些任务映射到每个系列中的值。 然后使用命令式模块将所有内容包装在一个任务中-找不到更好的方法来完成此任务,对不起!

然后,您可以compute任务以获取系列列表,或将其用于其他用途。

重新表达问题

我将尝试将您的问题改述如下:

如何将dask.dataframe与自定义dask图结合在一起?

df = dd.read_csv('myfile.csv')
dsk = {'x': (add, 1, 2)}

数据框是高级集合,模糊图则更高级。 我们必须将一个带到另一个的水平。

使用dask命令

我们可以使用dask.imperative将自定义函数转换为高级dsak对象

# dsk = {'x': (inc, 1, 2)}
x = dask.do(add)(1, 2)

然后,您可以在一个或两个对象上使用dask.compute

x_result = dask.compute(x)
or
df_result = dask.compute(df)
or
x_result, df_result = dask.compute(x, df)

随处使用低级dask图

可从.dask._keys()属性访问任何DataFrame对象的低级图形和最终键。

from toolz import merge
graph = merge(dsk, df.dask)  # merge both graphs together
keys = ['x', df._keys()]     # final keys to compute

x_results, df_results = get(graph, keys)

df_result = df._finalize(df_results)  # turn graph outputs back to pandas dataframe

Zip适用于Python迭代器,不适用于Pandas或Dask DataFrames。

要实现上面的示例,可以使用assign方法

大熊猫

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({'x': [1, 2, 3]})

In [3]: df
Out[3]: 
   x
0  1
1  2
2  3

In [4]: df.assign(y=True)
Out[4]: 
   x     y
0  1  True
1  2  True
2  3  True

dask.dataframe

In [5]: import dask.dataframe as dd

In [6]: ddf = dd.from_pandas(df, npartitions=1)

In [7]: ddf.assign(y=True).compute()
Out[7]: 
   x     y
0  1  True
1  2  True
2  3  True

通常不要将图形与数据框混合

dsk = {...}这样的字典式图形不应与dask.dataframe对象混合。 dask.dataframe对象在内部使用图形。 不应将它们放在其中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM