Categorização de Extratos Bancários com Python: Pipeline Inteligente para CSV e PDF

Aprenda a criar um pipeline em Python para extrair e categorizar transações bancárias de CSV e PDF usando normalização textual e classificação inteligente.

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:

  1. 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.
  2. 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(caminho
pdf) 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:

  1. Camada Determinística (Hash/Dicionário): Mapeia comerciantes já conhecidos e frequentes (UBER -> Transporte, IFOOD -> Alimentação) com complexidade $O(1)$.
  2. 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) ou RapidFuzz para matching aproximado de strings.
  3. 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):
melhor
categoria = “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_PENDENTE sã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.

Preencha o formulário abaixo para que eu consiga entrar em contato com você.