[Pandas] Instruções separadas ou métodos encadeados?
Opa! Já faz pouco mais de 2 anos que estudo Pandas com Python e constantemente venho procurando formas de deixar o código mais legível...
Um padrão legal que já uso faz um bom tempo e gostaria de compartilhar com vocês é o "chained methods"! Vale lembrar que aqui não existe o errado e nem o certo.
Primeiramente vamos definir alguns dataframes abstratos para exemplificar:
import pandas as pd
# Definindo dataframes
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [4, 5, 6], 'D': [10, 11, 12]})
Método tradicional, com instruções isoladas (Como eu costumava fazer):
# Retorna do df1 onde A é maior que 1
df = df1.query('A > 1')
# Adiciona colunas de df2 onde as linhas de "B" e "C" correspondem
df = df.merge(df2, left_on=['B'], right_on=['C'])
# Adiciona uma nova coluna "E" que é a soma de "A" e "D"
df = df.assign(
E=df['A'] + df['D']
)
# Agrupa por "C" e soma "E" para cada grupo
df = df.groupby('C').agg(dict(E=sum))
# Renomeia coluna "E" para "F"
df = df.rename(columns={'E': 'F'})
Chained Methods (Como eu prefiro fazer agora):
df = (
df1
# Retorna do df1 onde A é maior que 1
.query('A > 1')
# Adiciona colunas de df2 onde as linhas de "B" e "C" correspondem
.merge(
df2,
left_on=['B'], right_on=['C']
)
# Adiciona uma nova coluna "E" que é a soma de "A" e "D"
.assign(
E=lambda x: x['A'] + x['D']
)
# Agrupa por "C" e soma "E" para cada grupo
.groupby('C')
.agg(dict(
E=sum
))
# Renomeia coluna "E" para "F"
.rename(columns=dict(
E="F"
))
)
Ainda não masterizei 100% o padrão, mas uma coisa que percebi é que isso pode facilmente virar um pesadelo caso você faça tudo em uma cadeia só!
Quando estamos trabalhando com transformações de dados, nada é muito fácil, mas o ideal é trabalhar com várias cadeias, cada cadeia com poucas responsabilidades e responsabilidades que não sejam muito distantes uma da outra.
Outra coisa a ser levada em consideração nesse padrão é o aumento na dificuldade em debugar o código já que você acaba perdendo a possibilidade de executar a transformação dos dados passo a passo.
Para ajudar nesse problema, podemos usar o modo interativo do VS Code.
Por exemplo, digamos que eu queira ver como fica o dataframe após adicionar a coluna "E":
- Copie instrução começando na abertura do parênteses até onde queremos parar.
- Cole no modo interativo.
- Feche o bloco com o parênteses que falta.
Eaí turma, o que acharam do padrão proposto? Não conheciam, conhecem, usam ou preferem não usar?
Eu conheço e prefiro usar a retribuição da variável, as vezes até salvando mais variáveis!
Sei que não é uma boa prática de memória, mas como não trabalhei com grandes bases e foi com objetivo didático, dessa forma é mais compreensível o que ocorre em cada passo
Muito legal este método, nunca tinha visto. Você vê esse padrão sendo adotado em algum projeto que use pandas?