Freigeben über


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

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.

Diagramm mit Änderungspunkten in einer Zeitreihe.