5 Ferramentas Python que você precisa conhecer

Gustavo Santos
Data Hackers
Published in
5 min readMay 3, 2021

--

Neste artigo, escrevo sobre alguns truques de Python que podem salvar o seu dia e o seu projeto.

Photo by Julie Molliver on Unsplash

Introdução

Atualmente existem milhares de bibliotecas Python disponíveis, de modo que fica difícil — para não dizer humanamente impossível — acompanhar tudo o que aparece no fantástico mundo da programação nessa linguagem.

Sabido isso, é certo que vamos deixar passar em branco aquele método ou aquela biblioteca que pode ser a salvação para um projeto ou justamente o que estávamos procurando para destravar aquele gargalo no código.

Então, vou listar aqui alguns desses truques — se me permitem chamá-los assim — para você melhorar a performance do seu código.

1. CSV ou Parquet (ou Pickle)?

O formato csv é um dos mais utilizados para compartilhar tabelas de dados. Por ser um formato simples e de ampla aceitação pelos softwares, é comum ver a opção de abrir ou salvar seus dados nesse formato. O lado negativo é o espaço em disco que essa extensão de arquivo toma, sendo o tamanho proporcional ao número de linhas e colunas.

Isso acontece porque o csv geralmente converte todos os dados em texto separados por vírgula, ocupando muito espaço de armazenamento do disco.

Uma solução simples pode ser usar outros formatos mais comprimidos que ocupam bem menos espaço em disco e não fazem nenhuma diferença para o Pandas. Em um teste, diminuí um arquivo de 5.6GB para 390MB (parquet) e 373MB (pickle com compression='gzip').

Eu gostei tanto desse formato que até criei um programa de Windows que faz essa conversão. O código e o link para baixar o executável estão disponibilizados no GitHub: https://bit.ly/3ugBe1A .

# Importe o pacote pyarrow (caso não tenha: pip install pyarrow)
import pyarrow
#Salvando um dataframe Pandas em .parquet
df.to_parquet('/file path', engine='pyarrow', compression='gzip')
# Lendo um arquivo parquet
pd.read_parquet('/file path', engine='pyarrow')
---#Salvando um dataframe Pandas em .pickle
df.to_pickle('/file path', compression='gzip')
# Lendo um arquivo parquet
pd.read_pickle('/file path')
Comparação de tamanho dos formatos de um arquivo com 77.164.939 linhas e 10 colunas.

2. Verificar Lista de Condições de Cláusula IF

O teste lógico IF é um dos fundamentos de programação. São vários os momentos em que precisamos testar se determinadas condições são verdadeiras ou falsas e tomar ações de acordo com a resposta.

Quando há a necessidade de testar mais de uma condição ao mesmo tempo, podemos usar & (and) ou | (or). Mas, para deixar o seu código um pouco mais limpo, você pode criar uma lista de condições e aplicar o teste de uma vez só.

Testando se todas as condições são verdadeiras: cond1 AND cond2 AND cond3

# Valores
cond1 = 10
cond2 = 'M'
cond3 = 1
# Lista de Condições
list_conditions = [cond1 <= 10,
cond2 == 'M',
cond3 == 1]
#Teste Lógico (AND)
if(all(list_conditions)):
print('Condições OK')
else:
print('Condições não alinhadas')
[Out]: Condições OK

Testando se ao menos uma condição é verdadeiras: cond1 OR cond2 OR cond3

# Valores
cond1 = 12
cond2 = 'F'
cond3 = 1
# Lista de Condições
list_conditions = [cond1 <= 10,
cond2 == 'M',
cond3 == 1]
#Teste Lógico (OR)
if(any(list_conditions)):
print('Condições OK')
else:
print('Condições não alinhadas')
[Out]: Condições OK

3. Carregando um Dataframe em Partes (chunks)

Photo by Mae Mu on Unsplash

Trabalhar com big data no Pandas pode ser uma tarefa desafiadora. À medida em que o número de linhas e colunas aumenta, maior é o desafio do Pandas em trazer o seu dataset para dentro do Python. Em alguns casos, é possível verificar um erro de memória apresentado durante o carregamento do CSV.

