A maneira eficiente de filtrar um data frame — Pandas

Arthur Lamblet Vaz
Data Hackers
Published in
2 min readSep 17, 2020

Esse post é com intuito de ser bem direto a respeito de dicas para otimizar, em termos computacionais, seus modelos ou códigos que utilizam muita quantidade de dados.

Para conseguir exemplificar, criei 6 variações de filtros de tabelas de dados do pandas.

Aplicando essas variações simples, percebemos que a diferença entre os tempos de execução existe, contudo é pequena.

100 loops, best of 3: 7.28 ms per loop 
100 loops, best of 3: 7.02 ms per loop
100 loops, best of 3: 6.46 ms per loop
100 loops, best of 3: 6.09 ms per loop
100 loops, best of 3: 6.77 ms per loop
100 loops, best of 3: 6.82 ms per loop

Agora, ao invés de termos um dataset de 100k observações, vamos testar com milhões de observações para entender se o desempenho continua equalizado.

Irei também adicionar mais 3 variações, onde irei selecionar três maneiras demonstradas anteriormente em funções, onde uma precisará de um input e as demais não. É de bons olhos sempre passar um input para a função, além de deixar mais organizado é mais fácil de entender a natureza da função.

Primeira var =  df.query('Compra=="B" & Pessoas=="2020" ')Segunda var = df.query('Compra=="B" and Pessoas=="2020" ')Terceira var = df.query('Compra=="B" & Pessoas==2020 ')Quarta var = df.query('Compra=="B" and Pessoas==2020 ')Quinta var = df[(df['Compra']=='B') & (df['Pessoas']==2020)]Sexta var = df[(df['Compra']=='B') & (df['Pessoas']=='2020')]Sétima var = def filtro6():               b = df[(df['Compra']=='B') & (df['Pessoas']=='2020')]               return bOitava var = def filtro7(df):               b = df[(df['Compra']=='B') & (df['Pessoas']=='2020')]               return bNona var = def filtro1():             b = df.query('Compra=="B" & Pessoas=="2020" ')             return b

Segue o gráfico com o resultado da simulação das técnicas de filtros, em bases de diferentes tamanhos.

Esse post parece simples, mas quando estamos diante de um modelo complexo que precisa não só filtrar, mas usar outras ferramentas para manipular um conjunto grande de dados, se preocupar com esses detalhes fazem toda a diferença.

Alguns take away interessantes:

  • Se preocupe em testar o tempo de processamento de cada chunk, para conseguir mapear pontos de melhorias para deixar o modelo mais dinâmico ;
  • Procure ficar por dentro das melhorias feitas nas versões atualizadas, normalmente eles inserem funções "básicas", que possuem um bom desempenho computacional;
  • Criar uma função em busca por desempenho, não é o melhor caminho (já vi sendo utilizado para isso);
  • Praticar bons hábitos de utilizar função.

Não fique triste se seu script está dando timeout, um sendo custoso operacionalmente. Dê uma revisada em sua estrutura do básico, porque como já dizia o Benjamin Franklin: Times is money!

Conheçe outras técnicas interessantes de filtro de DataFrame e quer compartilhar? Segue o código original para inserir-lá e me marque para verificar o resultado.

--

--

Arthur Lamblet Vaz
Data Hackers

Surfista, natureba e engenheiro de produção com ênfase em Data Science🌱🌍♻️