1
resposta

[Sugestão] [DICA] Desafio: trabalhando em outros contextos

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!

1 resposta

Oi, Fábio! Como vai?

Agradeço por compartilhar essa dica com a comunidade Alura.

Achei muito interessante a forma como você trouxe a comparação entre apply e a vetorização com .str, mostrando não só o como fazer, mas também o porquê em termos de performance. Isso demonstra uma visão mais próxima do mercado, principalmente ao considerar grandes volumes de dados e o impacto de loops no Python.

Aproveto para compartilhar também método to_numeric do Pandas, que já ajuda na conversão para número e permite tratar erros de forma elegante:


import pandas as pd

coluna = ['10,50', '20,30', 'erro']

coluna = pd.Series(coluna)

coluna = (coluna
          .str.replace(',', '.', regex=False))

coluna = pd.to_numeric(coluna, errors='coerce')

print(coluna)

Nesse exemplo, o to_numeric converte os valores para numero e transforma valores invalidos em NaN, evitando falhas no processamento.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Para saber mais:

Sugestão de conteúdo:

DOCUMENTAÇÃO
pandas.to_numeric
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!