Вы все еще используете Pandas для Big Data?

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

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

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

Встречайте - Dask

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

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

Pandas vs 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 и замерим время. У Pandas нет встроенной поддержки glob, поэтому нам нужно делать это в цикле.

%%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

Pandas прочитал файлы за 16 секунд.

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

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

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

Dask понадобилось 154 миллисекунд! Как это вообще возможно? Что ж, это не совсем так. Dask отложил исполнение парадигмы. Он делает вычисления только тогда, когда это нужно. Мы определяем график выполнения, чтобы 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

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

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

Pandas vs Dask - использование процессора

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

Использование процессора c Pandas при чтении файлов

Использование процессора с Dask при чтении файлов

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

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

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

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

График выполнения Dask при чтении нескольких файлов

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

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

Для установки Dask просто запустите:

python -m pip install "dask [complete]"

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

Заключение

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

Источник 

Поделиться записью
Вверх