2016-11-17 2 views
4

Так dask.dataframe.map_partitions() принимает аргумент func и meta kwarg. Как именно он определяет свой тип возврата? В качестве примера:Python Dask - dataframe.map_partitions() возвращаемое значение

Много csv's в ... \ some_folder.

ddf = dd.read_csv(r"...\some_folder\*", usecols=['ColA', 'ColB'], 
             blocksize=None, 
             dtype={'ColA': np.float32, 'ColB': np.float32}) 
example_func = lambda x: x.iloc[-1]/len(x) 
metaResult = pd.Series({'ColA': .1234, 'ColB': .1234}) 
result = ddf.map_partitions(example_func, meta=metaResult).compute() 

Я довольно новый для «распределенного» вычисления, но я бы интуитивно ожидать, что это возвращает коллекцию (список или словарь, скорее всего) объектов серии, но результат является серией объекта, который может считаться конкатенацией результатов example_func на каждом разделе. Это само по себе также было бы достаточно, если бы эта серия имела MultiIndex для обозначения метки раздела.

Из того, что я могу сказать от this question, то docs и the source code itself, это потому, что ddf.divisions возвратит (None, None, ..., None) в результате чтения CSV-? Есть ли способ, используемый на основе dask, для этого, или мне нужно вручную войти и сломать возвращенную серию (конкатенацию серии, которая была возвращена example_func на каждый раздел) сама?

Также не стесняйтесь исправить мои предположения/практики здесь, так как я новичок в dask.

ответ

2

So dask.dataframe.map_partitions() принимает Func аргумент и мета kwarg. Как именно он определяет свой тип возврата?

map_partition пытается объединить результаты, возвращенные func либо в DASK DataFrame или объект Даска серии в «умном» способе. Это решение основано на значении возврата func:

  • If func возвращает скаляр, map_partitions возвращает объект Даска серии.
  • Если func возвращает объект pd.Series, map_partition возвращает объект серии dask, в котором все объекты pd.Series, возвращаемые func, объединяются.
  • Если func возвращает pd.DataFrame, map_partitions возвращает объект Dataframe dask, в котором эти pd.DataFrame obejcts объединены вдоль первой оси.

Если вас интересует конкретный раздел, вы можете использовать get_partition(). Если метка раздела в целом важна для вас, я бы рассмотрел возможность назначить отдельный столбец вашего ddf непосредственно после чтения в данных csv, который содержит всю необходимую информацию. Впоследствии вы могли бы построить func таким образом, чтобы он возвращал pd.DataFrame, содержащий результат вашего расчета в одном столбце, и информацию, необходимую для идентификации результата в другом.

+0

Столбец индикатора ... duh! Принято. – StarFox