Metadata-Version: 2.4
Name: python-bcb
Version: 0.4.0
Author-email: wilsonfreitas <wilson.freitas@gmail.com>
License-File: LICENSE
Requires-Python: >=3.10
Requires-Dist: httpx>=0.24.0
Requires-Dist: lxml>=4.9.2
Requires-Dist: pandas>=2.0.0
Requires-Dist: tenacity>=8.0.0
Description-Content-Type: text/markdown

# python-bcb

**python-bcb** é uma interface em Python estruturada para obter informações
da API de dados abertos do [Banco Central do Brasil](https://www.bcb.gov.br).

[![Downloads](https://img.shields.io/pypi/dm/python-bcb.svg)](https://pypi.python.org/pypi/python-bcb/)
[![image](https://img.shields.io/pypi/v/python-bcb.svg?color=green)](https://pypi.python.org/pypi/python-bcb/)
![Test workflow](https://github.com/wilsonfreitas/python-bcb/actions/workflows/test.yml/badge.svg)
![Lint workflow](https://github.com/wilsonfreitas/python-bcb/actions/workflows/lint.yml/badge.svg)
![Sphinx workflow](https://github.com/wilsonfreitas/python-bcb/actions/workflows/sphinx.yml/badge.svg)

O projeto de [Dados Abertos do Banco Central do Brasil](https://dadosabertos.bcb.gov.br/)
disponibiliza diversas APIs provendo acesso direto a dados de:

* Moedas
* Taxas de Juros
* Índices de preços
* Informações de Instituições Financeiras
* Expectativas do Mercado (Expectativas do Boletim FOCUS)
* E muito mais...

## Instalação

**python-bcb** está disponível no [Python Package Index](https://pypi.org/project/python-bcb/) e pode ser instalado via `pip`.

```shell
pip install python-bcb
```

## APIs

### SGS - Sistema Gerenciador de Séries Temporais

Utiliza o webservice do SGS ([Sistema Gerenciador de Séries Temporais](https://www3.bcb.gov.br/sgspub/)) para obter dados históricos de indicadores econômicos. Oferece a maior base de dados históricos com diversas séries temporais.

### Conversor de Moedas

Implementado no módulo `currency`, realiza webscraping no site do [Conversor de Moedas](https://www.bcb.gov.br/conversao) do Banco Central. Fornece séries temporais de frequência diária de taxas de câmbio (cotações de compra e venda).

### OData - APIs Estruturadas

O Banco Central disponibiliza diversas informações em APIs que seguem o padrão [OData](https://odata.org). Inclui:
- **PTAX**: Boletins diários de taxas de câmbio com dados institucionalmente detalhados
- **Expectativas**: Expectativas de mercado coletadas do Boletim FOCUS
- **TaxaJuros**: Diversas taxas de juros (Selic, CDI, Cheque especial, etc.)
- **MercadoImobiliario**: Dados de financiamento imobiliário
- **IFDATA**: Informações de instituições financeiras
- **SPI**: Sistema de Pagamentos Instantâneos

## Qual Módulo Devo Usar?

Use esta tabela para escolher o módulo certo para seu caso de uso:

| Caso de Uso | Módulo | Características Principais |
|----------|--------|--------------|
| Séries temporais diárias (inflação, taxas de juros) | `bcb.sgs` | Maior base histórica, controle granular de frequência, múltiplas séries pré-definidas |
| Taxas de câmbio diárias (PTAX) | `bcb.currency` | Spreads de compra/venda, implementação rápida, frequência diária |
| Expectativas de mercado (Boletim FOCUS) | `bcb.odata` (Expectativas) | Indicadores de expectativas, previsões de consenso |
| Taxas de juros (diversos tipos) | `bcb.odata` (TaxaJuros) | Curvas detalhadas, taxas de financiamento imobiliário |
| Dados de financiamento imobiliário | `bcb.odata` (MercadoImobiliario) | Originações, taxas médias, volumes |
| Informações de instituições financeiras | `bcb.odata` (IFDATA) | Dados de balanço, informações regulatórias |
| Análise de dados avançada com filtros | `bcb.odata` (qualquer serviço) | API encadeável, filtragem tipo SQL, ordenação, seleção |
| Busca concorrente de dados | APIs assíncronas (`sgs`, `currency` e OData) | Requisições não-bloqueantes com `async_get()`, `Endpoint.async_get()` e `ODataQuery.async_collect()` |

## Início Rápido

### Séries Temporais com SGS

```python
from bcb import sgs

# Buscar taxa Selic (código 1)
df = sgs.get(1, start="2023-01-01", end="2024-12-31")
```

### Taxas de Câmbio com Currency

```python
from bcb import currency

# Buscar preços de compra/venda do USD
usd = currency.get("USD", start="2023-01-01", end="2024-12-31")
```

### Expectativas de Mercado com OData

```python
from bcb import Expectativas

api = Expectativas()
endpoint = api.get_endpoint("ExpectativasMercadoAnuais")

# Obter previsões do IPCA
df = endpoint.query().filter(endpoint.Indicador == "IPCA").limit(100).collect()
```

## Perguntas Frequentes

### P: Qual é a diferença entre dados de moedas do SGS e PTAX?
**R:** SGS contém principalmente indicadores econômicos. Para taxas de câmbio, use `bcb.currency` (dados PTAX) para cotações diárias ou o serviço `bcb.odata` PTAX para dados institucionais detalhados. O módulo currency é mais simples para casos comuns.

### P: Quão longe no tempo os dados históricos vão?
**R:** Varia por série:
- SGS: Maioria das séries remontam aos anos 1980/1990 (verifique documentação específica do código)
- Currency: Cotações diárias disponíveis desde aproximadamente 1980
- Serviços OData: Varia; consulte documentação BCB para endpoints específicos

### P: Posso buscar dados de forma assíncrona?
**R:** Sim. SGS e currency oferecem `async_get()`, e os endpoints OData oferecem `async_get()` e `async_collect()`. Feche o cliente assíncrono ao final de aplicações de longa duração:
```python
import asyncio
from bcb import http, sgs

async def main():
    try:
        results = await asyncio.gather(
            sgs.async_get(1),  # SELIC
            sgs.async_get(433),  # IPCA
        )
        return results
    finally:
        await http.aclose_async_client()

asyncio.run(main())
```

### P: Como aumento o timeout de uma consulta lenta?
**R:** Passe ``timeout`` na própria chamada. O valor é local daquela chamada e
não altera o cliente HTTP compartilhado globalmente:

```python
from bcb import sgs, currency, Expectativas

# SGS
selic = sgs.get(11, start="1990-01-01", timeout=120)

# Currency
usd = currency.get("USD", start="1980-01-01", end="2026-01-01", timeout=120)

# OData
em = Expectativas(timeout=120)
ep = em.get_endpoint("ExpectativasMercadoAnuais")
df = ep.query().limit(1000).collect(timeout=120)
```

O padrão continua sendo 30 segundos. No SGS, o timeout vale por tentativa HTTP;
quando houver retry, cada tentativa usa o mesmo valor.

### P: Como trato erros e dados faltantes?
**R:** A biblioteca lança exceções específicas:
- `CurrencyNotFoundError`: Símbolo de moeda não encontrado
- `SGSError`: Erro do serviço SGS
- `BCBRateLimitError`: Limite de requisições excedido (HTTP 429)
- `BCBAPIError`: Outros erros de API

```python
from bcb import sgs
from bcb.exceptions import SGSError, BCBRateLimitError

try:
    df = sgs.get(99999)  # Código inválido
except SGSError as e:
    print(f"Erro de dados: {e}")
except BCBRateLimitError:
    print("Limite de requisições excedido - tente novamente mais tarde")
```

### P: Como habilito logging para depurar requisições?
**R:** A biblioteca usa o módulo logging padrão do Python:
```python
import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger("bcb")
logger.setLevel(logging.DEBUG)

# Agora todas as requisições/respostas HTTP serão registradas
```

### P: Existe cache para evitar requisições redundantes?
**R:** Sim:
- `bcb.currency`: Cache em memória automático de listas de moedas
- `bcb.odata`: Metadados OData em cache por URL de serviço
- Chame `currency.clear_cache()` para resetar se dados mudarem

### P: Posso usar isso em uma aplicação de longa duração?
**R:** Sim, mas tenha cuidado com:
- Limites de requisições: APIs BCB podem ter limites; implemente backoff se necessário
- Cache: Cache de moedas persiste em memória; limpe se atualizações de dados importarem
- Pool de conexões: Usa httpx com connection pooling por padrão
- API Assíncrona: use métodos async para comportamento verdadeiramente não-bloqueante e chame `await bcb.http.aclose_async_client()` no encerramento de aplicações assíncronas longas

### P: Como contribuo ou reporto problemas?
**R:** Visite o [repositório GitHub](https://github.com/wilsonfreitas/python-bcb) para:
- Reportar bugs
- Solicitar features
- Enviar pull requests
- Ver documentação

### P: Como gero a documentação localmente?
**R:** As dependências de documentação ficam no grupo `docs` do `uv`:
```shell
uv run --group docs sphinx-build -b html docs docs/_build/html
```

A saída HTML é gerada em `docs/_build/html`. Edite os arquivos fonte em `docs/`; não edite os arquivos gerados em `docs/_build`.

### P: Onde encontro documentação mais detalhada?
**R:**
- [Documentação de API](https://wilsonfreitas.github.io/python-bcb/)
- [Diretório de Exemplos](./examples/)
- Docstrings inline: `help(bcb.sgs.get)`, `help(bcb.currency.get)`, etc.
- [Portal de Dados Abertos BCB](https://dadosabertos.bcb.gov.br/)
