Analýza časových řad
Cloudové služby a zařízení IoT generují telemetrická data, která je možné použít k získání přehledů, jako je monitorování stavu služby, fyzické produkční procesy a trendy využití. Provedení analýzy časových řad je jedním ze způsobů, jak identifikovat odchylky ve vzorci těchto metrik v porovnání s jejich typickým vzorem směrného plánu.
dotazovací jazyk Kusto (KQL) obsahuje nativní podporu pro vytváření, manipulaci a analýzu více časových řad. V tomto článku se dozvíte, jak se KQL používá k vytváření a analýze tisíců časových řad v sekundách, což umožňuje monitorování a pracovní postupy téměř v reálném čase.
Vytvoření časové řady
V této části vytvoříme velkou sadu běžných časových řad jednoduše a intuitivně pomocí operátoru make-series
a podle potřeby doplníme chybějící hodnoty.
Prvním krokem v analýze časových řad je rozdělení původní tabulky telemetrie na sadu časových řad a její transformace. Tabulka obvykle obsahuje sloupec časového razítka, kontextové dimenze a volitelné metriky. Dimenze se používají k rozdělení dat. Cílem je vytvořit tisíce časových řad na oddíl v pravidelných časových intervalech.
Vstupní tabulka demo_make_series1 obsahuje 600 tisíc záznamů libovolného provozu webové služby. Pomocí následujícího příkazu můžete vzorkovat 10 záznamů:
demo_make_series1 | take 10
Výsledná tabulka obsahuje sloupec časového razítka, tři sloupce kontextových dimenzí a žádné metriky:
Časové razítko | Prohlížeč | OsVer | Země/oblast |
---|---|---|---|
2016-08-25 09:12:35.4020000 | Chrome 51.0 | Windows 7 | Spojené království |
2016-08-25 09:12:41.1120000 | Chrome 52.0 | Windows 10 | |
2016-08-25 09:12:46.2300000 | Chrome 52.0 | Windows 7 | Spojené království |
2016-08-25 09:12:46.5100000 | Chrome 52.0 | Windows 10 | Spojené království |
2016-08-25 09:12:46.5570000 | Chrome 52.0 | Windows 10 | Litevská republika |
2016-08-25 09:12:47.0470000 | Chrome 52.0 | Windows 8.1 | Indie |
2016-08-25 09:12:51.3600000 | Chrome 52.0 | Windows 10 | Spojené království |
2016-08-25 09:12:51.6930000 | Chrome 52.0 | Windows 7 | Nizozemsko |
2016-08-25 09:12:56.4240000 | Chrome 52.0 | Windows 10 | Spojené království |
2016-08-25 09:13:08.7230000 | Chrome 52.0 | Windows 10 | Indie |
Vzhledem k tomu, že neexistují žádné metriky, můžeme vytvořit pouze sadu časových řad, které představují samotný počet přenosů, rozdělené podle operačního systému pomocí následujícího dotazu:
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| render timechart
- Pomocí operátoru
make-series
vytvořte sadu tří časových řad, kde:num=count()
: časová řada přenosůfrom min_t to max_t step 1h
: Časová řada se vytváří v 1hodinovém intervalu v časovém rozsahu (nejstarší a nejnovější časová razítka záznamů tabulky).default=0
: Zadejte metodu vyplnění chybějících intervalů, aby se vytvořily pravidelné časové řady. Pro změny můžete také použítseries_fill_const()
,series_fill_forward()
series_fill_backward()
aseries_fill_linear()
.by OsVer
: dělení podle operačního systému
- Skutečná datová struktura časových řad je číselné pole agregované hodnoty pro každý časový interval. Používáme
render timechart
pro vizualizaci.
Ve výše uvedené tabulce máme tři oddíly. Můžeme vytvořit samostatnou časovou řadu: Windows 10 (červená), 7 (modrá) a 8,1 (zelená) pro každou verzi operačního systému, jak je znázorněno v grafu:
Funkce analýzy časových řad
V této části provedeme typické funkce zpracování řad. Po vytvoření sady časových řad podporuje KQL rostoucí seznam funkcí pro jejich zpracování a analýzu. Popíšeme si několik reprezentativních funkcí pro zpracování a analýzu časových řad.
Filtrování
Filtrování je běžnou praxí při zpracování signálu a je užitečné pro úlohy zpracování časových řad (například plynulý signál s hlučným signálem, detekce změn).
- Existují dvě obecné funkce filtrování:
series_fir()
: Použití filtru FIR. Slouží k jednoduchému výpočtu klouzavého průměru a rozlišení časové řady pro detekci změn.series_iir()
: Použití filtru IIR. Používá se pro exponenciální vyrovnání a kumulativní součet.
Extend
časovou řadu nastavenou přidáním nové řady klouzavého průměru o velikosti 5 intervalů (s názvem ma_num) do dotazu:
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| render timechart
Regresní analýza
Azure Data Explorer podporuje analýzu segmentované lineární regrese pro odhad trendu časové řady.
- Použijte series_fit_line() k přizpůsobení nejlepší přímky časové řadě pro obecnou detekci trendu.
- Pomocí series_fit_2lines() můžete detekovat změny trendu vzhledem ke směrnému plánu, které jsou užitečné ve scénářích monitorování.
Příklad series_fit_line()
funkcí a series_fit_2lines()
v dotazu časové řady:
demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)
- Modrá: původní časová řada
- Zelená: fitovaná linka
- Červená: dvě fitované linky
Poznámka
Funkce přesně zjistila bod skoku (změny úrovně).
Detekce sezónnosti
Řada metrik se řídí sezónními (pravidelnými) vzory. Uživatelský provoz cloudových služeb obvykle obsahuje denní a týdenní vzorce, které jsou nejvyšší v polovině pracovního dne a nejnižší v noci a přes víkend. Senzory IoT měří v pravidelných intervalech. Sezónní chování můžou vykazovat také fyzická měření, jako je teplota, tlak nebo vlhkost.
Následující příklad použije detekci sezónnosti u měsíčního provozu webové služby (intervaly 2 hodiny):
demo_series3
| render timechart
- Pomocí series_periods_detect() můžete automaticky zjišťovat období v časové řadě.
- Series_periods_validate() použijte, pokud víme, že metrika má mít konkrétní odlišná období, a chceme ověřit, že existují.
Poznámka
Jedná se o anomálii, pokud neexistují konkrétní jedinečná období.
demo_series3
| project (periods, scores) = series_periods_detect(num, 0., 14d/2h, 2) //to detect the periods in the time series
| mv-expand periods, scores
| extend days=2h*todouble(periods)/1d
Období | Skóre | Dní |
---|---|---|
84 | 0.820622786055595 | 7 |
12 | 0.764601405803502 | 1 |
Funkce zjišťuje denní a týdenní sezónnost. Denní skóre je menší než týdenní, protože víkendové dny se liší od pracovních dnů.
Funkce z ředicích
Aritmetické a logické operace je možné provádět v časové řadě. Pomocí series_subtract() můžeme vypočítat zbytkovou časovou řadu, to znamená rozdíl mezi původní nezpracovanou metrikou a vyhlazenou metrikou, a hledat anomálie v reziduálním signálu:
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp in from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| extend residual_num=series_subtract(num, ma_num) //to calculate residual time series
| where OsVer == "Windows 10" // filter on Win 10 to visualize a cleaner chart
| render timechart
- Modrá: původní časová řada
- Červená: vyhlazená časová řada
- Zelená: zbytkové časové řady
Pracovní postup časové řady ve velkém měřítku
Následující příklad ukazuje, jak můžou tyto funkce běžet ve velkém měřítku na tisících časových řadách v sekundách pro detekci anomálií. Pokud chcete zobrazit několik ukázkových záznamů telemetrie metriky počtu čtení služby DB za čtyři dny, spusťte následující dotaz:
demo_many_series1
| take 4
ČASOVÉ RAZÍTKO | Loc | Op | DB | Čtení dat |
---|---|---|---|---|
2016-09-11 21:00:00.0000000 | Loc 9 | 5117853934049630089 | 262 | 0 |
2016-09-11 21:00:00.0000000 | Loc 9 | 5117853934049630089 | 241 | 0 |
2016-09-11 21:00:00.0000000 | Loc 9 | -865998331941149874 | 262 | 279862 |
2016-09-11 21:00:00.0000000 | Loc 9 | 371921734563783410 | 255 | 0 |
A jednoduchá statistika:
demo_many_series1
| summarize num=count(), min_t=min(TIMESTAMP), max_t=max(TIMESTAMP)
num | min_t | max_t |
---|---|---|
2177472 | 2016-09-08 00:00:00.0000000 | 2016-09-11 23:00:00.0000000 |
Vytvoření časové řady v hodinových intervalech metriky pro čtení (celkem 4 dny × 24 hodin = 96 bodů) vede k normálnímu kolísání vzorce:
let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h
| render timechart with(ymin=0)
Výše uvedené chování je zavádějící, protože jedna normální časová řada je agregována z tisíců různých instancí, které mohou mít neobvyklé vzory. Proto vytvoříme časovou řadu pro každou instanci. Instance je definována loc (location), Op (operace) a DB (konkrétní počítač).
Kolik časových řad můžeme vytvořit?
demo_many_series1
| summarize by Loc, Op, DB
| count
Počet |
---|
18339 |
Teď vytvoříme sadu časových řad 18339 metriky počtu čtení. Do příkazu vytyčovací řady přidáme by
klauzuli , použijeme lineární regresi a vybereme horní dvě časové řady s nejvýznamnějším klesajícím trendem:
let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| render timechart with(title='Service Traffic Outage for 2 instances (out of 18339)')
Zobrazení instancí:
let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| project Loc, Op, DB, slope
Loc | Op | DB | Svahu |
---|---|---|---|
Loc 15 | 37 | 1151 | -102743.910227889 |
Loc 13 | 37 | 1249 | -86303.2334644601 |
Za méně než dvě minuty bylo analyzováno téměř 20 000 časových řad a byly zjištěny dvě neobvyklé časové řady, ve kterých se počet čtení náhle snížil.
Tyto pokročilé funkce v kombinaci s rychlým výkonem poskytují jedinečné a výkonné řešení pro analýzu časových řad.
Související obsah
- Přečtěte si o detekci a prognózování anomálií pomocí KQL.
- Seznamte se s funkcemi strojového učení pomocí KQL.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro