series_decompose()

Wendet eine Analysetransformation auf eine Reihe an.

Verwendet einen Ausdruck, der eine Reihe (dynamisches numerisches Array) als Eingabe enthält, und zerlegt sie in saisonale, Trend- und Restkomponenten.

Syntax

series_decompose(Serie, [ Saisonalität,Trend,, Test_pointsSeasonality_threshold ])

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich BESCHREIBUNG
Reihen dynamic ✔️ Ein Array numerischer Werte, in der Regel die resultierende Ausgabe von Make-Series- oder make_list-Operatoren .
Saisonalität int Steuert die saisonale Analyse. Mögliche Werte:

- -1: Automatische Erkennung der Saisonalität mithilfe von series_periods_detect. Dies ist der Standardwert.
- Punkt: Eine positive ganze Zahl, die den erwarteten Zeitraum in anzahl von Bins angibt. Wenn sich die Reihe beispielsweise in 1 - h Behältern befindet, beträgt ein wöchentlicher Zeitraum 168 Behälter.
- 0: Keine Saisonalität, daher überspringen Sie das Extrahieren dieser Komponente.
Trend string Steuert die Trendanalyse. Mögliche Werte:

- avg: Definieren Sie die Trendkomponente als average(x). Dies ist die Standardoption.
- linefit: Extrahieren der Trendkomponente mithilfe einer linearen Regression.
- none: Kein Trend, daher überspringen Sie das Extrahieren dieser Komponente.
Test_points int Eine positive ganze Zahl, die die Anzahl der Punkte am Ende der Reihe angibt, die aus dem Lern- oder Regressionsprozess ausgeschlossen werden sollen. Dieser Parameter sollte zu Vorhersagezwecken festgelegt werden. Der Standardwert ist 0.
Seasonality_threshold real Der Schwellenwert für die Saisonalitätsbewertung, wenn Saisonalität auf autoermittlung festgelegt ist. Der Schwellenwert für die Standardbewertung ist 0,6.

Weitere Informationen finden Sie unter series_periods_detect.

Gibt zurück

Die Funktion gibt die folgende reihe zurück:

  • baseline: Der vorhergesagte Wert der Datenreihe (Summe der saisonalen und Trendkomponenten, siehe unten).
  • seasonal: Die Reihe der saisonalen Komponente:
    • , wenn der Punkt nicht erkannt oder explizit auf 0 festgelegt ist: Konstante 0.
    • wenn erkannt oder auf positive ganze Zahl festgelegt: Median der Reihenpunkte in derselben Phase
  • trend: Die Reihe der Trendkomponente.
  • residual: Die Reihe der Restkomponente (d. h. x - Baseline).

Hinweis

  • Ausführungsreihenfolge der Komponente:
  1. Extrahieren der saisonalen Serie
  2. Subtrahieren sie von x, wodurch die deseasonale Reihe generiert wird
  3. Extrahieren der Trendkomponente aus der deseasonal-Serie
  4. Erstellen der Baseline = saisonal + Trend
  5. Erstellen des Restwerts = x – Baseline
  • Die Saisonalität und oder der Trend sollte aktiviert werden. Andernfalls ist die Funktion redundant und gibt nur baseline = 0 und residual = x zurück.

Weitere Informationen zur Reihenaufschlüsselung

Diese Methode wird in der Regel auf Zeitreihen von Metriken angewendet, von der erwartet wird, dass sie regelmäßiges und/oder Trendverhalten manifestieren. Sie können die -Methode verwenden, um zukünftige Metrikwerte vorherzusagen und/oder anomale Werte zu erkennen. Die implizite Annahme dieses Regressionsprozesses ist, dass die Zeitreihe abgesehen von saisonalem und Trendverhalten stochastisch und zufällig verteilt ist. Prognostizieren Sie zukünftige Metrikwerte aus den Saisonalen- und Trendkomponenten, während Sie den Restteil ignorieren. Erkennen Sie anomale Werte basierend auf der Ausreißererkennung nur für den Restteil. Weitere Informationen finden Sie im Kapitel Time Series Decomposition.

Beispiele

Wöchentliche Saisonalität

Im folgenden Beispiel generieren wir eine Serie mit wöchentlicher Saisonalität und ohne Trend und fügen ihr dann einige Ausreißer hinzu. series_decompose findet und erkennt automatisch die Saisonalität und generiert eine Baseline, die fast identisch mit der saisonalen Komponente ist. Die von uns hinzugefügten Ausreißer sind in der Restkomponente deutlich zu erkennen.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 10.0, 15.0) - (((t%24)/10)*((t%24)/10)) // generate a series with weekly seasonality
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose(y)
| render timechart  

Reihen zerlegen 1.

Wöchentliche Saisonalität mit Trend

In diesem Beispiel fügen wir der Datenreihe aus dem vorherigen Beispiel einen Trend hinzu. Zunächst wird mit den Standardparametern ausgeführt series_decompose . Der Trendstandardwert avg verwendet nur den Durchschnitt und berechnet nicht den Trend. Die generierte Baseline enthält den Trend nicht. Bei der Beobachtung des Trends in den Restwerten wird deutlich, dass dieses Beispiel weniger genau ist als das vorherige Beispiel.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose(y)
| render timechart  

Reihen zerlegen 2.

Als Nächstes führen wir dasselbe Beispiel erneut aus. Da wir einen Trend in der Datenreihe erwarten, geben wir im Trendparameter an linefit . Wir sehen, dass der positive Trend erkannt wird und die Baseline viel näher an der Eingabereihe liegt. Die Restwerte liegen nahe 0 (null), und nur die Ausreißer fallen auf. Wir sehen alle Komponenten der Datenreihe im Diagramm.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose(y, -1, 'linefit')
| render timechart  

Reihen zerlegen 3.