Olá, pessoal! Tudo bem?
Gostaria de compartilhar uma dica rápida de otimização de código referente à Etapa 2 dos Projetos Desafio 1 (Vendas Online) e 2 (Administração de Condomínios), especificamente na hora de limpar os caracteres de moeda e converter a coluna para float.
Nas aulas, vimos a abordagem usando o .apply(lambda x: ...) para fazer as substituições com o .replace(). Essa forma funciona perfeitamente e é ótima para entender a lógica. Porém, no dia a dia da área de dados, ao lidar com bases gigantescas (milhões de linhas), o .apply() pode virar um gargalo de performance, pois ele obriga o Pandas a executar um loop linha por linha no Python.
Uma alternativa mais eficiente e muito utilizada em ambientes de produção é a vetorização. Usando o acessor .str do Pandas, os comandos rodam em baixo nível (em linguagem C), processando a coluna inteira de uma vez só e deixando o código muito mais rápido.
Para facilitar a leitura, usar os parênteses () permite quebrar os métodos encadeados em várias linhas. Aqui está como ficou a refatoração dos dois desafios:
Projeto Desafio 1 (Vendas Online)
# VERSÃO DA AULA (usando apply):
# dados1['Valor da compra'] = dados1['Valor da compra'].apply(lambda x: x.replace('R$ ', '').replace(',','.').strip())
# VERSÃO OTIMIZADA (usando vetorização com .str):
dados1['Valor da compra'] = (dados1['Valor da compra']
.str.replace('R$ ', '', regex=False)
.str.replace(',', '.', regex=False)
.str.strip())
Projeto Desafio 2 (Administração de Condomínios)
Nessa base é usado a vírgula como separador decimal e possui a palavra " reais" no final.
*
# VERSÃO DA AULA (usando apply):
# dados2['valor_aluguel'] = dados2['valor_aluguel'].apply(lambda x: x.replace('$ ', '').replace(' reais', '').replace(',','.').strip())
# VERSÃO OTIMIZADA (usando vetorização com .str):
dados2['valor_aluguel'] = (dados2['valor_aluguel']
.str.replace('$ ', '', regex=False)
.str.replace(' reais', '', regex=False)
.str.replace(',', '.', regex=False)
.str.strip())
Dica Extra ( com Regex):
Se quisermos deixar o código ainda mais interessante, podemos usar Expressões Regulares (Regex). Em vez de dizer ao Pandas exatamente quais palavras apagar ("R$", "$", "reais", etc.), podemos criar uma regra única que serve para qualquer moeda: "Apague tudo que NÃO for número de 0 a 9 ou vírgula".
# Desafio 1
dados1['Valor da compra'] = (dados1['Valor da compra']
.str.replace(r'[^0-9,]', '', regex=True) # Apaga o "R", o "$", letras e espaços
.str.replace(',', '.', regex=False)) # Troca a vírgula por ponto
# Desafio 2
dados2['valor_aluguel'] = (dados2['valor_aluguel']
.str.replace(r'[^0-9,]', '', regex=True) # Apaga o "$", a palavra "reais" e espaços
.str.replace(',', '.', regex=False)) # Troca a vírgula por ponto
Espero que essa dica sejam útil para quem quer dar os primeiros passos na escrita de códigos otimizados para grandes volumes de dados!
Bons estudos!