Sdílet prostřednictvím


series_uv_change_points_fl()

Funkce series_uv_change_points_fl() je uživatelem definovaná funkce (UDF), která vyhledá body změn v časových řadách voláním rozhraní API pro detekci anomálií Univariate, která je součástí azure Cognitive Services. Funkce přijímá omezenou sadu časových řad jako číselná dynamická pole, prahovou hodnotu detekce bodu změn a minimální velikost stabilního okna trendu. Každá časová řada se převede do požadovaného formátu JSON a publikuje ji do koncového bodu služby Detektor anomálií. Odpověď služby obsahuje dynamická pole bodů změn, jejich odpovídající spolehlivost a zjištěnou sezónnost.

Poznámka:

Zvažte použití nativní funkce series_decompose_anomalies(), která je škálovatější a běží rychleji.

Požadavky

Syntaxe

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

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
y_series string ✔️ Název sloupce vstupní tabulky obsahující hodnoty řady, které mají být zjištěny anomálie.
score_threshold real Hodnota určující minimální spolehlivost pro deklaraci bodu změny. Každý bod, jehož spolehlivost překračuje prahovou hodnotu, je definována jako bod změny. Výchozí hodnota: 0,9
trend_window integer Hodnota určující minimální velikost okna pro robustní výpočet změn trendu. Výchozí hodnota: 5
tsid string Název sloupce vstupní tabulky obsahující ID časové řady. Při analýze jedné časové řady je možné vynechat.

Definice funkce

Funkci můžete definovat vložením jejího kódu jako funkce definovanou dotazem nebo vytvořením jako uložené funkce v databázi následujícím způsobem:

Definujte funkci pomocí následujícího příkazu let. Nejsou vyžadována žádná oprávnění. V následující definici funkce nahraďte YOUR-AD-RESOURCE-NAME v identifikátoru URI a YOUR-KEY v Ocp-Apim-Subscription-Key hlavičce názvem a klíčem prostředku Detektor anomálií.

Důležité

Příkaz let nemůže běžet samostatně. Musí následovat příkaz tabulkového výrazu. Pokud chcete spustit funkční příklad, podívejte se na příkladseries_uv_change_points_fl().

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.

Příklad

Následující příklad používá operátor invoke ke spuštění funkce.

Pokud chcete použít funkci definovanou dotazem, vyvoláte ji po definici vložené funkce.

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)

Výstup

Následující graf ukazuje body změn v časové řadě.

Graf znázorňující body změn v časové řadě

Tato funkce není podporovaná.