Data Cleaning

Limpeza e normalização do arquivo bruto

Author

Marlon L.

Published

May 7, 2026

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 12
      8 # Carrega .env e adiciona src ao path
      9 load_dotenv()
     10 sys.path.insert(0, os.getenv('PROJECT_ROOT') + '/src')
     11 
---> 12 from config import PROJECT_ROOT, PATHS
     13 from utils import (
     14     audit_transformation,
     15     audit_pipeline,

ModuleNotFoundError: No module named 'config'

Data Cleaning

Com base nas descobertas documentadas no Data Profiling, esta etapa implementa as transformações de limpeza necessárias para preparar o arquivo bruto para parsing e análise.

Objetivo

Transformar o arquivo bruto exportado do WhatsApp em um arquivo limpo e otimizado, removendo:

  • ✅ Caracteres invisíveis (U+200E)
  • ✅ Timestamps vazios (múltiplas mídias)
  • ✅ Linhas vazias
  • ✅ Espaços em branco excessivos
  • ✅ Nomes de participantes (anonimização)
  • ✅ Delimitadores redundantes de timestamp
  • ✅ Indentação desnecessária em linhas de continuação

Definição das Funções de Transformação


Configuração do Pipeline

📋 Pipeline configurado com 7 etapas:
   1. Remoção U+200E
   2. Anonimização
   3. Remoção timestamps vazios
   4. Remoção linhas vazias
   5. Normalização espaços
   6. Otimização timestamps
   7. Normalização indentação

Execução do Pipeline


Pipeline de Transformação

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[5], line 5
      1 # Renderiza cada etapa como um accordion
      2 for i, step in enumerate(PIPELINE):
      3     step_id = step['id']
      4     step_num = i + 1
----> 5     audit = audits[step_id]
      6     step_metrics = metrics[step_id]
      7 
      8     print(f'''<details style="margin: 0.5em 0; list-style: none; border: 1px solid #d4d4d4; border-radius: 5px; padding: 10px;">

KeyError: 'u200e'

Auditoria Final do Pipeline

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[7], line 1
----> 1 format_audit_table(df_audit, include_chars=True).style.hide(axis='index')

NameError: name 'format_audit_table' is not defined
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[8], line 1
----> 1 format_summary_table(audit_list).style.hide(axis='index')

NameError: name 'format_summary_table' is not defined

Tip🎯 Resultado Final
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[9], line 1
----> 1 print(f"📁 Arquivo original: {totals['original_formatted']}")
      2 print(f"📁 Arquivo final: {totals['final_formatted']}")
      3 print(f"📦 Redução total: {totals['total_bytes']:,} bytes ({totals['total_percent']:.2f}%)")
      4 print(f"📉 Linhas removidas: {totals['total_lines']:,}")

NameError: name 'totals' is not defined

O arquivo limpo está pronto para a próxima etapa: parsing e estruturação em DataFrame.


Note📊 Reflexão: Impacto no Dataset Enriquecido
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[10], line 1
----> 1 impact = generate_impact_analysis(totals, enrichment_factor=8.0)
      2 
      3 print(f"📁 Arquivo bruto:")
      4 print(f"   • Original: {impact['original_mb']:.2f} MB")

NameError: name 'generate_impact_analysis' is not defined

A limpeza realizada nesta etapa não apenas organiza os dados, mas reduz significativamente o custo computacional de todas as operações subsequentes.


Arquivo de Saída

O arquivo final agora possui:

  • ✅ Formato otimizado: DD/MM/YY HH:MM:SS Remetente: Conteúdo
  • ✅ Participantes anonimizados (P1, P2)
  • ✅ Sem caracteres invisíveis
  • ✅ Sem linhas/timestamps vazios
  • ✅ Espaços e indentação normalizados
# Padrão para identificar início de mensagem
message_pattern = r'^(\d{2}/\d{2}/\d{2}) (\d{2}:\d{2}:\d{2}) (.+?): (.*)$'

# Grupos de captura:
# 1: Data (DD/MM/YY)
# 2: Hora (HH:MM:SS)
# 3: Remetente (P1 ou P2)
# 4: Conteúdo da mensagem

Próximos Passos

Com o arquivo limpo, seguimos para:

  1. Data Wrangling — Parsing, agregação de multilinha, vinculação de mídia
  2. Feature Engineering — Criação de variáveis derivadas