Udostępnij za pośrednictwem


series_uv_change_points_fl()

Funkcja series_uv_change_points_fl() jest funkcją zdefiniowaną przez użytkownika (UDF), która znajduje punkty zmian w szeregach czasowych przez wywołanie interfejsu API wykrywania anomalii univariate, część usług Azure Cognitive Services. Funkcja akceptuje ograniczony zestaw szeregów czasowych jako tablice dynamiczne liczbowe, próg wykrywania punktu zmiany i minimalny rozmiar okna trendu stabilnego. Każda seria czasowa jest konwertowana na wymagany format JSON i publikuje ją w punkcie końcowym usługi Narzędzie do wykrywania anomalii. Odpowiedź usługi zawiera dynamiczne tablice punktów zmian, ich pewność siebie i wykrytą sezonowość.

Uwaga

Rozważ użycie funkcji natywnej series_decompose_anomalies(), która jest bardziej skalowalna i działa szybciej.

Wymagania wstępne

Składnia

T | invoke series_uv_change_points_fl(y_series [,score_threshold [,trend_window [,tsid]]])

Dowiedz się więcej o konwencjach składniowych.

Parametry

Nazwa Typ Wymagane Opis
y_series string ✔️ Nazwa kolumny tabeli wejściowej zawierającej wartości serii do wykrycia anomalii.
score_threshold real Wartość określająca minimalną pewność, aby zadeklarować punkt zmiany. Każdy punkt, którego pewność jest wyższa niż próg, jest definiowany jako punkt zmiany. Wartość domyślna: 0,9
trend_window liczba całkowita Wartość określająca minimalny rozmiar okna na potrzeby niezawodnego obliczania zmian trendu. Wartość domyślna: 5
Tsid string Nazwa kolumny tabeli wejściowej zawierającej identyfikator szeregów czasowych. Można pominąć podczas analizowania pojedynczej serii czasowej.

Definicja funkcji

Funkcję można zdefiniować, osadzając kod jako funkcję zdefiniowaną przez zapytanie lub tworząc ją jako funkcję przechowywaną w bazie danych w następujący sposób:

Zdefiniuj funkcję przy użyciu następującej instrukcji let. Nie są wymagane żadne uprawnienia. W poniższej definicji funkcji zastąp YOUR-AD-RESOURCE-NAME ciąg w identyfikatorze URI i YOUR-KEY w Ocp-Apim-Subscription-Key nagłówku nazwą zasobu i kluczem Narzędzie do wykrywania anomalii.

Ważne

Instrukcja let nie może być uruchamiana samodzielnie. Należy po nim wykonać instrukcję wyrażenia tabelarycznego. Aby uruchomić działający przykład programu series_uv_change_points_fl(), zobacz Przykład.

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.

Przykład

W poniższym przykładzie użyto operatora invoke do uruchomienia funkcji.

Aby użyć funkcji zdefiniowanej przez zapytanie, wywołaj ją po osadzonej definicji funkcji.

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)

Dane wyjściowe

Na poniższym wykresie przedstawiono punkty zmian w szeregach czasowych.

Wykres przedstawiający punkty zmian w szeregach czasowych.

Ta funkcja nie jest obsługiwana.