Dados agrícolas brasileiros em uma linha de código
Infraestrutura Python para dados agrícolas brasileiros com camada semântica sobre 27 fontes públicas: CEPEA, CONAB, IBGE, NASA POWER, BCB/SICOR, ComexStat, ANDA, ABIOVE, USDA PSD, IMEA, DERAL, INMET, Notícias Agrícolas, Queimadas/INPE, Desmatamento PRODES/DETER, MapBiomas, CONAB Progresso, B3 Futuros Agro, CONAB CEASA/PROHORT, UN Comtrade, ANTAQ, ANP Diesel, MAPA PSR, ANTT Pedágio, SICAR, ZARC e Agrofit/MAPA (Defensivos).
v1.0.0 — 5100+ testes, 88% cobertura, 27/27 fontes com golden tests (21 com dados reais), retry centralizado em 27/27 clients.
pip install agrobrCom extras opcionais:
pip install agrobr[pdf] # pdfplumber para ANDA (fertilizantes)
pip install agrobr[polars] # Suporte a Polars
pip install agrobr[browser] # Playwright (opcional, para fontes com JS)
pip install agrobr[bigquery] # Base dos Dados (fallback BCB/SICOR)
pip install agrobr[geo] # GeoPandas (geometria PRODES + DETER + SICAR)
pip install agrobr[all] # Tudo incluídoimport asyncio
from agrobr import cepea
async def main():
# Série histórica de soja
df = await cepea.indicador('soja', inicio='2024-01-01')
print(df.head())
# Último valor disponível
ultimo = await cepea.ultimo('soja')
print(f"Soja: R$ {ultimo.valor}/sc em {ultimo.data}")
# Produtos disponíveis
print(await cepea.produtos()) # ['soja', 'milho', 'boi_gordo', 'cafe', ...]
asyncio.run(main())from agrobr import conab
async def main():
# Dados de safra por UF
df = await conab.safras('soja', safra='2024/25')
print(df[['uf', 'area_plantada', 'producao', 'produtividade']])
# Balanço oferta/demanda
balanco = await conab.balanco('soja')
print(balanco)
# Total Brasil
brasil = await conab.brasil_total()
print(brasil)from agrobr import ibge
async def main():
# PAM - Produção Agrícola Municipal (anual)
df = await ibge.pam('soja', ano=2023, nivel='uf')
print(df[['localidade', 'area_plantada', 'producao']])
# LSPA - Levantamento Sistemático (mensal)
df = await ibge.lspa('soja', ano=2024, mes=6)
print(df)
# PPM - Pesquisa da Pecuária Municipal (anual)
df = await ibge.ppm('bovino', ano=2023, nivel='uf')
print(df[['localidade', 'especie', 'valor', 'unidade']])
# Produção de origem animal
df = await ibge.ppm('leite', ano=2023)
# Abate Trimestral — bovino, suíno, frango
df = await ibge.abate('bovino', trimestre='202303')
df = await ibge.abate('frango', trimestre='202303', uf='PR')
# PAM por município (filtrando UF para reduzir volume)
df = await ibge.pam('cafe', ano=2023, nivel='municipio', uf='PA')
# Censo Agropecuário 1995/2006/2017 — 10 temas
df = await ibge.censo_agro('efetivo_rebanho')
df = await ibge.censo_agro('uso_terra', uf='MT')
df = await ibge.censo_agro('lavoura_temporaria', nivel='municipio', uf='PR')
# Manejo de solo e irrigação (2006 + 2017)
df = await ibge.censo_agro('preparo_solo', ano=2017, uf='SP')
df = await ibge.censo_agro('irrigacao') # ambos os anos
df = await ibge.censo_agro('adubacao', ano=2006)
# Censo Agropecuário 1995/96 — temas legados (FTP)
df = await ibge.censo_agro_legado('tecnologia')
df = await ibge.censo_agro_legado('pessoal_ocupado', uf='SP')
# Censo Agropecuário — série histórica 1920-2006 (9 temas, até UF)
df = await ibge.censo_agro_historico('estabelecimentos_area')
df = await ibge.censo_agro_historico('efetivo_animais', uf='SP')
df = await ibge.censo_agro_historico('uso_terra', nivel='brasil')
# Censo Agropecuário 1985 — dados municipais (53 temas, 22 UFs, OCR de PDFs)
df = await ibge.censo_agro_municipal_1985('propriedade_terras', uf='SP')
df = await ibge.censo_agro_municipal_1985('bovinos', nivel='municipio')
# Múltiplos anos
df = await ibge.pam('milho', ano=[2020, 2021, 2022, 2023])
# PEVS — Silvicultura (eucalipto, pinus, carvão)
df = await ibge.silvicultura('madeira_tora', ano=2023)
df = await ibge.silvicultura('eucalipto', variavel='area') # área plantada
# PEVS — Extração vegetal (açaí, castanha, erva-mate)
df = await ibge.extracao_vegetal('acai', ano=2023, nivel='uf')
# Leite trimestral (aquisição + industrialização + preço)
df = await ibge.leite_trimestral(trimestre='202303', uf='MG')
# PIB Agropecuário trimestral
df = await ibge.pib_agro(trimestre='202501', setor='agropecuaria')Peça o que quer, fonte é detalhe interno:
from agrobr import datasets
async def main():
# Preço diário (CEPEA com fallback automático)
df = await datasets.preco_diario("soja")
# Produção anual (IBGE PAM → CONAB)
df = await datasets.producao_anual("soja", ano=2023)
# Estimativa de safra corrente (CONAB → IBGE LSPA)
df = await datasets.estimativa_safra("soja", safra="2024/25")
# Balanço oferta/demanda (CONAB)
df = await datasets.balanco("soja")
# Crédito rural (BCB/SICOR com fallback BigQuery)
df = await datasets.credito_rural("soja", safra="2024/25")
# Exportações (ComexStat → ABIOVE)
df = await datasets.exportacao("soja", ano=2024)
# Fertilizantes (ANDA)
df = await datasets.fertilizante(ano=2024, uf="MT")
# Custos de produção (CONAB)
df = await datasets.custo_producao("soja", uf="MT", safra="2024/25")
# Com metadados de proveniência
df, meta = await datasets.preco_diario("soja", return_meta=True)
print(meta.source, meta.contract_version)
# Pecuária municipal (IBGE PPM)
df = await datasets.pecuaria_municipal("bovino", ano=2023)
# Censo Agropecuário 1995/2006/2017 (IBGE Censo Agro — 10 temas)
df = await datasets.censo_agropecuario("efetivo_rebanho")
df = await datasets.censo_agropecuario("preparo_solo")
# Cadastro Ambiental Rural (SICAR)
df = await datasets.cadastro_rural("DF")
df = await datasets.cadastro_rural("MT", municipio="Sorriso", status="AT")
# SICAR com geometria (requer pip install agrobr[geo])
gdf = await agrobr.alt.sicar.imoveis_geo("DF")
# Silvicultura (IBGE PEVS)
df = await datasets.silvicultura("madeira_tora", ano=2023)
# Extrativismo vegetal (IBGE PEVS)
df = await datasets.extrativismo_vegetal("acai", ano=2023)
# Leite industrial (IBGE Leite Trimestral)
df = await datasets.leite_industrial(trimestre="202303")
# Série histórica de safras (CONAB — 32 culturas)
df = await datasets.serie_historica_safra("soja", inicio=2020, fim=2024)
# Preços de atacado (CONAB CEASA/PROHORT)
df = await datasets.preco_atacado("TOMATE")
# Seguro rural (MAPA PSR — apólices e sinistros)
df = await datasets.seguro_rural(tipo="apolices", uf="MT", ano=2023)
df = await datasets.seguro_rural(tipo="sinistros", evento="SECA")
# Clima (INMET → NASA POWER)
df = await datasets.clima(uf="SP", ano=2024)
df = await datasets.clima(estacao="A301", inicio="2024-01-01", fim="2024-12-31")
# Futuros agrícolas B3 (ajustes, histórico, posições)
df = await datasets.futuros_agricolas("boi", data="2025-03-05")
df = await datasets.futuros_agricolas("boi", tipo="historico", inicio="2025-01-01", fim="2025-03-05")
df = await datasets.futuros_agricolas("boi", tipo="posicoes", data="2025-03-05")
# Listar datasets disponíveis
print(datasets.list_datasets())
# ['abate_trimestral', 'balanco', 'cadastro_rural', 'censo_agropecuario',
# 'censo_agropecuario_historico', 'censo_agropecuario_legado',
# 'censo_agropecuario_municipal_1985', 'clima', 'comercio_internacional',
# 'condicao_lavouras', 'credito_rural', 'custo_producao', 'desmatamento',
# 'estimativa_safra', 'exportacao', 'extrativismo_vegetal', 'fertilizante',
# 'futuros_agricolas', 'importacao', 'leite_industrial',
# 'movimentacao_portuaria', 'oferta_demanda_global', 'pecuaria_municipal',
# 'pib_agro', 'preco_atacado', 'preco_diario', 'producao_anual',
# 'progresso_safra', 'queimadas', 'seguro_rural', 'serie_historica_safra',
# 'silvicultura', 'uso_do_solo', 'zoneamento_agricola']Snapshots capturam dados locais em parquet para reprodutibilidade total — ideal para papers, auditorias e pipelines CI.
from agrobr import datasets
from agrobr.snapshots import create_snapshot, list_snapshots, delete_snapshot
# Criar snapshot (salva dados atuais em ~/.agrobr/snapshots/)
info = await create_snapshot("2025-Q4") # nome customizado
info = await create_snapshot(sources=["cepea", "conab"]) # fontes específicas
# Listar e remover
for s in list_snapshots():
print(s.name, s.file_count, f"{s.size_bytes/1024/1024:.1f} MB")
delete_snapshot("2025-Q4")
# Modo determinístico — consultas usam apenas cache local, sem rede
async with datasets.deterministic("2025-12-31"):
df = await datasets.preco_diario("soja")Via CLI:
agrobr snapshot create 2025-Q4 --sources cepea,conab,ibge
agrobr snapshot list
agrobr snapshot list --json
agrobr snapshot use 2025-Q4 # ativa modo determinístico
agrobr snapshot delete 2025-Q4from agrobr import nasa_power, bcb, comexstat, anda
async def main():
# NASA POWER — climatologia por ponto ou UF (v0.7.1)
df = await nasa_power.clima_ponto(-12.6, -56.1, "2024-01-01", "2024-12-31")
df = await nasa_power.clima_uf("MT", ano=2024)
# BCB/SICOR — crédito rural
df = await bcb.credito_rural(produto="soja", safra="2024/25")
# BCB/SICOR — filtrar por programa
df = await bcb.credito_rural(produto="soja", safra="2024/25", programa="Pronamp")
# BCB/SICOR — agregar por programa
df = await bcb.credito_rural(produto="soja", safra="2024/25", agregacao="programa")
# ComexStat — exportações e importações mensais
df = await comexstat.exportacao("soja", ano=2024, agregacao="mensal")
df = await comexstat.importacao("soja", ano=2024, agregacao="mensal")
# ANDA — entregas de fertilizantes (requer pip install agrobr[pdf])
df = await anda.entregas(ano=2024, uf="MT")
# CONAB — custos de produção
from agrobr import conab
df = await conab.custo_producao(cultura="soja", uf="MT", safra="2024/25")from agrobr import abiove, usda, imea, deral, conab
async def main():
# ABIOVE — exportação do complexo soja
df = await abiove.exportacao(ano=2024, produto="grao")
# USDA PSD — estimativas internacionais (requer API key gratuita)
df = await usda.psd("soja", country="BR", market_year=2024)
# IMEA — cotações e indicadores Mato Grosso
df = await imea.cotacoes("soja", safra="24/25")
# DERAL — condição das lavouras Paraná
df = await deral.condicao_lavouras("soja")
# CONAB — série histórica de safras (2010+)
df = await conab.serie_historica("soja", inicio=2020, fim=2025, uf="MT")A API de dados observacionais do INMET requer token. Configure via variável de ambiente:
export AGROBR_INMET_TOKEN="seu-token-aqui"Sem o token, requisições de dados levantam SourceUnavailableError (HTTP 403). A listagem de estações funciona sem token. Para dados climáticos sem token, use NASA POWER como alternativa.
from agrobr import queimadas
async def main():
# Focos de calor em setembro/2024
df = await queimadas.focos(ano=2024, mes=9)
# Filtrar por UF e bioma
df = await queimadas.focos(ano=2024, mes=9, uf="MT", bioma="Amazonia")
# Dia especifico
df = await queimadas.focos(ano=2024, mes=9, dia=15)
# Com metadados
df, meta = await queimadas.focos(ano=2024, mes=9, return_meta=True)from agrobr import desmatamento
async def main():
# PRODES — desmatamento anual consolidado (Cerrado)
df = await desmatamento.prodes(bioma="Cerrado", ano=2022, uf="MT")
# PRODES com geometria (requer pip install agrobr[geo])
gdf = await desmatamento.prodes_geo(bioma="Cerrado", ano=2022, uf="MT")
# DETER — alertas em tempo real (Amazônia)
df = await desmatamento.deter(
bioma="Amazônia", uf="PA",
data_inicio="2024-01-01", data_fim="2024-06-30",
)
# Filtrar por classe de alerta
df = await desmatamento.deter(bioma="Amazônia", classe="DESMATAMENTO_CR")
# DETER com geometria (requer pip install agrobr[geo])
gdf = await desmatamento.deter_geo(
bioma="Amazônia", uf="PA",
data_inicio="2024-01-01", data_fim="2024-06-30",
)
# Com metadados
df, meta = await desmatamento.prodes(bioma="Cerrado", ano=2022, return_meta=True)from agrobr import b3
from datetime import date
async def main():
# Ajustes diarios de futuros agricolas
df = await b3.ajustes(data="13/02/2025")
# Filtrar por contrato
df = await b3.ajustes(data="13/02/2025", contrato="boi")
# Serie historica de ajustes
df = await b3.historico(contrato="boi", inicio=date(2025, 2, 10), fim=date(2025, 2, 14))
# Posicoes em aberto (open interest)
df = await b3.posicoes_abertas(data=date(2025, 12, 19))
# Filtrar OI por contrato e tipo (futuro/opcao)
df = await b3.posicoes_abertas(data=date(2025, 12, 19), contrato="boi", tipo="futuro")
# Serie historica de OI
df = await b3.oi_historico(contrato="boi", inicio=date(2025, 12, 15), fim=date(2025, 12, 19))
# Listar contratos disponiveis
print(b3.contratos()) # ['boi', 'cafe_arabica', 'cafe_conillon', 'etanol', 'milho', 'soja_cross', 'soja_fob']
# Com metadados
df, meta = await b3.ajustes(data="13/02/2025", return_meta=True)from agrobr import conab
async def main():
# Progresso semanal de plantio/colheita
df = await conab.progresso_safra()
# Filtrar por cultura, estado e operação
df = await conab.progresso_safra(cultura="Soja", estado="MT", operacao="Colheita")
# Semana específica
df = await conab.progresso_safra(semana_url="https://www.gov.br/conab/.../acompanhamento-...")
# Listar semanas disponíveis
semanas = await conab.semanas_disponiveis()from agrobr import conab
async def main():
# Precos diarios de 48 produtos em 43 CEASAs
df = await conab.ceasa_precos()
# Filtrar por produto e/ou CEASA
df = await conab.ceasa_precos(produto="tomate", ceasa="SAO PAULO")
# Dimensoes
produtos = conab.ceasa_produtos() # 48 produtos
ceasas = conab.lista_ceasas() # 43 CEASAs com UF
cats = conab.ceasa_categorias() # FRUTAS/HORTALICASfrom agrobr.sync import cepea, conab, ibge, datasets, nasa_power, bcb, comexstat
from agrobr.sync import abiove, usda, imea, deral, queimadas, desmatamento, b3
from agrobr.sync import mapbiomas
from agrobr.sync import alt
# Mesmo API, sem async/await
df = cepea.indicador('soja', inicio='2024-01-01')
safras = conab.safras('milho')
pam = ibge.pam('soja', ano=2023)
df = datasets.preco_diario('soja')
clima = nasa_power.clima_uf('MT', ano=2024)
credito = bcb.credito_rural(produto='soja', safra='2024/25')
exportacao = comexstat.exportacao('soja', ano=2024)
# v0.8.0
df = abiove.exportacao(ano=2024)
df = usda.psd('soja', market_year=2024)
df = imea.cotacoes('soja')
df = deral.condicao_lavouras('soja')
df = conab.serie_historica('soja', inicio=2020)
# v0.10.0
df = queimadas.focos(ano=2024, mes=9)
df = desmatamento.prodes(bioma="Cerrado", ano=2022)
gdf = desmatamento.prodes_geo(bioma="Cerrado", ano=2022, uf="MT")
gdf = desmatamento.deter_geo(bioma="Amazônia", uf="PA", data_inicio="2024-01-01")
df = b3.ajustes(data="13/02/2025")
df = b3.posicoes_abertas(data="2025-12-19", contrato="boi")
df = mapbiomas.cobertura(uf="MT", ano=2022)
df = mapbiomas.cobertura(nivel="municipio", estado="PA", municipio="Belém", ano=2020)
# IBGE PEVS, Leite, PIB
df = ibge.silvicultura('madeira_tora', ano=2023)
df = ibge.extracao_vegetal('acai', ano=2023)
df = ibge.leite_trimestral(trimestre='202303')
df = ibge.pib_agro(trimestre='202501')
# SICAR — Cadastro Ambiental Rural
df = alt.sicar.imoveis("DF")
df = alt.sicar.resumo("MT", municipio="Sorriso")# Retorna polars.DataFrame em vez de pandas — suportado em todas as source APIs
df = await cepea.indicador('soja', as_polars=True)
df = await conab.safras('milho', as_polars=True)
df = await ibge.pam('soja', ano=2023, as_polars=True)
df = await b3.ajustes(data="13/02/2025", as_polars=True)
df = await bcb.credito_rural('soja', safra='2023/24', as_polars=True)
df = await inmet.estacao('A001', '2024-01-01', '2024-01-31', as_polars=True)# CEPEA
agrobr cepea indicador soja --ultimo
agrobr cepea indicador milho --inicio 2024-01-01 --formato csv
# CONAB
agrobr conab safras soja --safra 2024/25
agrobr conab balanco milho
# IBGE
agrobr ibge pam soja --ano 2023 --nivel uf
agrobr ibge lspa milho --ano 2024 --mes 6
# Health check & diagnóstico
agrobr health
agrobr health --source cepea --deep
agrobr doctor --verbose
agrobr config show| Fonte | Status |
|---|---|
| CEPEA | |
| Testes | |
| Integração |
O agrobr monitora automaticamente a disponibilidade das fontes.
Use agrobr health --all para verificar localmente.
| Dataset | Descrição | Fontes |
|---|---|---|
abate_trimestral |
Abate de bovinos, suínos e frangos por UF | IBGE Abate |
balanco |
Oferta/demanda | CONAB |
cadastro_rural |
Cadastro Ambiental Rural (imóveis rurais por UF) | SICAR/GeoServer WFS |
censo_agropecuario |
Censo Agropecuário 1995/2006/2017 (10 temas) | IBGE Censo Agro |
censo_agropecuario_historico |
Série histórica Censo Agropecuário 1920-2006 (9 temas) | IBGE SIDRA |
censo_agropecuario_legado |
Censo 1995/96 — 6 temas legados (FTP) | IBGE FTP |
censo_agropecuario_municipal_1985 |
Censo 1985 municipal — 53 temas via OCR (22 UFs) | IBGE PDFs |
clima |
Dados climáticos mensais/diários por UF ou estação | INMET → NASA POWER |
comercio_internacional |
Comércio internacional bilateral por HS code | UN Comtrade |
condicao_lavouras |
Condição semanal das lavouras do Paraná | DERAL |
credito_rural |
Crédito rural por cultura (programa, seguro, modalidade) | BCB/SICOR → BigQuery |
custo_producao |
Custos de produção | CONAB |
desmatamento |
Desmatamento PRODES/DETER — consolidado + alertas | INPE TerraBrasilis |
estimativa_safra |
Estimativas safra corrente | CONAB → IBGE LSPA |
exportacao |
Exportações agrícolas | ComexStat → ABIOVE |
extrativismo_vegetal |
Produção extrativista vegetal (açaí, castanha, erva-mate) | IBGE PEVS |
fertilizante |
Entregas de fertilizantes | ANDA |
futuros_agricolas |
Futuros agrícolas B3 (ajustes, histórico, posições) | B3 |
importacao |
Importações agrícolas | ComexStat |
leite_industrial |
Aquisição e industrialização trimestral de leite por UF | IBGE Leite |
movimentacao_portuaria |
Movimentação portuária de carga (granel, geral, contêiner) | ANTAQ |
oferta_demanda_global |
Oferta/demanda global de commodities (USDA PSD) | USDA |
pecuaria_municipal |
Pecuária municipal (rebanhos e produção animal) | IBGE PPM |
pib_agro |
PIB agropecuário por setor e trimestre | IBGE SIDRA |
preco_atacado |
Preços de atacado hortifrúti em CEASAs | CONAB CEASA/PROHORT |
preco_diario |
Preços diários spot | CEPEA → cache |
producao_anual |
Produção anual consolidada | IBGE PAM → CONAB |
progresso_safra |
Progresso semanal semeadura/colheita | CONAB |
queimadas |
Focos de calor por satélite (6 biomas) | INPE |
seguro_rural |
Apólices e sinistros do seguro rural | MAPA PSR |
serie_historica_safra |
Série histórica de safras — 32 culturas desde 1976 | CONAB |
silvicultura |
Produção silvicultural (eucalipto, pinus, carvão vegetal) | IBGE PEVS |
uso_do_solo |
Cobertura e uso da terra anual por UF/município | MapBiomas |
zoneamento_agricola |
Zoneamento agrícola de risco climático (ZARC) | MAPA/Embrapa |
| Fonte | Dados | Golden Test | Status |
|---|---|---|---|
| CEPEA | Indicadores de preços (20 produtos) | ✅ | Funcional |
| CONAB | Safras, balanço, custos, série histórica | ✅ | Funcional |
| IBGE | PAM, LSPA, PPM, Abate, PEVS, Leite, PIB, Censo Agro | ✅ | Funcional |
| NASA POWER | Climatologia diária/mensal (grid 0.5°) | ✅ | Funcional |
| BCB/SICOR | Crédito rural por cultura + dimensões SICOR (+ fallback BigQuery) | ✅¹ | Funcional |
| ComexStat | Exportações e importações por NCM/UF | ✅¹ | Funcional |
| ANDA | Entregas de fertilizantes | ✅ | Funcional |
| ABIOVE | Exportação complexo soja (volume/receita) | ✅ | Funcional |
| USDA PSD | Estimativas internacionais (produção/oferta/demanda) | ✅¹ | Funcional |
| IMEA | Cotações e indicadores Mato Grosso | ✅ | Funcional |
| DERAL | Condição das lavouras Paraná | ✅ | Funcional |
| INMET | Meteorologia (600+ estações) | ✅¹ | Requer token (AGROBR_INMET_TOKEN) |
| Notícias Agrícolas | Cotações (fallback CEPEA) | ✅¹ | Funcional |
| Queimadas/INPE | Focos de calor por satelite (6 biomas, 13 satelites) | ✅ | Funcional |
| Desmatamento PRODES/DETER | Desmatamento consolidado + alertas (TerraBrasilis WFS) | ✅ | Funcional |
| MapBiomas | Cobertura e uso da terra (1985-presente), nivel estado e municipio | ✅ | Funcional |
| CONAB Progresso | Progresso semanal de plantio/colheita por cultura e UF | ✅ | Funcional |
| B3 Futuros Agro | Ajustes diarios + posicoes em aberto (7 contratos agro) | ✅ | Funcional |
| CONAB CEASA/PROHORT | Precos atacado hortifruti (48 produtos, 43 CEASAs) | ✅ | Funcional |
| UN Comtrade | Comercio bilateral + trade mirror (~200 paises, HS codes) | ✅¹ | Funcional |
| ANTAQ | Movimentacao portuaria de carga (granel, geral, conteiner) | ✅ | Funcional |
| ANP Diesel | Precos revenda + volumes diesel por UF/municipio | ✅ | Funcional |
| MAPA PSR | Apolices e sinistros seguro rural (2006+, 27 UFs) | ✅ | Funcional |
| ANTT Pedagio | Fluxo de veiculos em pracas de pedagio (2010+, 200+ pracas) | ✅ | Funcional |
| SICAR | Cadastro Ambiental Rural — imoveis rurais por UF (7.4M+ registros, WFS) | ✅ | Funcional |
| ZARC | Zoneamento Agricola de Risco Climatico (janelas de plantio por municipio/cultura/solo) | ✅ | Funcional |
| Agrofit/MAPA (Defensivos) | Agrotoxicos registrados — formulados, autorizacoes, tecnicos (~8K produtos) | ✅ | Funcional |
¹ Golden test com dados sintéticos —
needs_real_datapara validação com API real.
Cada dataset tem um contrato formal com validação automática. Schemas JSON gerados em agrobr/schemas/:
from agrobr.contracts import get_contract, list_contracts, validate_dataset
# Listar contratos registrados
list_contracts()
# ['abate_trimestral', 'ajuste_diario', 'balanco', 'censo_agropecuario',
# 'comercio_bilateral', 'conab_progresso', 'credito_rural', 'custo_producao',
# 'desmatamento_deter', 'desmatamento_prodes', 'estimativa_safra', 'exportacao',
# 'extrativismo_vegetal', 'fertilizante', 'focos_queimadas', 'leite_industrial',
# 'mapbiomas_cobertura', 'mapbiomas_transicao',
# 'anp_diesel_precos', 'anp_diesel_vendas', 'antt_pedagio_fluxo',
# 'antt_pedagio_pracas', 'mapa_psr_sinistros',
# 'censo_agropecuario_historico', 'censo_agropecuario_municipal_1985',
# 'mapa_psr_apolices', 'movimentacao_portuaria',
# 'pecuaria_municipal', 'posicoes_abertas', 'preco_atacado', 'preco_diario',
# 'producao_anual', 'sicar_imoveis', 'silvicultura', 'trade_mirror']
# Inspecionar contrato
contract = get_contract("preco_diario")
print(contract.primary_key) # ['data', 'produto']
print(contract.to_json()) # Schema JSON completo
# Validação explícita (automática em todo fetch)
validate_dataset(df, "preco_diario") # raises ContractViolationErrorGarantias globais: nomes estáveis (só adicionam), tipos só alargam (int→float ok, float→int nunca), datas ISO-8601, breaking changes só em major version. Veja docs/contracts/ para detalhes por dataset.
Funções para padronizar dados entre fontes:
from agrobr.normalize import (
normalizar_cultura, municipio_para_ibge, normalizar_uf, normalizar_safra,
)
normalizar_cultura("Soja em Grão") # "soja"
normalizar_cultura("milho 2ª safra") # "milho_2"
normalizar_cultura("coffee") # "cafe"
municipio_para_ibge("Sorriso", "MT") # 5107925
municipio_para_ibge("SAO PAULO", "SP") # 3550308
normalizar_uf("São Paulo") # "SP"
normalizar_safra("24/25") # "2024/25"5571 municípios IBGE, 35 culturas canônicas, 27 UFs. Dados de municípios via API IBGE Localidades (livre para uso).
- 26/26 fontes com golden tests — validação automatizada contra dados de referência
- Resiliência HTTP completa — retry centralizado em 26/26 clients, 429 handling, Retry-After
- 5100+ testes, 88% cobertura — benchmarks de escalabilidade (memory, volume, cache, async)
- Thread-safe cache — DuckDB store com locking para uso em MCP servers e multi-thread
- Camada semântica — datasets padronizados com fallback automático
- Contratos formais — schema versionado com validação automática, primary keys e constraints
- Schemas JSON — contratos exportados como JSON em
agrobr/schemas/ - Normalização transversal — municípios IBGE, culturas, UFs, safras padronizados
- Modo determinístico — reprodutibilidade total para papers/auditorias
- Async-first para pipelines de alta performance
- Cache inteligente com DuckDB (analytics nativo + histórico permanente)
- Suporte pandas + polars
- Validação — Pydantic v2 + sanity checks estatísticos + fingerprinting de layout
- Alertas multi-canal (Slack, Discord, Email)
- CLI completo para debug e automação
O agrobr mantém um cache local em DuckDB que acumula dados ao longo do tempo:
Dia 1: Coleta 10 dias de dados → salva no DuckDB
Dia 30: 30 dias de histórico acumulado
Dia 365: 1 ano completo de dados locais
Consultas a períodos antigos são instantâneas (cache). Apenas dados recentes precisam de request HTTP.
Integre com Airflow, Prefect ou Dagster usando a API sync:
# Airflow task
@task
def extract_soja():
from agrobr.sync import datasets
df = datasets.preco_diario("soja")
df.to_parquet("/data/soja.parquet")Veja o guia completo de pipelines e o guia de ergonomia async.
- Guia Rápido
- Datasets — Contratos e garantias
- Fontes — 26 fontes documentadas
- API Reference
- Resiliência
- Portabilidade — Guia para portar o agrobr para R, Julia ou outras linguagens
Contribuições são bem-vindas! Veja CONTRIBUTING.md para detalhes.
Importante: O agrobr é licenciado sob MIT, mas os dados acessados pertencem às suas respectivas fontes e possuem licenças próprias. Dados CEPEA/ESALQ, por exemplo, são CC BY-NC 4.0 (uso comercial requer autorização). Consulte docs/licenses.md para a tabela completa de fontes, licenças e classificações.
MIT - veja LICENSE para detalhes.
