Pular para conteúdo

Contratos de Dados

O agrobr garante estabilidade de schema. Seu pipeline não vai quebrar.

Cada contrato é definido em Python (agrobr/contracts/) e exportado como JSON (agrobr/schemas/). Validação é automática: todo fetch() de dataset valida o DataFrame contra o contrato registrado.

Garantias Globais

Garantia Descrição
Nomes estáveis Colunas nunca mudam de nome (só adicionam)
Tipos só alargam int→float ok, float→int nunca
Datas ISO-8601 Sempre YYYY-MM-DD
Unidades explícitas Coluna dedicada
Breaking = Major Quebras só em versão major
Primary keys Cada dataset tem chave primária definida (sem duplicatas)
Min/max constraints Valores numéricos validados contra limites

Datasets

Dataset Descrição Fontes
preco_diario Preços diários spot CEPEA → cache
producao_anual Produção anual consolidada IBGE PAM → CONAB
estimativa_safra Estimativas safra corrente CONAB → IBGE LSPA
balanco Oferta/demanda CONAB
credito_rural Crédito rural por cultura BCB/SICOR → BigQuery
exportacao Exportações agrícolas ComexStat → ABIOVE
fertilizante Entregas de fertilizantes ANDA
custo_producao Custos de produção CONAB
pecuaria_municipal Rebanhos e produção animal IBGE PPM
abate_trimestral Abate de bovinos, suínos e frangos IBGE Abate
censo_agropecuario Censo Agropecuário 1995/2006/2017 (10 temas) IBGE Censo Agro
censo_agropecuario_legado Censo Agropecuário 1995/96 — 6 temas legados (FTP) IBGE FTP
censo_agropecuario_historico Série histórica Censo Agropecuário 1920-2006 (9 temas, até UF) IBGE SIDRA
cadastro_rural Cadastro Ambiental Rural SICAR

Schemas JSON

Cada contrato gera automaticamente um arquivo JSON em agrobr/schemas/:

from agrobr.contracts import get_contract, list_contracts, generate_json_schemas

# Listar contratos registrados
list_contracts()

# Acessar contrato
contract = get_contract("preco_diario")
print(contract.primary_key)   # ['data', 'produto']
print(contract.to_json())     # Schema JSON completo

# Validação (automática em todo fetch, ou manual)
from agrobr.contracts import validate_dataset
validate_dataset(df, "preco_diario")  # raises ContractViolationError

# Gerar todos os JSONs
generate_json_schemas("agrobr/schemas/")

Uso

from agrobr import datasets

# Listar datasets
datasets.list_datasets()
# ['abate_trimestral', 'balanco', 'censo_agropecuario', 'credito_rural',
#  'censo_agropecuario_historico', 'custo_producao', 'estimativa_safra',
#  'exportacao', 'fertilizante', 'pecuaria_municipal', 'preco_diario',
#  'producao_anual', 'cadastro_rural']

# Listar produtos de um dataset
datasets.list_products("preco_diario")
# ['soja', 'milho', 'boi', 'cafe', 'trigo', 'algodao']

# Info de um dataset
datasets.info("preco_diario")
# {'name': 'preco_diario', 'sources': ['cepea', 'cache'], ...}

Fallback Automático

Cada dataset tem múltiplas fontes com prioridade. Se a fonte primária falhar, o agrobr automaticamente tenta a próxima:

preco_diario: CEPEA → cache local
producao_anual: IBGE PAM → CONAB
estimativa_safra: CONAB → IBGE LSPA
balanco: CONAB
credito_rural: BCB/SICOR → BigQuery (basedosdados)
exportacao: ComexStat → ABIOVE
fertilizante: ANDA
custo_producao: CONAB

MetaInfo

Toda chamada com return_meta=True retorna metadados de proveniência:

df, meta = await datasets.preco_diario("soja", return_meta=True)

print(meta.source)            # Fonte usada
print(meta.dataset)           # Nome do dataset
print(meta.contract_version)  # Versão do contrato
print(meta.records_count)     # Registros retornados
print(meta.from_cache)        # Se veio do cache
print(meta.snapshot)          # Data de corte (modo determinístico)