2017-02-01 17 views
2

これで、dask DataFrame.appendに問題があります。私は主なデータから多くの派生的な特徴を生成し、それを主なデータフレームに追加します。その後、列のセットのダスクグラフが爆発します。ここで小さな例です:dask DataFrame.assignがダッシュグラフを吹き飛ばします

%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

は私が生まれた列の多くの多くを持っている想像してみてください。したがって、特定の列の計算グラフには、他のすべての列の無関係な計算が含まれます。私。私の場合はlen(ddf ['someColumn'] .dask)> 100000です。だから、すぐに使えなくなる。

この問題は解決できますか?これを行うための既存の手段はありますか?そうでなければ、これを実装するにはどの方向に向けるべきですか?

ありがとうございます!

答えて

5

むしろ連続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) 

これでもグラフのタスクは同じになる可能性がありますが、メモリコピーが少なくなる可能性があります。また

、あなたの変換のすべてが行方向であれば、あなたはパンダの機能を構築することができますし、数百万ノードのタスクグラフが理想的である一方で、また、すべてのパーティションにわたって

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) 

ていることにマッピングし、それがまたOKでなければなりません。私は大きなグラフが快適に走っているのを見ました。

+0

すぐにお返事ありがとうございます。私はすべての系列を一度に割り当てるというdf = df.assign(x = x、y = y、z = z)を使用していますが、それらの計算を必要としない列のグラフには追加ノードがあります。グラフの最適化の方法は、列のサブセットを取得したときに他のすべての計算をトリミングする方法ですか?私の回避策は、すべてを計算し、hdfに保存してロードし、必要に応じて列の一部のサブセットにアクセスできるようにすることでした。しかし、hdfカラムの長さの制限が私に当たって、再びデータのチャンクを開始し、カラムのサブセットを再度ピックしました。 – oxymoron

+2

'x'と' y'だけを使用し、 'z'を使わない場合、daskは計算から' z'を削除します。しかし、一度それらをすべてデータフレームに割り当てると、それらのすべてが詰まってしまいます。 Daskは、あなたが望むような高度な最適化を実行しません。あなたは、HDF5の代わりにパーケットに固執しようとするかもしれません。また、HDF5よりもいくつかの列を読む方がはるかに高速になるでしょう – MRocklin

+0

ありがとう、寄木細工 – oxymoron

関連する問題