series_decompose()

Applica una trasformazione di scomposizione in una serie.

Accetta un'espressione contenente una serie (matrice numerica dinamica) come input e la scompone in componenti stagionali, di tendenza e residui.

Sintassi

series_decompose(Serie, [ Stagionalità,Tendenza,, Test_pointsSeasonality_threshold ])

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Tipo Obbligatoria Descrizione
Serie dynamic ✔️ Matrice di valori numerici, in genere l'output risultante degli operatori make-series o make_list .
Stagionalità int Controlla l'analisi stagionale. I valori possibili sono:

- -1: stagionalità della correzione automatica tramite series_periods_detect. Si tratta del valore predefinito.
- Periodo: numero intero positivo che specifica il periodo previsto in numero di bin. Ad esempio, se la serie è in 1 - h contenitori, un periodo settimanale è di 168 bin.
- 0: nessuna stagionalità, quindi ignorare l'estrazione di questo componente.
Tendenza string Controlla l'analisi delle tendenze. I valori possibili sono:

- avg: definire il componente di tendenza come average(x). Questo è il valore predefinito.
- linefit: estrarre il componente di tendenza usando la regressione lineare.
- none: nessuna tendenza, quindi ignorare l'estrazione di questo componente.
Test_points int Intero positivo che specifica il numero di punti alla fine della serie da escludere dal processo di apprendimento o regressione. Questo parametro deve essere impostato a scopo di previsione. Il valore predefinito è 0.
Seasonality_threshold real Soglia per il punteggio di stagionalità quando la stagionalità è impostata su autodetect. La soglia del punteggio predefinito è 0,6.

Per altre informazioni, vedere series_periods_detect.

Restituisce

La funzione restituisce la rispettiva serie:

  • baseline: valore stimato della serie (somma dei componenti stagionali e di tendenza, vedere di seguito).
  • seasonal: la serie del componente stagionale:
    • se il periodo non viene rilevato o viene impostato in modo esplicito su 0: costante 0.
    • se rilevato o impostato su integer positivo: mediano dei punti della serie nella stessa fase
  • trend: la serie del componente di tendenza.
  • residual: serie del componente residuo ,ovvero x - baseline.

Nota

  • Ordine di esecuzione dei componenti:
  1. Estrarre la serie stagionale
  2. Sottrarlo da x, generando la serie deseasonal
  3. Estrarre il componente di tendenza dalla serie di deseasonal
  4. Creare la baseline = stagionale + tendenza
  5. Creare il residuo = x - baseline
  • La stagionalità e la tendenza devono essere abilitate. In caso contrario, la funzione è ridondante e restituisce solo la baseline = 0 e il residuo = x.

Altre informazioni sulla scomposizione delle serie

Questo metodo viene in genere applicato a serie temporali di metriche previste per manifestare il comportamento periodico e/o della tendenza. È possibile usare il metodo per prevedere i valori futuri delle metriche e/o rilevare valori anomali. Il presupposto implicito di questo processo di regressione è che, a parte il comportamento stagionale e di tendenza, la serie temporale è stocastica e distribuita in modo casuale. Prevedere i valori delle metriche future dai componenti stagionali e di tendenza ignorando la parte residua. Rilevare valori anomali in base al rilevamento outlier solo sulla parte residua. Altri dettagli sono disponibili nel capitolo Scomposizione time series.

Esempio

Stagionalità settimanale

Nell'esempio seguente viene generata una serie con stagionalità settimanale e senza tendenza, quindi si aggiungono alcuni outlier. series_decompose rileva e rileva automaticamente la stagionalità e genera una linea di base quasi identica al componente stagionale. Gli outlier aggiunti possono essere chiaramente visualizzati nel componente dei residui.

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  

La serie scompone 1.

Stagionalità settimanale con tendenza

In questo esempio viene aggiunta una tendenza alla serie dell'esempio precedente. Prima di tutto, viene eseguito series_decompose con i parametri predefiniti. Il valore predefinito della tendenza avg accetta solo la media e non calcola la tendenza. La baseline generata non contiene la tendenza. Quando si osserva la tendenza nei residui, risulta evidente che questo esempio è meno accurato rispetto all'esempio precedente.

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  

La serie scompone 2.

Successivamente, viene rieseguito lo stesso esempio. Poiché si prevede una tendenza nella serie, si specifica linefit nel parametro di tendenza. È possibile notare che viene rilevata la tendenza positiva e che la linea di base è molto più vicina alla serie di input. I residui sono vicini a zero e solo gli outlier si distinguono. È possibile visualizzare tutti i componenti della serie nel grafico.

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  

La serie scompone 3.