series_uv_change_points_fl()
Aplica-se a: ✅Azure Data Explorer
A função series_uv_change_points_fl()
é uma UDF (função definida pelo usuário) que localiza pontos de alteração em séries temporais chamando a API de Detecção de Anomalias Univariadas, parte dos Serviços Cognitivos do Azure. A função aceita um conjunto limitado de séries temporais como matrizes dinâmicas numéricas, o limite de detecção de ponto de alteração e o tamanho mínimo da janela de tendência estável. Cada série temporal é convertida no formato JSON necessário e a posta no ponto de extremidade de serviço do Detector de Anomalias. A resposta de serviço contém matrizes dinâmicas de pontos de alteração, sua respectiva confiança e a sazonalidade detectada.
Observação
Considere usar a função nativa series_decompose_anomalies(), que é mais escalável e é executada mais rapidamente.
Pré-requisitos
- Uma assinatura do Azure. Criar uma conta gratuita do Azure.
- Um cluster e um banco de dados Crie um cluster e um banco de dados ou um banco de dados KQL com permissões de edição e dados.
- O plug-in Python deve ser habilitado no cluster. Isso é necessário para o Python embutido usado na função.
- Crie um recurso Detector de Anomalias e obtenha sua chave para acessar o serviço.
- Habilite o plug-in http_request/plug-in http_request_post no cluster para acessar o ponto de extremidade do serviço de detecção de anomalias.
- Modifique a política de texto explicativo para o tipo
webapi
para acessar o ponto de extremidade do serviço de detecção de anomalias.
Sintaxe
T | invoke series_uv_change_points_fl(
y_series [,
score_threshold [,
trend_window [,
tsid]]])
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Digitar | Obrigatória | Descrição |
---|---|---|---|
y_series | string |
✔️ | O nome da coluna da tabela de entrada que contém os valores da série a ser detectada por anomalias. |
score_threshold | real |
Um valor que especifica a confiança mínima para declarar um ponto de alteração. Cada ponto cuja confiança está acima do limite é definido como um ponto de alteração. Valor padrão: 0,9 | |
trend_window | Número inteiro | Um valor que especifica o tamanho mínimo da janela para cálculo robusto de alterações de tendência. Valor padrão: 5 | |
tsid | string |
O nome da coluna da tabela de entrada que contém a ID da série temporal. Pode ser omitido ao analisar uma única série temporal. |
Definição de função
Você pode definir a função inserindo seu código como uma função definida por consulta ou criando-a como uma função armazenada em seu banco de dados, da seguinte maneira:
Defina a função usando a instrução let a seguir. Nenhuma permissão é necessária. Na definição de função a seguir, substitua YOUR-AD-RESOURCE-NAME
no uri e YOUR-KEY
no Ocp-Apim-Subscription-Key
cabeçalho pelo nome e pela chave do recurso do Detector de Anomalias.
Importante
Uma instrução let não pode ser executada sozinha. Ele deve ser seguido por uma instrução de expressão tabular. Para executar um exemplo funcional de series_uv_change_points_fl()
, consulte Exemplo.
let series_uv_change_points_fl=(tbl:(*), y_series:string, score_threshold:real=0.9, trend_window:int=5, tsid:string='_tsid')
{
let uri = 'https://YOUR-AD-RESOURCE-NAME.cognitiveservices.azure.com/anomalydetector/v1.0/timeseries/changepoint/detect';
let headers=dynamic({'Ocp-Apim-Subscription-Key': h'YOUR-KEY'});
let kwargs = bag_pack('y_series', y_series, 'score_threshold', score_threshold, 'trend_window', trend_window);
let code = ```if 1:
import json
y_series = kargs["y_series"]
score_threshold = kargs["score_threshold"]
trend_window = kargs["trend_window"]
json_str = []
for i in range(len(df)):
row = df.iloc[i, :]
ts = [{'value':row[y_series][j]} for j in range(len(row[y_series]))]
json_data = {'series': ts, "threshold":score_threshold, "stableTrendWindow": trend_window} # auto-detect period, or we can force 'period': 84
json_str = json_str + [json.dumps(json_data)]
result = df
result['json_str'] = json_str
```;
tbl
| evaluate python(typeof(*, json_str:string), code, kwargs)
| extend _tsid = column_ifexists(tsid, 1)
| partition by _tsid (
project json_str
| evaluate http_request_post(uri, headers, dynamic(null))
| project period=ResponseBody.period, change_point=series_add(0, ResponseBody.isChangePoint), confidence=ResponseBody.confidenceScores
| extend _tsid=toscalar(_tsid)
)
};
// Write your query to use the function here.
Exemplo
O exemplo a seguir usa o operador invoke para executar a função.
Para usar uma função definida por consulta, invoque-a após a definição da função inserida.
let series_uv_change_points_fl=(tbl:(*), y_series:string, score_threshold:real=0.9, trend_window:int=5, tsid:string='_tsid')
{
let uri = 'https://YOUR-AD-RESOURCE-NAME.cognitiveservices.azure.com/anomalydetector/v1.0/timeseries/changepoint/detect';
let headers=dynamic({'Ocp-Apim-Subscription-Key': h'YOUR-KEY'});
let kwargs = bag_pack('y_series', y_series, 'score_threshold', score_threshold, 'trend_window', trend_window);
let code = ```if 1:
import json
y_series = kargs["y_series"]
score_threshold = kargs["score_threshold"]
trend_window = kargs["trend_window"]
json_str = []
for i in range(len(df)):
row = df.iloc[i, :]
ts = [{'value':row[y_series][j]} for j in range(len(row[y_series]))]
json_data = {'series': ts, "threshold":score_threshold, "stableTrendWindow": trend_window} # auto-detect period, or we can force 'period': 84
json_str = json_str + [json.dumps(json_data)]
result = df
result['json_str'] = json_str
```;
tbl
| evaluate python(typeof(*, json_str:string), code, kwargs)
| extend _tsid = column_ifexists(tsid, 1)
| partition by _tsid (
project json_str
| evaluate http_request_post(uri, headers, dynamic(null))
| project period=ResponseBody.period, change_point=series_add(0, ResponseBody.isChangePoint), confidence=ResponseBody.confidenceScores
| extend _tsid=toscalar(_tsid)
)
};
let ts = range x from 1 to 300 step 1
| extend y=iff(x between (100 .. 110) or x between (200 .. 220), 20, 5)
| extend ts=datetime(2021-01-01)+x*1d
| extend y=y+4*rand()
| summarize ts=make_list(ts), y=make_list(y)
| extend sid=1;
ts
| invoke series_uv_change_points_fl('y', 0.8, 10, 'sid')
| join ts on $left._tsid == $right.sid
| project-away _tsid
| project-reorder y, * // just to visualize the anomalies on top of y series
| render anomalychart with(xcolumn=ts, ycolumns=y, confidence, anomalycolumns=change_point)
Saída
O gráfico a seguir mostra os pontos de alteração em uma série temporal.