Pandas не поддерживает многопроцессорность и работает медленно с большими наборами данных. Есть лучший инструмент, который заставит работать эти ядра ЦП!

Pandas - один из лучших инструментов для Исследовательского анализа данных. Но это не значит, что это лучший инструмент для решения любой задачи, например, обработки больших данных. Я потратил так много времени на ожидание, пока панды прочитают кучу файлов или объединят их и вычислит характеристики.

Недавно я нашел время и нашел лучший инструмент, который заставил меня обновить конвейер обработки данных. Я использую этот инструмент для тяжелой обработки данных - например, для чтения нескольких файлов с 10 гигабайтами данных, применения к ним фильтров и агрегирования. Когда я закончил с тяжелой обработкой, я сохраняю результат в меньшем «удобном для pandas» CSV-файле и продолжаю поисковый анализ данных в pandas.

Вот несколько ссылок, которые могут вас заинтересовать:

- Complete your Python analyses 10x faster with Mito [Product]
- Free skill tests for Data Scientists & ML Engineers [Test]
- All New Self-Driving Car Engineer Nanodegree [Course]

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

Познакомьтесь с Даском

Dask обеспечивает расширенный параллелизм для аналитики, обеспечивая масштабируемую производительность для ваших любимых инструментов. Сюда входят numpy, pandas и sklearn. Он имеет открытый исходный код и находится в свободном доступе. Он использует существующие API-интерфейсы Python и структуры данных, чтобы упростить переключение между эквивалентами на базе Dask.

Dask делает простые вещи легкими, а сложные - возможными

Панды против Даска

Я мог бы продолжать описывать Dask, потому что у него так много функций, но вместо этого давайте рассмотрим практический пример. В своей работе я обычно получаю кучу файлов, которые мне нужно проанализировать. Давайте смоделируем мой рабочий день и создадим 10 файлов по 100 КБ записей (каждый файл имеет размер 196 МБ).

from sklearn.datasets import make_classification
import pandas as pd
for i in range(1, 11):
    print('Generating trainset %d' % i)
    x, y = make_classification(n_samples=100_000, n_features=100)
    df = pd.DataFrame(data=x)
    df['y'] = y
    df.to_csv('trainset_%d.csv' % i, index=False)

Теперь давайте прочитаем эти файлы с помощью панд и измерим время. В Pandas нет встроенной поддержки глобусов, поэтому нам нужно читать файлы в цикле.

%%time
import glob
df_list = []
for filename in glob.glob('trainset_*.csv'):
    df_ = pd.read_csv(filename)
    df_list.append(df_)
df = pd.concat(df_list)
df.shape

Панды читали файлы за 16 секунд.

CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s

А теперь представьте, если бы эти файлы были в 100 раз больше - вы бы даже не смогли их прочитать с помощью панд.

Dask может обрабатывать данные, которые не помещаются в памяти, разбивая их на блоки и задавая цепочки задач. Давайте посмотрим, сколько времени нужно Dask для загрузки этих файлов.

import dask.dataframe as dd
%%time
df = dd.read_csv('trainset_*.csv')
CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms

Даску потребовалось 154 мс! Как такое вообще возможно? Что ж, это не так. Даск придерживается парадигмы отложенного исполнения. Он рассчитывает вещи только тогда, когда они ему нужны. Мы определяем граф выполнения, чтобы Dask мог оптимизировать выполнение задач. Давайте повторим эксперимент - также обратите внимание, что функция Dask read_csv изначально принимает glob.

%%time
df = dd.read_csv('trainset_*.csv').compute()
CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s

Функция compute заставляет Dask вернуть результат. Dask читает файлы вдвое быстрее, чем pandas.

Dask изначально масштабирует Python

Pandas против использования процессора Dask

Dask использует все ядра, за которые вы заплатили? Давайте сравним использование ЦП между пандами и Dask при чтении файлов - код такой же, как и выше.

В приведенных выше записях экрана разница в многопроцессорности очевидна с pandas и Dask при чтении файлов.

Что происходит за кадром?

DataFrame Dask состоит из нескольких фреймов данных pandas, разделенных по индексу. Когда мы выполняем read_csv с Dask, несколько процессов читают один файл.

Мы даже можем визуализировать график выполнения.

exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()

Недостатки Даска

Вы можете подумать, если Даск такой классный, почему бы не отказаться от панд сразу. Что ж, не все так просто. На Dask портированы только определенные функции из pandas. Некоторые из них сложно распараллелить, например сортировка значений и установка индексов для несортированных столбцов. Dask - это не серебряная пуля - использование Dask рекомендуется только для наборов данных, которые не помещаются в основную память. Поскольку Dask построен на основе pandas, операции, которые выполнялись медленно в pandas, остаются медленными в Dask. Как я уже упоминал ранее, Dask - полезный инструмент в процессе конвейера данных, но он не заменяет другие библиотеки.

Dask рекомендуется только для наборов данных, которые не помещаются в основную память

Как установить Dask

Чтобы установить Dask, просто запустите:

python -m pip install "dask[complete]"

Это установит всю библиотеку Dask.

Заключение

В этом сообщении в блоге я коснулся только поверхности библиотеки Dask. Если вы хотите погрузиться глубже, ознакомьтесь с замечательной документацией Dask tutorials и Dask’s DataFrame. Интересуетесь, какие функции DataFrame поддерживаются в Dask? Отметьте DataFrame API.

Загрузите Блокнот Jupyter, чтобы следовать примерам.

Прежде чем ты уйдешь

Следуйте за мной в Twitter, где я регулярно пишу твиты о Data Science и машинном обучении.