Время прочтения: 4 мин.

Предположим, что имеется файл payments.csv с данными об оплате клиентами некоторых товаров, содержащий четыре столбца: date — дата совершения платежа, customer — идентификатор клиента, category — категория товара/услуги, amount — сумма платежа.

datecustomercategoryamount

Как известно, количество строк в pandas можно определить с помощью функции len или свойства shape:

import pandas as pd
df = pd.read_csv('payments.csv')
n_rows = df.shape[0]
print(n_rows)

Теперь установим dask:

python -m pip install "dask[complete]"

Решим ту же задачу в dask:

import dask.dataframe as dd
df = dd.read_csv('payments.csv')
n_rows = df.shape[0].compute()
print(n_rows)

Для того, чтобы рассчитать сумму платежей по категориям с помощью pandas, необходимо выполнить следующий код:

import pandas as pd
df = pd.read_csv(‘payments.csv’)
sum_by_category = df.groupby('category')['amount'].sum()
print(sum_by_category)

То же действие в dask:

import dask.dataframe as dd
df = dd.read_csv('payments.csv')
sum_by_category = df.groupby('category')['amount'].sum().compute()
print(sum_by_category)

Как видно из примера выше, отличие в коде при использовании dask заключаются только в появлении метода compute.

В отличие от pandas, dask позволяет обрабатывать датасеты, размер которых значительно превышает объем оперативной памяти компьютера.

Для сравнения возможностей pandas и dask был проведен ряд экспериментов, заключающихся в замере скорости расчета суммы платежей с группировкой по категориям. Было использовано две платформы с двумя типами накопителей (см. таблицу ниже) и 15 файлов в формате CSV размером от 0,14 Мб (20 тыс. строк) до 27 Гб (480 млн строк).

Для каждого сочетания «платформа — накопитель — размер датасета – библиотека» была проведена серия из пяти экспериментов с замером времени выполнения, результаты в сериях усреднены.

Визуализация скорости обработки датасетов относительно небольшого размера (до 200 Мб) на платформе №1 представлена на диаграмме.

Из диаграммы следует, что при размере датасета приблизительно до 100 Мбайт скорость обработки с помощью pandas слегка превосходит скорость обработки с помощью dask, для больших размеров картина меняется на противоположную.

Диаграмма, охватывающая весь спектр датасетов, приведена ниже:

Из этой диаграммы можно сделать следующие выводы:

— для dask скорость обработки не зависит от размера датасета;

— для pandas при размере датасета, большем чем 25% от объема оперативной памяти, происходит существенное уменьшение скорости обработки, а при размере, сопоставимом с объемом оперативной памяти, наблюдаются сбои в работе.

На платформе №2 диаграмма выглядит схожим образом:

Таким образом, на относительно больших наборах данных dask выигрывает у pandas с позиций скорости обработки и стабильности работы.

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

Например, код для определения суммарного количества строк во всех csv-файлах будет выглядеть следующим образом:

import dask.dataframe as dd
df = dd.read_csv('*.csv')
n_rows = df.shape[0].compute()
print(n_rows)

Код для расчета суммы платежей по категориям:

import dask.dataframe as dd
df = dd.read_csv('*.csv')
sum_by_category = df.groupby('category')['amount'].sum().compute()
print(sum_by_category)

Функциональность dask не ограничивается решением задач, подобных рассмотренным. Так, механизм Dask Arrays существенно расширяет возможности по вычислениям на больших массивах по сравнению с “чистым” numpy, а надстройка Dask-ML позволяет строить модели машинного обучения на больших обучающих выборках. Исчерпывающее описание можно найти в документации по библиотеке.

Подводя итоги, можно сказать, что библиотека dask позволяет более полно использовать ресурсы персональных компьютеров для обработки данных и может быть рекомендована к широкому применению.

Код приведенных примеров, а также экспериментальные данные можно найти в репозитории автора.