(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como filtrar e agregar dados de uma API REST em Python: passo a passo

João Barros 06 de September de 2026 4 min de leitura

Este tutorial mostra como filtrar e agregar dados recebidos de uma API REST em Python para obter relatórios resumidos e analisáveis. Saber filtrar e agregar diretamente na camada cliente é útil quando a API não fornece endpoints analíticos ou quando se quer validar dados antes de carregar para um sistema ETL.

Pré-requisitos

  • Python 3.8+ instalado.
  • Bibliotecas: requests e pandas (pip install requests pandas).
  • Uma API REST que devolva JSON com registos semelhantes (ex.: listagem de transacções ou eventos).
  • Editor de texto/IDE e terminal.

Passo 1: perceber o formato da API e escolher filtros

Antes de escrever código, verifique a documentação da API: parâmetros de query, campos devolvidos e paginação. Decida os filtros que vai aplicar (datas, estado, tipo) e as chaves para agregar (ex.: categoria, dia, cliente).

Passo 2: obter páginas da API com requests

Implemente a chamada à API com paginação. Exemplo mínimo: request por página até não haver mais resultados. Trate erros HTTP e tempos de espera.

import requests

def fetch_all(url, params=None, headers=None, page_param='page'):
    params = params.copy() if params else {}
    page = 1
    all_items = []
    while True:
        params[page_param] = page
        resp = requests.get(url, params=params, headers=headers, timeout=10)
        resp.raise_for_status()
        data = resp.json()
        items = data.get('results') or data.get('items') or data
        if not items:
            break
        all_items.extend(items)
        # condição simples de paragem: quando menos itens que uma página típica
        if isinstance(items, list) and len(items) < 100:
            break
        page += 1
    return all_items

Passo 3: aplicar filtros no cliente

Filtrar no cliente é útil quando a API não aceita todos os parâmetros. Aplique filtros de forma clara e reproduzível. Exemplo: filtrar por data e estado.

from datetime import datetime

def filter_items(items, start_date=None, end_date=None, status=None):
    def in_range(d):
        if not d:
            return False
        dt = datetime.fromisoformat(d)
        if start_date and dt < start_date:
            return False
        if end_date and dt > end_date:
            return False
        return True

    filtered = []
    for it in items:
        if status and it.get('status') != status:
            continue
        if start_date or end_date:
            if not in_range(it.get('created_at')):
                continue
        filtered.append(it)
    return filtered

Passo 4: transformar JSON para pandas DataFrame

Converter para DataFrame facilita agregação e limpeza. Normalize listas aninhadas ou campos opcionais antes de agregar.

import pandas as pd

def to_dataframe(items):
    df = pd.json_normalize(items)
    # converter colunas de data
    if 'created_at' in df.columns:
        df['created_at'] = pd.to_datetime(df['created_at'])
    return df

Passo 5: agregar e calcular métricas

Use groupby para sumarizar por chave. Exemplo: somar montantes por dia e por categoria, contar transacções e calcular média.

def aggregate_metrics(df):
    # criar coluna dia
    df['day'] = df['created_at'].dt.date
    # exemplo de métricas por dia e categoria
    agg = (df.groupby(['day', 'category'])
             .agg(total_amount=pd.NamedAgg(column='amount', aggfunc='sum'),
                  count=pd.NamedAgg(column='id', aggfunc='count'),
                  avg_amount=pd.NamedAgg(column='amount', aggfunc='mean'))
             .reset_index())
    return agg

Passo 6: tratar erros comuns e desempenho

Erros comuns: JSON inesperado, timeout, limites de taxa e campos em falta. Para grandes volumes, pagine com parâmetros da API, processe por blocos e evite carregar tudo para memória. Use chunks e escreva resultados intermédios para ficheiros CSV/Parquet.

# exemplo simples de escrita por chunks
for i in range(0, len(all_items), 1000):
    chunk = all_items[i:i+1000]
    df_chunk = to_dataframe(chunk)
    df_chunk.to_parquet(f'data_chunk_{i//1000}.parquet')

Verificar o resultado

Abra o DataFrame agregado (agg) e confirme somas, contagens e datas. Verifique algumas linhas brutas para confirmar que os filtros funcionaram. Exemplos de verificação rápida:

print(agg.head())
print(df[['id','created_at','status','amount']].sample(5))
print('Total original:', len(all_items), 'Após filtros:', len(df))

Conclusão

Filtrar e agregar dados de uma API REST em Python permite criar relatórios mesmo quando a API não tem endpoints analíticos. Próximos passos: adicionar autenticação (Bearer/OAuth), usar ferramentas como Dask para grandes volumes ou automatizar como parte de um pipeline ETL. Dica: experimente armazenar saídas em Parquet para consultas mais rápidas — que agregação faria sentido para a sua equipa?