2016-08-29 5 views
3

API-интерфейс dask говорит, что map_partition можно использовать для «применения функции Python для каждого раздела DataFrame». Из этого описания и в соответствии с обычным поведением «карты» я ожидаю, что возвращаемое значение map_partitions будет (что-то вроде) списком, длина которого равна числу разделов. Каждый элемент списка должен быть одним из возвращаемых значений вызовов функций.Что такое map_partitions?

Однако в отношении следующего кода, я не уверен, что возвращаемое значение зависит от:

#generate example dataframe 
pdf = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD')) 
ddf = dd.from_pandas(pdf, npartitions=3) 

#define helper function for map. VAL is the return value 
VAL = pd.Series({'A': 1}) 
#VAL = pd.DataFrame({'A': [1]}) #other return values used in this example 
#VAL = None 
#VAL = 1 
def helper(x): 
    print('function called\n') 
    return VAL 

#check result 
out = ddf.map_partitions(helper).compute() 
print(len(out)) 
  • VAL = pd.Series({'A': 1}) причины 4 вызова функции (вероятно, один, чтобы вывести DTYPE и 3 для разделов) и выход с len == 3 и тип pd.Series.
  • pd.DataFrame({'A': [1]}) приводит к тому же числу, однако результирующим типом является pd.DataFrame.
  • VAL = None вызывает TypeError ... почему? Невозможно ли использовать map_partitions для do что-то, а не return что-то?
  • VAL = 1 приводит только к 2 вызовам функций. Результатом map_partitions является целым числом 1.

Поэтому я хочу задать несколько вопросов:

  1. как возвращаемое значение map_partitions определяется?
  2. Что влияет на количество вызовов функций, помимо количества разделов/Какие критерии выполняет функция, которую нужно вызывать один раз с каждым разделом?
  3. Какое должно быть возвращаемое значение функции, которое только «что-то» делает, т. Е. Процедура?
  4. Как должна быть создана функция, которая возвращает произвольные объекты?

ответ

1

Функция Dask DataFrame.map_partitions возвращает новую Dash Dataframe или Series, основанную на типе вывода отображаемой функции. См. API documentation для подробного объяснения.

  1. Как определяется возвращаемое значение map_partitions?

    См. Документы API, упомянутые выше.

  2. Что влияет на количество вызовов функций, помимо количества разделов/Какие критерии выполняет функция, которую нужно вызывать один раз с каждым разделом?

    Вы правы, что мы вызываем его один раз, чтобы угадать dtypes/columns вывода. Вы можете избежать этого, указав непосредственно ключевое слово meta=. Помимо этого функция вызывается один раз для каждого раздела.

  3. Какое должно быть возвращаемое значение функции, которая только «что-то» делает, т. Е. Процедуру?

    Вы всегда можете вернуть пустой информационный кадр. Вы также можете рассмотреть возможность преобразования вашего фрейма данных в последовательность объектов dask.delayed, которые обычно чаще используются для специальных вычислений.

  4. Как должна быть создана функция, которая возвращает произвольные объекты?

    Если ваша функция не возвращает серию/dataframes, я рекомендую преобразовать ваш dataframe в последовательность объектов dask.delayed с помощью метода DataFrame.to_delayed.

+0

Спасибо, особенно за подсказку использования dask.delayed в описанной ситуации. Но почему я только получаю 2 вызова функций в случае VAL = 1? –

+0

Могу ли я попросить вас [поднять вопрос] (https://github.com/dask/dask/issues/new) – MRocklin

+0

https://github.com/dask/dask/issues/1518 –