Validação e Qualidade de Dados
Verificações de esquema e estatísticas nas fronteiras do pipeline capturam ingestões ruins antes que poluam os marts - Pandera para DataFrames Python, Great Expectations para contratos de dados documentados.
Busque em todas as páginas da documentação
Verificações de esquema e estatísticas nas fronteiras do pipeline capturam ingestões ruins antes que poluam os marts - Pandera para DataFrames Python, Great Expectations para contratos de dados documentados.
Cartão de receita de referência rápida - pronto para copiar e colar.
import pandera.pandas as pa
schema = pa.DataFrameSchema({
"order_id": pa.Column(int, unique=True, nullable=False),
"revenue": pa.Column(float, pa.Check.ge(0)),
"region": pa.Column(str, pa.Check.isin(["East", "West", "Central"])),
})
def validate_orders(df):
return schema.validate(df, lazy=True)Quando usar isso:
import pandas as pd
import pandera.pandas as pa
from pandera import Check, Column, DataFrameSchema
orders_schema = DataFrameSchema(
{
"order_id": Column(int, unique=True, nullable=False),
"revenue": Column(float, checks=Check.ge(0)),
"region": Column(str, checks=Check.isin(["East", "West", "Central"])),
"ordered_at": Column("datetime64[ns, UTC]", nullable=False),
},
strict=False,
coerce=True,
)
def load_orders(path: str) -> pd.DataFrame:
df = pd.read_parquet(path)
try:
return orders_schema.validate(df, lazy=True)
except pa.errors.SchemaErrors as err:
# Quarentena de linhas ruins para inspeção
failure_cases = err.failure_cases
failure_cases.to_csv("quarantine/schema_failures.csv", index=False)
raise
# Verificação estilo Great Expectations (API GE conceitual)
def gx_style_checks(df: pd.DataFrame) -> None:
assert len(df) > 0, "lote vazio"
assert df["order_id"].is_unique.all()
assert df["revenue"].between(0, 1_000_000).mean() > 0.99O que isso demonstra:
| Tipo | Exemplo |
|---|---|
| Estrutural | coluna existe, dtype, único |
| Intervalo | receita >= 0 |
| Associação a conjunto | região em lista permitida |
| Estatístico | contagem de linhas dentro de 3 sigmas da mediana de 7 dias |
# Polars com pandera.polars
import polars as pl
import pandera.polars as pa
schema = pa.DataFrameSchema({"id": pa.Column(int)})
schema.validate(pl.DataFrame({"id": [1, 2]}))@task antes da escrita.lazy=False em esquemas amplos - para no primeiro erro. Correção: lazy=True para relatório completo de falhas.git tag junto com o código do pipeline.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Testes dbt | Transformações nativas do warehouse | Limpeza com pandas pré-carga |
| Soda Core | Verificações YAML entre warehouses | Já padronizado em GE |
| Modelos Pydantic | Eventos de API JSON antes do DataFrame | Cargas em massa de arquivos colunares |
assert manual | Scripts minúsculos | Qualquer pipeline de produção compartilhado |
import pytest
import pandera.errors
def test_rejects_negative_revenue(bad_df):
with pytest.raises(pandera.errors.SchemaError):
orders_schema.validate(bad_df)Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026