Uma boa solução é fazer o carregamento por partes, usando o parâmetro chunksize do pd.read_csv . Esse método não vai te retornar um dataframe, mas pedaços dele em .TextFileReader. Você deve, então, ler apenas uma parte e trabalhar com ela ou iterar sobre as partes com um loop e juntar as que te interessam.

# Carregando em Chunks (partes) de 10 mil linhas cada
df = pd.read_csv('file path', chunksize=10000)
# Verificando os shapes de um dataframe de 30 mil linhas e 10 cols
for chunk in df:
print(chunk.shape)
[Out]: (10000,10)
(10000,10)
(10000,10)
# Juntando os chunks em um novo dataframe
new_df = pd.DataFrame()
for chunk in pd.read_csv(path, chunksize=10000):
new_df = new_df.append(chunk)

4. Aumentar a Velocidade de Aplicação de Funções no Pandas

Seguindo na pegada de big data, quando trabalhamos com datasets muito grandes, até mesmo simples operações como soma ou subtração entre colunas pode tomar muito tempo. Isso acontece porque o processo por trás dessas operações é baseado em loops, onde o Pandas irá repetir o processamento para cada linha. É de se esperar que o tempo de execução aumente quanto maior for a quantidade de linhas.

A solução aqui é usar o pacote swifter (pip install swifter ). Este pacote vetoriza a aplicação de uma função, deixando-a muito mais rápida.

# Cria dataframe 10 million rows e 4 columns
df = pd.DataFrame( np.random.randint(1,1000, size=(10000000,4)),
columns =list('ABCD'))
# Function: Column C - Column D
def subtract_cd(c,d):
return c - d
%%time
# Regular apply
df['subt'] = df.apply(lambda x: subtract_cd(x['C'], x['D']), axis=1)

[Out]: 1 min 23 seg

Adicionamos apenas uma palavra no código: swifter

import swifter%%time
# Usando o Swifter
df['subt'] = df.swifter.apply(lambda x: subtract_cd(x['C'], x['D']), axis=1)

[Out]: 43 milisegundos

5. Group By e Funções de Agregação

Durante a exploração de dados, a função groupby() é uma grande aliada. Ela permite agrupar os dados e ter uma visão geral dos números por grupos, facilitando o entendimento dos dados.

Você pode visualizar diversos tipos de funções agregadoras ao mesmo tempo, economizando tempo.

# Cria dataframe
df = pd.DataFrame({'Nome': ['D1', 'D1', 'D3', 'D3', 'D3', 'D7', 'D7'], 'A': [1, 2, 4, 8, 16, 32, 64],'B':[1,2,3,4,5,6,7]})
# Funções para cada grupo
funcs = ['sum', 'mean', 'std']
# Colunas onde aplicaremos as funções
stats = {'A':funcs, 'B': funcs}
# Agrupamento
df.groupby('Nome').agg(stats)
Resultado do agrupamento

Conclusão

Python é uma linguagem em constante evolução. Com tantas pessoas criando novos pacotes todos os dias, é fácil nos perdermos na quantidade de dados disponíveis. Logo, posts como este, que trazem uma compilação de algumas funções podem ajudar na execução de projetos de forma mais rápida.

  • Salve seus dados em formato .parquet se quiser ocupar menos espaço em disco.
  • Seu código pode ficar mais limpo ao verificar uma lista de condições. Entretanto, observe que isso pode levar mais tempo.
  • Carregue datasets muito grandes usando o pd.read_csv('file',chunksize=xxx) .
  • Use o swifter para aplicar funções mais rapidamente em bigdata.
  • Groupby e listas são aliados na hora de visualizar resultados da agregação.

Encontre-me no Linkedin e diga que veio pelo post do Medium.

--

--

Gustavo Santos
Data Hackers

Data Scientist. I extract insights from data to help people and companies to make better and data driven decisions. | In: https://www.linkedin.com/in/gurezende/