Laboratório SQL + Python

Do dado bruto ao insight confiável

Um laboratório interativo de SQL, Python, Pandas, ETL e qualidade de dados que demonstra como bases desorganizadas são transformadas em datasets confiáveis para análise e Business Intelligence.

A base simulada traz duplicidades, ausentes, formatos inconsistentes e datas inválidas. O laboratório usa SQL, Python e Pandas para investigar, limpar e validar esses registros. No fim, exporta um dataset pronto para análise.

Todos os dados utilizados são fictícios e determinísticos. Nenhuma informação fiscal, pessoal ou institucional sensível é utilizada.

As consultas e pipelines apresentados são demonstrações técnicas seguras. Os resultados são calculados sobre um dataset simulado por funções determinísticas equivalentes às operações exibidas em SQL e Pandas.

  • SQL
  • Python
  • Pandas
  • ETL
  • Data Quality
  • CSV
  • Data Modeling
  • Power BI
  • TypeScript
  • Next.js
Registros brutos
86
Problemas detectados
18
Registros tratados
77
Score antes
65,1
Score depois
98,7

A base bruta

Assim os dados chegam: campos como texto, formatos misturados e defeitos reais de extração. As primeiras linhas abaixo já contêm parte dos problemas que a auditoria detecta.

Primeiras linhas da base bruta simulada.
idcompetence_daterevenue_namecategoryestimated_valuecollected_value
R-2025-1101-012025-01-01ISStributaria37803667
R-2025-1101-022025-02-01ISStributaria36363636
R-2025-1101-032025-03-01ISStributaria34923597
R-2025-1101-032025-04-01ISStributaria33483549
R-2025-1101-052025-05-01ISStributaria38163587
R-2025-1101-062025-13-45ISStributaria36723562

Investigação com SQL

Dez consultas pré-configuradas cobrem o ciclo de investigação: tendência, gap, auditorias de duplicidade, ausência e validade, ranking, acumulado, outliers e a base final pronta para BI.

Básicoexecuta sobre a base tratada

Objetivo: Agrupar a receita simulada por competência e identificar tendência.

SELECT
  strftime('%Y-%m', competence_date) AS competence_month,
  SUM(collected_value) AS collected_revenue
FROM revenue_clean
GROUP BY competence_month
ORDER BY competence_month;

Equivalente no pipeline Pandas

df.groupby(df["competence_date"].dt.to_period("M"))["collected_value"].sum()
Resultado de "Receita arrecadada por mês" — 12 linha(s) no total.
competence_monthcollected_revenue
2025-017.211
2025-0212.211
2025-0311.157
2025-047.754,56
2025-0511.495
2025-067.189
2025-0710.569
2025-0850.529

Leitura executiva: A leitura mensal é a base do acompanhamento executivo: quedas consecutivas viram alerta.

As consultas e pipelines apresentados são demonstrações técnicas seguras. Os resultados são calculados sobre um dataset simulado por funções determinísticas equivalentes às operações exibidas em SQL e Pandas.

Pipeline Python + Pandas

Cada etapa abaixo mostra o problema, o código Pandas conceitual e — na execução — quantos registros são afetados de verdade no dataset simulado.

01Leitura e padronização de colunas

Problema: Colunas com espaços, caixa mista e nomes divergentes quebram scripts a jusante.

import pandas as pd

df = pd.read_csv("revenue_raw.csv")

df.columns = (
    df.columns
    .str.strip()
    .str.lower()
    .str.replace(" ", "_")
)

02Conversão de tipos tolerante

Problema: Datas em formatos mistos e números gravados como texto (1.234,56) impedem agregações.

df["competence_date"] = pd.to_datetime(
    df["competence_date"],
    errors="coerce",
    dayfirst=True,
)

df["collected_value"] = pd.to_numeric(
    df["collected_value"]
    .str.replace(".", "", regex=False)
    .str.replace(",", ".", regex=False),
    errors="coerce",
)

03Normalização textual

Problema: " iptu ", "Iss" e "TRIBUTARIA" são a mesma coisa escrita de três jeitos.

df["revenue_name"] = df["revenue_name"].str.strip().str.upper()
df["category"] = (
    df["category"]
    .str.strip()
    .str.lower()
    .str.normalize("NFKD")
)

04Ausentes e duplicidades

Problema: Valores ausentes e linhas repetidas inflam somas e distorcem métricas.

df = df.drop_duplicates()
df = df.drop_duplicates(subset="id", keep="first")

df["category"] = df["category"].fillna(
    df["revenue_code"].map(code_to_category)
)
df = df.dropna(subset=["competence_date", "collected_value"])

05Validação de regras e anomalias

Problema: Valores negativos, códigos órfãos e outliers precisam de decisão explícita, não silêncio.

valid = df["collected_value"] >= 0
known = df["revenue_code"].isin(dim_revenue["code"])

rejected = df[~(valid & known)]
df = df[valid & known]

df["is_outlier"] = (
    df["collected_value"] > df["estimated_value"] * 5
)

06Agregação e exportação para BI

Problema: O destino final é um dataset estável que o Power BI consome sem sustos.

monthly = (
    df.groupby([df["competence_date"].dt.to_period("M"), "revenue_name"])
    .agg(collected=("collected_value", "sum"))
    .reset_index()
)

df.to_csv("revenue_clean.csv", index=False)

Execução do pipeline

Execute o pipeline para auditar a base, aplicar as transformações determinísticas, comparar o antes/depois e liberar a exportação do dataset tratado.

Execute o pipeline para ver o log, as métricas e a comparação antes/depois.

Arquitetura do fluxo

Da extração à decisão: o mesmo dado passa por investigação, tratamento, auditoria e publicação — e termina no dashboard executivo do case Power BI.

  1. CSV bruto
  2. Investigação SQL
  3. Python / Pandas
  4. Qualidade de dados
  5. Dataset confiável
  6. Power BI
  7. Decisão executiva

Continuação: BI e decisão

O dataset tratado neste laboratório segue o mesmo domínio do case Power BI — KPIs fiscais, metas e arrecadação municipal. Veja os dados aplicados no dashboard executivo.

Stack do laboratório

SQLPythonPandasETLPower BINext.jsTypeScriptVercel