Skip to main content

hidroweb-python

PyPI version Python 3.8+ Tests Coverage License: MIT

Biblioteca Python completa e profissional para consumo da API HidroWebService da ANA (Agencia Nacional de Aguas e Saneamento Basico).

Funcionalidades

API Completa

  • Cliente Python sincrono e assincrono
  • CLI poderosa para uso via terminal
  • Cache inteligente (memoria, disco, Redis)
  • Export de dados (CSV, Excel, JSON, Parquet)
  • Retry automatico com backoff exponencial
  • Paginacao automatica para grandes datasets
  • Type hints completos
  • Logging estruturado

Endpoints Disponiveis

  • Autenticacao OAuth
  • Series telemetricas adotadas
  • Series telemetricas detalhadas
  • Inventario de estacoes
  • Filtros avancados por UF, bacia, tipo

Instalacao

Via uv (recomendado)

uv add hidroweb

Via pip

pip install hidroweb

Instalacao completa (com todas as dependencias opcionais)

pip install hidroweb[full]
# Inclui: cache redis, export parquet

Pre-requisitos

Para usar esta biblioteca, voce precisa solicitar credenciais de acesso a ANA:

  1. Envie um e-mail para: hidro@ana.gov.br
  2. Assunto: "[SEU CPF/CNPJ] - Solicitacao de acesso a API HidroWebService"
  3. Inclua no corpo:
    • Nome completo e instituicao
    • CPF ou CNPJ (sera seu usuario)
    • Endereco de e-mail
    • Breve explicacao do motivo

Uso Basico

API Python

from hidroweb import ClienteHidroweb

# Inicializar cliente
cliente = ClienteHidroweb(
    identificador="SEU_CPF_OU_CNPJ",
    senha="SUA_SENHA"
)

# Listar estacoes ativas de Sao Paulo
estacoes = cliente.inventario.listar_estacoes(
    uf="SP",
    operando=True
)

# Obter serie telemetrica
medicoes = cliente.series.obter_serie_adotada(
    codigo_estacao="15400000",
    range_intervalo="DIAS_30"
)

# Exibir dados
for medicao in medicoes[:5]:
    print(f"{medicao.Data_Hora_Medicao}: Cota={medicao.Cota_Adotada}cm")

Com Cache

from hidroweb import ClienteHidroweb
from hidroweb.cache.disco import CacheDisco
from datetime import timedelta

# Cliente com cache em disco
cache = CacheDisco(ttl_padrao=timedelta(hours=24))
cliente = ClienteHidroweb(
    identificador="SEU_CPF",
    senha="SUA_SENHA",
    cache=cache
)

# Primeira busca: da API
medicoes = cliente.series.obter_serie_adotada("15400000")

# Segunda busca: do cache (instantaneo!)
medicoes = cliente.series.obter_serie_adotada("15400000")

Export de Dados

from hidroweb import ClienteHidroweb
from hidroweb.export import GerenciadorExport
from pathlib import Path

cliente = ClienteHidroweb(identificador="CPF", senha="SENHA")

# Buscar dados
medicoes = cliente.series.obter_serie_adotada("15400000")

# Exportar para CSV
GerenciadorExport.exportar(medicoes, Path("dados.csv"), formato="csv")

# Exportar para Excel
GerenciadorExport.exportar(medicoes, Path("dados.xlsx"), formato="xlsx", nome_aba="Medicoes")

# Exportar para JSON
GerenciadorExport.exportar(medicoes, Path("dados.json"), formato="json", indent=2)

# Exportar para Parquet (ideal para big data)
GerenciadorExport.exportar(medicoes, Path("dados.parquet"), formato="parquet")

API Assincrona

import asyncio
from hidroweb import ClienteHidrowebAsync

async def main():
    async with ClienteHidrowebAsync(
        identificador="CPF",
        senha="SENHA"
    ) as cliente:
        # Buscar multiplas estacoes em paralelo
        codigos = ["15400000", "15410000", "15420000"]
        resultados = await cliente.buscar_multiplas_estacoes(codigos)

        for codigo, medicoes in resultados.items():
            print(f"Estacao {codigo}: {len(medicoes)} medicoes")

asyncio.run(main())

CLI (Command Line Interface)

# Autenticar
hidroweb auth --identificador SEU_CPF --senha SUA_SENHA

# Listar estacoes
hidroweb estacoes listar --uf SP --operando --limite 10

# Ver informacoes de uma estacao
hidroweb estacoes info 15400000

# Obter serie telemetrica
hidroweb series obter 15400000 --intervalo DIAS_30 --formato tabela

# Exportar dados
hidroweb export series 15400000 dados.csv --intervalo DIAS_30 --formato csv
hidroweb export series 15400000 dados.xlsx --formato xlsx
hidroweb export series 15400000 dados.json --formato json

Funcionalidades Avancadas

Retry Automatico

from hidroweb.retry import com_retry, EstrategiaRetry

# Usar decorador
@com_retry(max_tentativas=5, backoff_base=2.0)
def buscar_dados_criticos():
    return cliente.series.obter_serie_adotada("15400000")

# Ou usar diretamente
estrategia = EstrategiaRetry(
    max_tentativas=5,
    backoff_base=1.0,
    backoff_max=60.0
)
resultado = estrategia.executar(buscar_dados_criticos)

Paginacao

