Categorização de Extratos Bancários com Python: Pipeline Inteligente para CSV e PDF
Consolidar finanças a partir de meses acumulados de extratos bancários e faturas de cartão de crédito é uma tarefa desgastante. Linhas de lançamento frequentemente contêm descrições truncadas e sufixos numéricos confusos, como PG *PAGSEGURO UBER BR 12/24 ou AMZN BR MKTPLACE. Fazer a reconciliação manual consome tempo e introduz erros operacionais.
Construir um pipeline automatizado em Python resolve esse gargalo. Vamos detalhar a arquitetura técnica necessária para processar arquivos CSV e PDF, normalizar descrições de estabelecimentos comerciais (merchants) e aplicar uma estratégia híbrida de classificação.
O Desafio: A Heterogeneidade dos Dados Bancários
Extratos bancários apresentam dois desafios centrais:
- Formatos estruturados e semiestruturados: CSVs variam em formato de data, separadores decimais (vírgula versus ponto) e codificação de caracteres (UTF-8, Latin-1). PDFs, por sua vez, demandam extração espacial de tabelas, já que não contêm uma estrutura de dados relacional nativa.
- Identificação de estabelecimentos (Merchant Normalization): O mesmo estabelecimento pode aparecer com dezenas de variações léxicas devido a gateways de pagamento, códigos de filiais e carimbos de transação.
Passo 1: Ingestão e Extração Resiliente
Para arquivos CSV, utilizamos o pandas com inferência de delimitadores. Para PDFs, bibliotecas como pdfplumber ou pymupdf (fitz) oferecem a precisão necessária para extrair linhas tabulares sem quebrar referências entre valores e datas.
python
import pdfplumber
import pandas as pd
import re
def extrairlinhaspdf(caminhopdf):
registros = []
with pdfplumber.open(caminhopdf) as pdf:
for pagina in pdf.pages:
tabela = pagina.extract_table()
if tabela:
for linha in tabela[1:]:
# Validação de linhas com data, descrição e valor
if len(linha) >= 3 and linha[0]:
registros.append(linha[:3])
return pd.DataFrame(registros, columns=[“data”, “descricao”, “valor”])
Passo 2: Limpeza e Normalização de Merchants
Antes de tentar categorizar, precisamos higienizar o texto removendo ruídos frequentes de gateways de pagamento (como IOF*, PAG*, números de autorização e códigos de cidade):
python
def limpar_descricao(texto):
if not isinstance(texto, str):
return “”
texto = texto.upper()
# Remove termos comuns de adquirência e prefixos bancários
texto = re.sub(r’b(PG|PAG|PAGSEGURO|MERCADOPAGO|MP|PAYPAL|IOF|PARC)b[*s]?’, ”, texto)
# Remove caracteres especiais e números isolados
texto = re.sub(r'[^A-Zs]’, ‘ ‘, texto)
texto = re.sub(r’s+’, ‘ ‘, texto).strip()
return texto
Passo 3: Classificação Híbrida (Regras + Similaridade Semântica)
Como especialista em IA e engenharia de dados, recomendo evitar o uso indiscriminado de LLMs caros para cada linha de extrato. A abordagem mais eficiente em custo e latência é em camadas:
- Camada Determinística (Hash/Dicionário): Mapeia comerciantes já conhecidos e frequentes (
UBER-> Transporte,IFOOD-> Alimentação) com complexidade $O(1)$. - Camada de Similaridade (Embeddings/TF-IDF): Para lançamentos inéditos, comparamos a descrição limpa contra uma base vetorial de categorias usando modelos leves de embedding (
sentence-transformers/all-MiniLM-L6-v2) ouRapidFuzzpara matching aproximado de strings. - Fallback Inteligente (LLM via API): Apenas os itens que não atingirem um score mínimo de confiança (ex: 85%) são enviados para um modelo de linguagem classificar a partir de um prompt estruturado.
python
from rapidfuzz import process, fuzz
CATEGORIAS_BASE = {
“ALIMENTACAO”: [“IFOOD”, “RESTAURANTE”, “MERCADO”, “CARREFOUR”, “PADARIA”],
“TRANSPORTE”: [“UBER”, “99APP”, “POSTO”, “IPIRANGA”, “SHELL”],
“SERVICOS”: [“AWS”, “GOOGLE CLOUD”, “NETFLIX”, “SPOTIFY”]
}
def classificarporsimilaridade(termolimpo, limiar=75):
melhorcategoria = “OUTROS”
maior_score = 0
for categoria, palavras_chave in CATEGORIAS_BASE.items():
resultado = process.extractOne(termo_limpo, palavras_chave, scorer=fuzz.partial_ratio)
if resultado and resultado[1] > maior_score:
maior_score = resultado[1]
melhor_categoria = categoria
return melhor_categoria if maior_score >= limiar else "REVISAO_PENDENTE"
Fluxo de Operação e Governança
Para garantir a confiabilidade contínua do sistema, adote o ciclo de aprendizado:
- Ingestão: Leitura concorrente de múltiplos arquivos CSV/PDF.
- Processamento: Extração tabular, normalização regex e roteamento por score de confiança.
- Revisão Humana (Human-in-the-loop): Transações marcadas como
REVISAO_PENDENTEsão exportadas para uma interface simples de conferência. - Retroalimentação: Toda correção feita manualmente é salva no dicionário determinístico, reduzindo as pendências futuras a zero.
Automatize sua Inteligência Financeira
Construir pipelines robustos de extração e reconciliação de dados bancários exige rigor com tipagem, segurança de dados e modelos preditivos eficientes.
Se a sua empresa precisa de uma solução personalizada para automatizar o processamento de extratos fiscais, faturas e relatórios financeiros complexos com Python e Inteligência Artificial, entre em contato para estruturarmos uma consultoria técnica sob medida.


