Como ajudar os pandas no processamento de grandes quantidades de dados?

A biblioteca do pandas é uma das melhores ferramentas para análise exploratória de dados . Mas isso não significa que os pandas sejam uma ferramenta universal adequada para resolver qualquer problema. Em particular, estamos falando sobre o processamento de grandes quantidades de dados. Passei muito, muito tempo, esperando os pandas lerem muitos arquivos ou processá-los, calculando com base nas informações contidas neles alguns indicadores que me interessam. O fato é que os pandas não suportam mecanismos de processamento de dados paralelos. Como resultado, este pacote falha em tirar o máximo proveito dos recursos dos processadores modernos com vários núcleos. Grandes conjuntos de dados nos pandas são processados ​​lentamente.



Recentemente, propus-me a encontrar algo que me ajudasse no processamento de big data. Consegui encontrar o que estava procurando, incorporei a ferramenta encontrada no meu pipeline de processamento de dados. Eu o uso para trabalhar com grandes quantidades de dados. Por exemplo, para ler arquivos contendo 10 gigabytes de dados, filtrá-los e agregá-los. Quando lida com a solução desses problemas, salvei o que obtive em um arquivo CSV menor, adequado para pandas, e depois comecei a trabalhar com os dados recebidos usando pandas.

Aqui está um caderno Jupyter contendo exemplos desse material que você pode experimentar.

Dask


A ferramenta que eu uso para processar grandes quantidades de dados é a biblioteca Dask . Ele suporta processamento de dados paralelo, permitindo acelerar o trabalho das ferramentas existentes. Isso inclui numpy, pandas e sklearn. O Dask é um projeto de código aberto gratuito. Ele usa APIs Python e estruturas de dados, o que facilita a integração do Dask em projetos existentes. Se descrevermos brevemente o Dask, podemos dizer que essa biblioteca simplifica a solução de problemas comuns e torna possível resolver problemas de enorme complexidade.

Comparando pandas e dask


Eu posso descrever as possibilidades do Dask aqui, já que esta biblioteca tem muitas coisas interessantes, mas, em vez disso, considero apenas um exemplo prático. No decorrer do trabalho, geralmente encontro conjuntos de arquivos grandes, cujos dados armazenados precisam ser analisados. Vamos executar uma das minhas tarefas típicas e criar 10 arquivos, cada um contendo 100.000 registros. Cada um desses arquivos tem um tamanho de 196 MB.

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)

Agora leia esses arquivos usando pandas e meça o tempo necessário para lê-los. Não há suporte embutido no pandas glob, portanto, precisamos ler os arquivos em um loop:

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

Demorou 16 segundos para os pandas lerem esses arquivos:

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

Se falamos sobre o Dask, pode-se notar que esta biblioteca permite processar arquivos que não cabem na memória. Isso é feito dividindo-os em blocos e compilando cadeias de tarefas. Vamos medir o tempo que o Dask precisa ler esses arquivos:

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 levou 154 ms! Como isso é possível? De fato, isso não é possível. O Dask implementa um paradigma de tarefa atrasada. Os cálculos são realizados apenas quando seus resultados são necessários. Descrevemos o gráfico de execução, que permite ao Dask otimizar a execução de tarefas. Repita o experimento. Observe que a função read_csvdo Dask possui suporte interno para trabalhar com 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

O uso da função computeforça o Dask a retornar o resultado, para o qual você realmente precisa ler os arquivos. O resultado é que o Dask lê arquivos duas vezes mais rápido que os pandas.

Pode-se dizer que o Dask permite equipar projetos Python com ferramentas de dimensionamento.

Comparando o uso da CPU no Pandas e Dask


O Dask usa todos os núcleos do processador no sistema? Compare o uso de recursos do processador no pandas e no Dask ao ler arquivos. O mesmo código que analisamos acima se aplica aqui.


Usando recursos do processador ao ler arquivos com pandas


Usando recursos do processador ao ler arquivos usando o Dask

Algumas das imagens animadas acima permitem ver claramente como os pandas e o Dask usam os recursos do processador ao ler arquivos.

O que acontece nas entranhas de Dask?


Um quadro de dados do Dask consiste em vários quadros de dados do pandas, separados por índices. Quando executamos uma função read_csvdo Dask, ela lê o mesmo arquivo por vários processos.

Podemos até visualizar um gráfico dessa tarefa.

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


Gráfico de tempo de execução do Dask ao ler vários arquivos

Desvantagens do Dask


Talvez agora você tenha o seguinte pensamento: "Se a biblioteca do Dask é tão boa, por que não usá-la em vez de pandas?" Mas não é tão simples. Apenas algumas funções dos pandas são portadas para o Dask. O fato é que certas tarefas são difíceis de paralelizar. Por exemplo, classificando dados e atribuindo índices a colunas não classificadas. O Dask não é uma ferramenta que resolve absolutamente todas as tarefas de análise e processamento de dados. Recomenda-se que esta biblioteca seja usada apenas para trabalhar com conjuntos de dados que não cabem inteiramente na memória. Como a biblioteca do Dask é baseada em pandas, tudo o que funciona lentamente nos pandas permanecerá lento no Dask. Como eu disse antes, o Dask é uma ferramenta útil que você pode incorporar em um pipeline de processamento de dados, mas essa ferramenta não substitui outras bibliotecas.

Instale o Dask


Para instalar o Dask, você pode usar o seguinte comando:

python -m pip install "dask[complete]"

Sumário


Neste artigo, apenas toquei superficialmente nos recursos do Dask. Se você está interessado nesta biblioteca - dê uma olhada nesses ótimos tutoriais sobre o Dask e na documentação do datafreymam Dask. E se você quiser saber quais funções suportam quadros de dados do Dask, leia a descrição da API DataFrame.

Você usaria a biblioteca Dask?

Lembramos que continuamos o concurso de previsões no qual você pode ganhar um novo iPhone. Ainda há tempo para entrar nele e fazer a previsão mais precisa dos valores atuais.


All Articles