from hidroweb.paginacao import Paginador

# Criar paginador
paginador = Paginador(
    funcao_busca=lambda limit, offset: cliente.inventario.listar_estacoes(),
    tamanho_pagina=100
)

# Iterar por paginas
for item in paginador.iterar_todas():
    processar(item)

# Ou obter todas de uma vez
todas = paginador.obter_todas()

Cache Redis (opcional)

from hidroweb import ClienteHidroweb
from hidroweb.cache.redis import CacheRedis
from datetime import timedelta

# Requer: pip install hidroweb[redis]
cache = CacheRedis(
    host='localhost',
    port=6379,
    ttl_padrao=timedelta(hours=1)
)

cliente = ClienteHidroweb(
    identificador="CPF",
    senha="SENHA",
    cache=cache
)

Documentacao Completa

Exemplos Praticos

# Arquivo Descricao
01 01_autenticacao.py Autenticacao basica
02 02_listar_estacoes.py Listar estacoes por UF
03 03_buscar_series.py Buscar series telemetricas
04 04_uso_cache.py Cache em memoria
05 05_export_csv.py Exportar para CSV
06 06_async_basico.py API assincrona basica
07 07_export_excel.py Exportar para Excel
08 08_series_detalhadas.py Series detalhadas por data
09 09_async_multiplas_estacoes.py Async com multiplas estacoes
10 10_uso_avancado.py Pipeline com cache, retry e export

Desenvolvimento

# Clonar repositorio
git clone https://github.com/seu-usuario/hidroweb-python
cd hidroweb-python

# Instalar com dependencias de desenvolvimento
uv pip install -e ".[dev]"

# Rodar testes
pytest

# Rodar testes com coverage
pytest --cov=src/hidroweb --cov-report=html

# Linting
ruff check src/ tests/
black --check src/ tests/

# Type checking
mypy src/

Contribuindo

Contribuicoes sao bem-vindas! Veja CONTRIBUTING.md

Status do Projeto

  • Core API implementado
  • Cache completo (memoria, disco, Redis)
  • Export (CSV, Excel, JSON, Parquet)
  • CLI funcional
  • API assincrona
  • Retry e paginacao
  • Testes completos
  • Documentacao completa

Licenca

MIT License - veja LICENSE

Exemplos de Uso

Analise de Dados

import pandas as pd
from hidroweb import ClienteHidroweb

cliente = ClienteHidroweb(identificador="CPF", senha="SENHA")

# Buscar dados de multiplas estacoes
estacoes_sp = cliente.inventario.listar_estacoes(uf="SP", operando=True)

# Coletar series de todas
dados_completos = []
for estacao in estacoes_sp[:10]:  # Primeiras 10
    medicoes = cliente.series.obter_serie_adotada(estacao.codigoestacao)
    dados_completos.extend([m.model_dump() for m in medicoes])

# Criar DataFrame para analise
df = pd.DataFrame(dados_completos)
print(df.describe())

Pipeline de Dados

from hidroweb import ClienteHidroweb
from hidroweb.cache.disco import CacheDisco
from hidroweb.export import GerenciadorExport
from pathlib import Path

# Setup
cache = CacheDisco()
cliente = ClienteHidroweb("CPF", "SENHA", cache=cache)

# Pipeline: buscar -> processar -> exportar
def pipeline_dados(uf: str, output_dir: Path):
    # 1. Buscar estacoes
    estacoes = cliente.inventario.listar_estacoes(uf=uf, operando=True)

    # 2. Buscar series (com cache automatico)
    for estacao in estacoes:
        medicoes = cliente.series.obter_serie_adotada(estacao.codigoestacao)

        # 3. Exportar cada estacao
        arquivo = output_dir / f"{estacao.codigoestacao}.parquet"
        GerenciadorExport.exportar(medicoes, arquivo, formato="parquet")

        print(f"  {estacao.Estacao_Nome}: {len(medicoes)} medicoes")

# Executar
pipeline_dados("MG", Path("dados_mg"))

Agradecimentos

  • ANA (Agencia Nacional de Aguas e Saneamento Basico) pela disponibilizacao da API
  • Comunidade Python Brasil

Desenvolvido para a comunidade hidrologica brasileira

Metadata

Release files for hidroweb 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hidroweb 1.0.0
File Size Uploaded
hidroweb-1.0.0.tar.gz 34.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for hidroweb 1.0.0
File Interpreter ABI Platform
hidroweb-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 69.0 kB

Release files / hidroweb-1.0.0.tar.gz

Download URL hidroweb-1.0.0.tar.gz
Size 34.5 kB
Tags Source
SHA-256 checksum
How to use checksums
599e13df08a71346eac7f2dcab20b8cec8504048ee0cbe97c009d2d35f73553b
BLAKE2b-256 checksum
How to use checksums
65afef993de20fc74fb2762a133b3a0323e7f81637f5611efe622e7b1d1e6fca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 25, 2026.

Transparency log

Release files / hidroweb-1.0.0-py3-none-any.whl

Download URL hidroweb-1.0.0-py3-none-any.whl
Size 34.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d2d419291d97e4ce2eb8e616df109e704923c7d9f5fd49002957096cd9ac3dea
BLAKE2b-256 checksum
How to use checksums
c011abbf6ed1ff9ada2cb243172a4320bd031d8dc0872df4c5dbebf85961bf51
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page