series_uv_change_points_fl()
Gilt für: ✅Azure Data Explorer
Die Funktion series_uv_change_points_fl()
ist eine benutzerdefinierte Funktion (UDF), die Änderungspunkte in Zeitreihen findet, indem sie die Univariate Anomaly Detection API aufrufen, Teil von Azure Cognitive Services. Die Funktion akzeptiert einen begrenzte Satz von Zeitreihen als numerische dynamische Arrays, den Schwellenwert für die Änderungspunkterkennung und die Mindestgröße des Fensters für einen stabilen Trend. Jede Zeitreihe wird in das erforderliche JSON-Format umgewandelt und an den Endpunkt des Anomalieerkennungsdiensts gesendet. Die Dienstantwort enthält dynamische Arrays von Änderungspunkten, ihrer jeweiligen Konfidenz und der erkannten Saisonalität.
Hinweis
Erwägen Sie die Verwendung der systemeigenen Funktion series_decompose_anomalies(), die skalierbarer ist und schneller ausgeführt wird.
Voraussetzungen
- Ein Azure-Abonnement. Erstellen Sie ein kostenloses Azure-Konto.
- Ein Cluster und eine Datenbank Erstellen eines Clusters und einer Datenbank oder einer KQL-Datenbank mit Bearbeitungsberechtigungen und Daten.
- Das Python-Plug-In muss im Cluster aktiviert sein. Dies ist für die inline Python erforderlich, die in der Funktion verwendet wird.
- Erstellen Sie eine Anomalieerkennung Ressource, und rufen Sie den Schlüssel für den Zugriff auf den Dienst ab.
- Aktivieren Sie das Plug-In http_request/http_request_post-Plug-In auf dem Cluster, um auf den Anomalieerkennungsdienst-Endpunkt zuzugreifen.
- Ändern Sie die Popuprichtlinie für den Typ
webapi
, um auf den Anomalieerkennungsdienstendpunkt zuzugreifen.
Syntax
T | invoke series_uv_change_points_fl(
y_series [,
score_threshold [,
trend_window [,
tsid]]])
Erfahren Sie mehr über Syntaxkonventionen.
Parameter
Name | Type | Erforderlich | Beschreibung |
---|---|---|---|
y_series | string |
✔️ | Der Name der Eingabetabellenspalte, die die Werte der Datenreihe enthält, die Anomalie erkannt werden sollen. |
score_threshold | real |
Ein Wert, der die Minimale Konfidenz angibt, um einen Änderungspunkt zu deklarieren. Jeder Punkt, dessen Konfidenz über dem Schwellenwert liegt, wird als Änderungspunkt definiert. Standardwert: 0,9 | |
trend_window | integer | Ein Wert, der die minimale Fenstergröße für die robuste Berechnung von Trendänderungen angibt. Standardwert: 5 | |
tsid | string |
Der Name der Eingabetabellenspalte, die die Zeitreihen-ID enthält. Kann beim Analysieren einer einzelnen Zeitreihe weggelassen werden. |
Funktionsdefinition
Sie können die Funktion definieren, indem Sie den Code entweder als abfragedefinierte Funktion einbetten oder wie folgt als gespeicherte Funktion in Ihrer Datenbank erstellen:
Definieren Sie die Funktion mithilfe der folgenden Let-Anweisung. Es sind keine Berechtigungen erforderlich. Ersetzen Sie YOUR-AD-RESOURCE-NAME
in der folgenden Funktionsdefinition im URI und YOUR-KEY
im Ocp-Apim-Subscription-Key
Header durch ihren Anomalieerkennung Ressourcennamen und -schlüssel.
Wichtig
Eine Let-Anweisung kann nicht alleine ausgeführt werden. Auf sie muss eine tabellarische Ausdrucksanweisung folgen. Informationen zum Ausführen eines funktionierenden Beispiels series_uv_change_points_fl()
finden Sie unter Beispiel.
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.
Beispiel
Im folgenden Beispiel wird der Aufrufoperator verwendet, um die Funktion auszuführen.
Um eine abfragedefinierte Funktion zu verwenden, rufen Sie sie nach der definition der eingebetteten Funktion auf.
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)
Output
Das folgende Diagramm zeigt Änderungspunkte in einer Zeitreihe.