Sdílet prostřednictvím


series_uv_anomalies_fl()

Funkce series_uv_anomalies_fl() je uživatelem definovaná funkce (UDF), která detekuje anomálie 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ých dynamických polí a požadovanou úroveň citlivosti detekce anomálií. 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 s vysokou/nízkou/všemi anomáliemi, modelovanou časovou řadu směrného plánu, její normální vysoké/nízké hranice (hodnota nad nebo pod vysokou/nízkou hranicí je anomálie) a zjištěná sezónnost.

Poznámka:

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

Požadavky

V následujícím příkladu funkce nahraďte YOUR-AD-RESOURCE-NAME v identifikátoru URI a v Ocp-Apim-Subscription-Key hlavičce názvem a YOUR-KEY klíčem prostředku Detektor anomálií.

Syntaxe

T | invoke series_uv_anomalies_fl( y_series [ , citlivost [, 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.
citlivost integer Celé číslo v rozsahu [0–100] určující citlivost detekce anomálií. 0 je nejcitlivější detekce, zatímco 100 je nejcitlivější, což znamená, že i malá odchylka od očekávaného směrného plánu by byla označena jako anomálie. Výchozí hodnota: 85
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í.

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říkladyseries_uv_anomalies_fl().

let series_uv_anomalies_fl=(tbl:(*), y_series:string, sensitivity:int=85, tsid:string='_tsid')
{
    let uri = 'https://YOUR-AD-RESOURCE-NAME.cognitiveservices.azure.com/anomalydetector/v1.0/timeseries/entire/detect';
    let headers=dynamic({'Ocp-Apim-Subscription-Key': h'YOUR-KEY'});
    let kwargs = bag_pack('y_series', y_series, 'sensitivity', sensitivity);
    let code = ```if 1:
        import json
        y_series = kargs["y_series"]
        sensitivity = kargs["sensitivity"]
        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, "sensitivity":sensitivity}     # auto-detect period, or we can force 'period': 84. We can also add 'maxAnomalyRatio':0.25 for maximum 25% anomalies
            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, baseline_ama=ResponseBody.expectedValues, ad_ama=series_add(0, ResponseBody.isAnomaly), pos_ad_ama=series_add(0, ResponseBody.isPositiveAnomaly)
       , neg_ad_ama=series_add(0, ResponseBody.isNegativeAnomaly), upper_ama=series_add(ResponseBody.expectedValues, ResponseBody.upperMargins), lower_ama=series_subtract(ResponseBody.expectedValues, ResponseBody.lowerMargins)
       | extend _tsid=toscalar(_tsid)
      )
};
// Write your query to use the function here.

Příklady

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

Použití series_uv_anomalies_fl() k detekci anomálií

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

let series_uv_anomalies_fl=(tbl:(*), y_series:string, sensitivity:int=85, tsid:string='_tsid')
{
    let uri = 'https://YOUR-AD-RESOURCE-NAME.cognitiveservices.azure.com/anomalydetector/v1.0/timeseries/entire/detect';
    let headers=dynamic({'Ocp-Apim-Subscription-Key': h'YOUR-KEY'});
    let kwargs = bag_pack('y_series', y_series, 'sensitivity', sensitivity);
    let code = ```if 1:
        import json
        y_series = kargs["y_series"]
        sensitivity = kargs["sensitivity"]
        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, "sensitivity":sensitivity}     # auto-detect period, or we can force 'period': 84. We can also add 'maxAnomalyRatio':0.25 for maximum 25% anomalies
            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, baseline_ama=ResponseBody.expectedValues, ad_ama=series_add(0, ResponseBody.isAnomaly), pos_ad_ama=series_add(0, ResponseBody.isPositiveAnomaly)
       , neg_ad_ama=series_add(0, ResponseBody.isNegativeAnomaly), upper_ama=series_add(ResponseBody.expectedValues, ResponseBody.upperMargins), lower_ama=series_subtract(ResponseBody.expectedValues, ResponseBody.lowerMargins)
       | extend _tsid=toscalar(_tsid)
      )
};
let etime=datetime(2017-03-02);
let stime=datetime(2017-01-01);
let dt=1h;
let ts = requests
| make-series value=avg(value) on timestamp from stime to etime step dt
| extend _tsid='TS1';
ts
| invoke series_uv_anomalies_fl('value')
| lookup ts on _tsid
| render anomalychart with(xcolumn=timestamp, ycolumns=value, anomalycolumns=ad_ama)

Výstup

Graf znázorňující anomálie v časové řadě

Porovnání series_uv_anomalies_fl() a nativní series_decompose_anomalies()

Následující příklad porovnává rozhraní API pro detekci anomálií Univariate s nativní series_decompose_anomalies() funkcí ve třech časových řadách a předpokládá, series_uv_anomalies_fl() že tato funkce je už v databázi definovaná:

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

let series_uv_anomalies_fl=(tbl:(*), y_series:string, sensitivity:int=85, tsid:string='_tsid')
{
    let uri = 'https://YOUR-AD-RESOURCE-NAME.cognitiveservices.azure.com/anomalydetector/v1.0/timeseries/entire/detect';
    let headers=dynamic({'Ocp-Apim-Subscription-Key': h'YOUR-KEY'});
    let kwargs = bag_pack('y_series', y_series, 'sensitivity', sensitivity);
    let code = ```if 1:
        import json
        y_series = kargs["y_series"]
        sensitivity = kargs["sensitivity"]
        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, "sensitivity":sensitivity}     # auto-detect period, or we can force 'period': 84. We can also add 'maxAnomalyRatio':0.25 for maximum 25% anomalies
            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, baseline_ama=ResponseBody.expectedValues, ad_ama=series_add(0, ResponseBody.isAnomaly), pos_ad_ama=series_add(0, ResponseBody.isPositiveAnomaly)
       , neg_ad_ama=series_add(0, ResponseBody.isNegativeAnomaly), upper_ama=series_add(ResponseBody.expectedValues, ResponseBody.upperMargins), lower_ama=series_subtract(ResponseBody.expectedValues, ResponseBody.lowerMargins)
       | extend _tsid=toscalar(_tsid)
      )
};
let ts = demo_make_series2
| summarize TimeStamp=make_list(TimeStamp), num=make_list(num) by sid;
ts
| invoke series_uv_anomalies_fl('num', 'sid', 90)
| join ts on $left._tsid == $right.sid
| project-away _tsid
| extend (ad_adx, score_adx, baseline_adx)=series_decompose_anomalies(num, 1.5, -1, 'linefit')
| project-reorder num, *
| render anomalychart with(series=sid, xcolumn=TimeStamp, ycolumns=num, baseline_adx, baseline_ama, lower_ama, upper_ama, anomalycolumns=ad_adx, ad_ama)

Výstup

Následující graf ukazuje anomálie zjištěné rozhraním API pro detekci anomálií Univariate v TS1. V poli filtru grafu můžete také vybrat typ TS2 nebo TS3.

Graf znázorňující anomálie využívající univariát A P I ve časových řadách

Následující graf ukazuje anomálie zjištěné nativní funkcí na TS1.

Graf znázorňující anomálie využívající nativní funkci v časové řadě

Tato funkce není podporovaná.