2017-02-01 26 views
2

Так что у меня проблема с dask DataFrame.append. Я генерирую много производных функций из основных данных и добавляю их к основному фреймворку. После этого взорвался граф dask для любого набора столбцов. Вот небольшой пример:dask DataFrame.assign взрывает диаграмму 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

Представьте у меня есть много много порождены колонн. Таким образом, граф вычислений для любого конкретного столбца включает нерелевантные вычисления для всех остальных столбцов. То есть в моем случае у меня есть len (ddf ['someColumn']. dask)> 100000. Так что это становится непригодным для использования быстро.

Так что мой вопрос в том, можно ли решить эту проблему? Существуют ли какие-либо средства для этого? Если нет - в каком направлении я должен это реализовать?

Спасибо!

ответ

5

Вместо того, чтобы постоянно назначая новые столбцы DASK dataframe, вы можете построить несколько серий DASK и затем CONCAT их все вместе в конце

Так вместо того, чтобы делать это:

df['x'] = df.w + 1 
df['y'] = df.x * 10 
df['z'] = df.y ** 2 

Do это

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) 

Кроме того, в то время как графы задачи миллиона узлов меньше, чем идеал, также должно быть в порядке. Я видел, как большие графики работают комфортно.

+0

Спасибо за быстрый ответ. Я использую df = df.assign (x = x, y = y, z = z) в данный момент, присваивая все ряды сразу, но есть такие дополнительные узлы в графе для столбцов, которые не нуждаются в этих вычислениях. Есть ли способ оптимизировать график таким образом, что, когда вы получаете подмножество столбцов, он обрабатывает все остальные вычисления? Моим обходным решением было вычислить все, сохранить в hdf, загрузить его, а затем я могу получить доступ к некоторому подмножеству столбцов по запросу. Но тогда ограничение длины hdf столбцов поразило меня, и я снова начал чередовать данные, снова собирая подмножества столбцов. – oxymoron

+2

Если вы используете только 'x' и' y', а не 'z', тогда dask удалит' z' из вычисления. Однако, как только вы назначите их всех в dataframe вы застряли с ними все. Dask не выполняет оптимизацию на высоком уровне, как то, что вы хотите. Вы можете попробовать остановиться на Парке вместо HDF5. Также будет намного быстрее прочитать несколько столбцов, чем с HDF5 – MRocklin

+0

Спасибо, попробуем паркет – oxymoron

 Смежные вопросы

  • Нет связанных вопросов^_^