dask DataFrame.assign 炸毁了 dask 图表
dask DataFrame.assign blows up dask graph
所以我对 dask DataFrame.append 有疑问。我从主数据生成大量衍生特征并将它们附加到主数据框。之后,任何一组列的 dask 图表都被放大了。这是一个小例子:
%pylab inline
import numpy as np
import pandas as pd
import dask.dataframe as dd
from dask.dot import dot_graph
df=pd.DataFrame({'x%s'%i:np.random.rand(20) for i in range(5)})
ddf = dd.from_pandas(df, npartitions=2)
dot_graph(ddf['x0'].dask)
here is the dask graph as expected
g=ddf.assign(y=ddf['x0']+ddf['x1'])
dot_graph(g['x0'].dask)
here the graph for same column is exploded with irrelevant computation
假设我有很多生成的列。因此,任何特定列的计算图都包括所有其他列的不相关计算。 IE。在我的例子中,我有 len(ddf['someColumn'].dask)>100000。所以很快就无法使用了。
所以我的问题是这个问题可以解决吗?有没有现成的方法可以做到这一点?如果不是-我应该朝哪个方向实施呢?
谢谢!
与其不断地将新列分配给 dask 数据框,不如构建多个 dask 系列,然后在最后将它们连接在一起
所以不要这样做:
df['x'] = df.w + 1
df['y'] = df.x * 10
df['z'] = df.y ** 2
这样做
x = df.w + 1
y = x + 10
z = y * 2
df = df.assign(x=x, y=y, z=z)
或者这个:
dd.concat([df, x, y, z], axis=1)
然而,这可能仍会在您的图形中产生相同数量的任务,但可能会导致更少的内存副本。
或者,如果您的所有转换都是 row-wise,那么您可以构造一个 pandas 函数并将其映射到所有分区
def f(part):
part = part.copy()
part['x'] = part.w + 1
part['y'] = part.x * 10
part['z'] = part.y ** 2
return part
df = df.map_partitions(f)
此外,虽然 million-node 任务图不太理想,但也应该没问题。我看过更大的图表 运行 很舒服。
所以我对 dask DataFrame.append 有疑问。我从主数据生成大量衍生特征并将它们附加到主数据框。之后,任何一组列的 dask 图表都被放大了。这是一个小例子:
%pylab inline
import numpy as np
import pandas as pd
import dask.dataframe as dd
from dask.dot import dot_graph
df=pd.DataFrame({'x%s'%i:np.random.rand(20) for i in range(5)})
ddf = dd.from_pandas(df, npartitions=2)
dot_graph(ddf['x0'].dask)
here is the dask graph as expected
g=ddf.assign(y=ddf['x0']+ddf['x1'])
dot_graph(g['x0'].dask)
here the graph for same column is exploded with irrelevant computation
假设我有很多生成的列。因此,任何特定列的计算图都包括所有其他列的不相关计算。 IE。在我的例子中,我有 len(ddf['someColumn'].dask)>100000。所以很快就无法使用了。
所以我的问题是这个问题可以解决吗?有没有现成的方法可以做到这一点?如果不是-我应该朝哪个方向实施呢?
谢谢!
与其不断地将新列分配给 dask 数据框,不如构建多个 dask 系列,然后在最后将它们连接在一起
所以不要这样做:
df['x'] = df.w + 1
df['y'] = df.x * 10
df['z'] = df.y ** 2
这样做
x = df.w + 1
y = x + 10
z = y * 2
df = df.assign(x=x, y=y, z=z)
或者这个:
dd.concat([df, x, y, z], axis=1)
然而,这可能仍会在您的图形中产生相同数量的任务,但可能会导致更少的内存副本。
或者,如果您的所有转换都是 row-wise,那么您可以构造一个 pandas 函数并将其映射到所有分区
def f(part):
part = part.copy()
part['x'] = part.w + 1
part['y'] = part.x * 10
part['z'] = part.y ** 2
return part
df = df.map_partitions(f)
此外,虽然 million-node 任务图不太理想,但也应该没问题。我看过更大的图表 运行 很舒服。