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

Anomalias em séries temporais com Azure Anomaly Detector

João Barros 20 de July de 2026 4 min de leitura

Este tutorial mostra como detetar anomalias em séries temporais com Azure Anomaly Detector, útil para monitorizar métricas como tráfego, vendas ou telemetria. Aprende o porquê das deteções, como preparar a série, enviar pedidos à API e visualizar os pontos anómalos com um exemplo em Python.

Pré-requisitos

  • Conta Azure com um recurso Azure Anomaly Detector criado (chave e endpoint).
  • Python 3.8+ instalado e pip.
  • Bibliotecas: requests, matplotlib, pandas (instalar no passo 2).
  • Ficheiro CSV ou séries temporais em formato timestamp+valor.

Passo 1: Criar o recurso Azure Anomaly Detector

No portal Azure cria um recurso Azure Anomaly Detector (tipo de recurso: Anomaly Detector). Após criar, copia a Key e o Endpoint. Vais precisar desses valores para autenticar os pedidos HTTP.

Passo 2: Instalar dependências e preparar dados

Instala as bibliotecas necessárias e prepara uma pequena série temporal de exemplo. A série deve ter timestamps em ISO 8601 e valores numéricos. Aqui usamos um exemplo sintético embutido no código.

pip install requests pandas matplotlib
# exemplo_dataset.py
import pandas as pd
from datetime import datetime, timedelta

# Gerar 60 dias de dados com algumas anomalias
start = datetime(2023, 1, 1)
dates = [start + timedelta(days=i) for i in range(60)]
values = [100 + (i * 0.5) for i in range(60)]
# inserir anomalias artificiais
values[10] = 200
values[35] = 40

df = pd.DataFrame({'timestamp': [d.isoformat() for d in dates], 'value': values})
print(df.head())

Passo 3: Enviar a série para o endpoint Entire Detection

Usamos a API REST de Azure Anomaly Detector para detetar anomalias em toda a série (Entire detection). O endpoint típico é: {endpoint}/anomalydetector/v1.1/timeseries/entire/detect. Substitui YOUR_ENDPOINT e YOUR_KEY pelos teus valores.

import requests
import json
import pandas as pd

ENDPOINT = "https://YOUR_ENDPOINT"  # sem slash final
KEY = "YOUR_KEY"

# carregar dados do exemplo
from exemplo_dataset import df

url = f"{ENDPOINT}/anomalydetector/v1.1/timeseries/entire/detect"
headers = {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': KEY
}

body = {
    'series': [{'timestamp': t, 'value': float(v)} for t, v in zip(df['timestamp'], df['value'])],
    'granularity': 'daily'
}

resp = requests.post(url, headers=headers, json=body)
resp.raise_for_status()
result = resp.json()
print(json.dumps(result, indent=2))

Passo 4: Interpretar a resposta e isolar anomalias

A resposta para Entire detection inclui arrays como isAnomaly, isPositiveAnomaly e anomalyScore. Itera sobre esses arrays para saber quais os timestamps anómalos.

# assumir 'result' do passo anterior
is_anomaly = result.get('isAnomaly', [])
anomaly_score = result.get('anomalyScore', [])

anomalies = []
for i, flag in enumerate(is_anomaly):
    if flag:
        anomalies.append({'timestamp': df.at[i, 'timestamp'], 'value': df.at[i, 'value'], 'score': anomaly_score[i] if anomaly_score else None})

print('Anomalias detectadas:', len(anomalies))
for a in anomalies:
    print(a)

Passo 5: Visualizar a série e marcar as anomalias

Uma visualização rápida ajuda a validar se as anomalias fazem sentido. Usa matplotlib para desenhar a série e marcar os pontos anómalos em vermelho.

import matplotlib.pyplot as plt

# preparar dados para plot
df['timestamp_dt'] = pd.to_datetime(df['timestamp'])

def plot_with_anomalies(df, anomalies):
    plt.figure(figsize=(10,4))
    plt.plot(df['timestamp_dt'], df['value'], label='valor')
    if anomalies:
        ann_ts = [pd.to_datetime(a['timestamp']) for a in anomalies]
        ann_vals = [a['value'] for a in anomalies]
        plt.scatter(ann_ts, ann_vals, color='red', label='anomalia', zorder=5)
    plt.xlabel('data')
    plt.ylabel('valor')
    plt.title('Série temporal com anomalias detectadas')
    plt.legend()
    plt.tight_layout()
    plt.show()

plot_with_anomalies(df, anomalies)

Verificar o resultado

Confirma que o número de anomalias é plausível: 1) imprime a lista de anomalias e verifica timestamps; 2) compara os pontos vermelhos no gráfico com picos/vales visíveis; 3) se obtiveres erros HTTP, verifica a chave, endpoint e o formato JSON (Content-Type).

Conclusão

Com Azure Anomaly Detector consegues analisar séries temporais rapidamente sem treinar modelos. Próximos passos: testar diferentes granularities (hourly, weekly), usar o sliding window endpoint para deteção em streaming, e integrar numa pipeline com Azure Functions ou Azure Machine Learning para alertas automáticos. Dica: começa por validar com dados sintéticos (como aqui) antes de ligar a telemetria de produção — quais métricas da tua aplicação queres monitorizar primeiro?