Anomalias em séries temporais com Azure Anomaly Detector
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?