0 / 0
Torna alla versione inglese della documentazione

Funzioni di serie temporali

Ultimo aggiornamento: 21 nov 2024
Funzioni di serie temporali

Le funzioni di serie temporali sono funzioni aggregate che operano su sequenze di valori di dati misurati in punti temporali.

Le seguenti sezioni descrivono alcune delle funzioni delle serie temporali disponibili in diversi pacchetti di serie temporali.

Trasformazioni

Le trasformazioni sono funzioni applicate a una serie temporale che risultano in un'altra serie temporale. La libreria delle serie temporali supporta vari tipi di trasformazioni, incluse le trasformazioni fornite (utilizzando from tspy.functions import transformers) e le trasformazioni definite dall'utente.

Il seguente esempio mostra alcune trasformazioni fornite:

#Interpolation
>>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
>>> periodicity = 2
>>> interp = interpolators.nearest(0.0)
>>> interp_ts = ts.resample(periodicity, interp)
>>> interp_ts.print()
TimeStamp: 0     Value: 1.0
TimeStamp: 2     Value: 3.0
TimeStamp: 4     Value: 5.0

#Fillna
>>> shift_ts = ts.shift(2)
    print("shifted ts to add nulls")
    print(shift_ts)
    print("\nfilled ts to make nulls 0s")
    null_filled_ts = shift_ts.fillna(interpolators.fill(0.0))
    print(null_filled_ts)

shifted ts to add nulls
TimeStamp: 0     Value: null
TimeStamp: 1     Value: null
TimeStamp: 2     Value: 1.0
TimeStamp: 3     Value: 2.0
TimeStamp: 4     Value: 3.0
TimeStamp: 5     Value: 4.0

filled ts to make nulls 0s
TimeStamp: 0     Value: 0.0
TimeStamp: 1     Value: 0.0
TimeStamp: 2     Value: 1.0
TimeStamp: 3     Value: 2.0
TimeStamp: 4     Value: 3.0
TimeStamp: 5     Value: 4.0

# Additive White Gaussian Noise (AWGN)
>>> noise_ts = ts.transform(transformers.awgn(mean=0.0,sd=.03))
>>> print(noise_ts)
TimeStamp: 0     Value: 0.9962378841388397
TimeStamp: 1     Value: 1.9681980879378596
TimeStamp: 2     Value: 3.0289374962174405
TimeStamp: 3     Value: 3.990728648807705
TimeStamp: 4     Value: 4.935338359740761

TimeStamp: 5     Value: 6.03395072999318

Segmentazione

La segmentazione o windowing è il processo di suddivisione di una serie temporale in più segmenti. La libreria delle serie temporali supporta varie forme di segmentazione e consente di creare anche segmenti definiti dall'utente.

  • Segmentazione basata su finestre

    Questo tipo di segmentazione di una serie temporale si basa su dimensioni di segmento specificate dall'utente. I segmenti possono essere basati su record o basati sull'ora. Ci sono opzioni che consentono di creare tumbling e segmenti basati su finestre scorrevoli.

    >>> import tspy
    >>> ts_orig = tspy.builder()
      .add(tspy.observation(1,1.0))
      .add(tspy.observation(2,2.0))
      .add(tspy.observation(6,6.0))
      .result().to_time_series()
    >>> ts_orig
    timestamp: 1     Value: 1.0
    timestamp: 2     Value: 2.0
    timestamp: 6     Value: 6.0
    
    >>> ts = ts_orig.segment_by_time(3,1)
    >>> ts
    timestamp: 1     Value: original bounds: (1,3) actual bounds: (1,2) observations: [(1,1.0),(2,2.0)]
    timestamp: 2     Value: original bounds: (2,4) actual bounds: (2,2) observations: [(2,2.0)]
    timestamp: 3     Value: this segment is empty
    timestamp: 4     Value: original bounds: (4,6) actual bounds: (6,6) observations: [(6,6.0)]
    
  • Segmentazione basata sull'ancoraggio

    La segmentazione basata sull'ancoraggio è un tipo molto importante di segmentazione che crea un segmento ancorando su un lambda specifico, che può essere un valore semplice. Un esempio è rappresentato dagli eventi che hanno preceduto un errore 500 o dall'esame dei valori dopo l'osservazione di un'anomalia. Le varianti della segmentazione basata sull'ancoraggio includono la fornitura di un intervallo con più indicatori.

    >>> import tspy
    >>> ts_orig = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0])
    >>> ts_orig
    timestamp: 0     Value: 1.0
    timestamp: 1     Value: 2.0
    timestamp: 2     Value: 3.0
    timestamp: 3     Value: 4.0
    timestamp: 4     Value: 5.0
    
    >>> ts = ts_orig.segment_by_anchor(lambda x: x % 2 == 0, 1, 2)
    >>> ts
    timestamp: 1     Value: original bounds: (0,3) actual bounds: (0,3) observations: [(0,1.0),(1,2.0),(2,3.0),(3,4.0)]
    timestamp: 3     Value: original bounds: (2,5) actual bounds: (2,4) observations: [(2,3.0),(3,4.0),(4,5.0)]
    
  • Segmentatori

    Esistono diversi segmentatori specializzati forniti pronti all'uso importando il pacchetto segmenters (utilizzando from tspy.functions import segmenters). Un esempio di segmentatore è quello che utilizza la regressione per segmentare una serie temporale:

    >>> ts = tspy.time_series([1.0,2.0,3.0,4.0,5.0,2.0,1.0,-1.0,50.0,53.0,56.0])
    >>> max_error = .5
    >>> skip = 1
    >>> reg_sts = ts.to_segments(segmenters.regression(max_error,skip,use_relative=True))
    >>> reg_sts
    
    timestamp: 0     Value:   range: (0, 4)   outliers: {}
    timestamp: 5     Value:   range: (5, 7)   outliers: {}
    timestamp: 8     Value:   range: (8, 10)   outliers: {}
    

Riduttori

Un reducer è una funzione che viene applicata ai valori in una serie di serie temporali per produrre un singolo valore. Le funzioni delle serie temporali reducer sono simili al concetto di riduttore utilizzato da Hadoop/Spark. Questo singolo valore può essere una raccolta, ma più in generale è un singolo oggetto. Un esempio di funzione reducer è la media dei valori in una serie temporale.

Sono supportate diverse funzioni reducer , tra cui:

  • Riduttori di distanza

    I riduttori di distanza sono una classe di riduttori che calcolano la distanza tra due serie temporali. La libreria supporta funzioni di distanza numeriche e categoriali sulle sequenze. Questi includono misurazioni della distanza di deformazione temporale come Itakura Parallelogram, Sakoe - Chiba Band, DTW non vincolati e DTW non vincolati. Sono disponibili anche le distanze di distribuzione come la distanza ungherese e la distanza Terra - Mover.

    Per le misurazioni della distanza delle serie temporali categoriali, è possibile utilizzare le misure della distanza Damerau Levenshtein e Jaro-Winkler.

    >>> from tspy.functions import *
    >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
    >>> ts2 = ts.transform(transformers.awgn(sd=.3))
    >>> dtw_distance = ts.reduce(ts2,reducers.dtw(lambda obs1, obs2: abs(obs1.value - obs2.value)))
    >>> print(dtw_distance)
    1.8557981638880405
    
  • Riduttori matematici

    Sono forniti diversi pratici riduttori matematici per serie temporali numeriche. Questi includono quelli di base come media, somma, deviazione standard e momenti. Entropia, curtosi, FFT e varianti di esso, varie correlazioni e istogramma sono inclusi. Un utile riduttore di riepilogo di base è la funzione di describe che fornisce informazioni di base sulle serie temporali.

    >>> from tspy.functions import *
    >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
    >>> ts2 = ts.transform(transformers.awgn(sd=.3))
    >>> corr = ts.reduce(ts2, reducers.correlation())
    >>> print(corr)
    0.9938941942380525
    
    >>> adf = ts.reduce(reducers.adf())
    >>> print(adf)
    pValue: -3.45
    satisfies test: false
    
    >>> ts2 = ts.transform(transformers.awgn(sd=.3))
    >>> granger = ts.reduce(ts2, reducers.granger(1))
    >>> print(granger) #f_stat, p_value, R2
    -1.7123613937876463,-3.874412217575385,1.0
    
  • Un altro riduttore di base che è molto utile per ottenere una comprensione di primo ordine delle serie temporali è il riduttore di descrizione. Quanto segue illustra questo riduttore:

    >>> desc = ts.describe()
    >>> print(desc)
    min inter-arrival-time: 1
    max inter-arrival-time: 1
    mean inter-arrival-time: 1.0
    top: null
    unique: 6
    frequency: 1
    first: TimeStamp: 0     Value: 1.0
    last: TimeStamp: 5     Value: 6.0
    count: 6
    mean:3.5
    std:1.707825127659933
    min:1.0
    max:6.0
    25%:1.75
    50%:3.5
    75%:5.25
    

Unioni temporali

La libreria include funzioni per unioni temporali o serie temporali di unione in base alla data / ora. Le funzioni di unione sono simili a quelle presenti in un database, incluse le unioni sinistra, destra, esterna, interna, sinistra, esterna destra e così via. I seguenti codici di esempio mostrano alcune di queste funzioni di unione:

# Create a collection of observations (materialized TimeSeries)
observations_left = tspy.observations(tspy.observation(1, 0.0), tspy.observation(3, 1.0), tspy.observation(8, 3.0), tspy.observation(9, 2.5))
observations_right = tspy.observations(tspy.observation(2, 2.0), tspy.observation(3, 1.5), tspy.observation(7, 4.0), tspy.observation(9, 5.5), tspy.observation(10, 4.5))

# Build TimeSeries from Observations
ts_left = observations_left.to_time_series()
ts_right = observations_right.to_time_series()

# Perform full join
ts_full = ts_left.full_join(ts_right)
print(ts_full)

TimeStamp: 1     Value: [0.0, null]
TimeStamp: 2     Value: [null, 2.0]
TimeStamp: 3     Value: [1.0, 1.5]
TimeStamp: 7     Value: [null, 4.0]
TimeStamp: 8     Value: [3.0, null]
TimeStamp: 9     Value: [2.5, 5.5]
TimeStamp: 10     Value: [null, 4.5]

# Perform left align with interpolation
ts_left_aligned, ts_right_aligned = ts_left.left_align(ts_right, interpolators.nearest(0.0))

print("left ts result")
print(ts_left_aligned)
print("right ts result")
print(ts_right_aligned)

left ts result
TimeStamp: 1     Value: 0.0
TimeStamp: 3     Value: 1.0
TimeStamp: 8     Value: 3.0
TimeStamp: 9     Value: 2.5
right ts result
TimeStamp: 1     Value: 0.0
TimeStamp: 3     Value: 1.5
TimeStamp: 8     Value: 4.0
TimeStamp: 9     Value: 5.5

Previsione

Una funzionalità chiave fornita dalla libreria di serie temporali è la previsione. La libreria include funzioni per modelli di previsione semplici e complessi, inclusi ARIMA, Exponential, Holt - Winters e BATS. Il seguente esempio mostra la funzione per creare un Holt - Winters:

import random

model = tspy.forecasters.hws(samples_per_season=samples_per_season, initial_training_seasons=initial_training_seasons)

for i in range(100):
    timestamp = i
    value = random.randint(1,10) * 1.0
    model.update_model(timestamp, value)

print(model)

Forecasting Model
  Algorithm: HWSAdditive=5 (aLevel=0.001, bSlope=0.001, gSeas=0.001) level=6.087789839896166, slope=0.018901997884893912, seasonal(amp,per,avg)=(1.411203455586738,5, 0,-0.0037471500727535465)

#Is model init-ed
if model.is_initialized():
    print(model.forecast_at(120))

6.334135728495107

ts = tspy.time_series([float(i) for i in range(10)])

print(ts)

TimeStamp: 0     Value: 0.0
TimeStamp: 1     Value: 1.0
TimeStamp: 2     Value: 2.0
TimeStamp: 3     Value: 3.0
TimeStamp: 4     Value: 4.0
TimeStamp: 5     Value: 5.0
TimeStamp: 6     Value: 6.0
TimeStamp: 7     Value: 7.0
TimeStamp: 8     Value: 8.0
TimeStamp: 9     Value: 9.0

num_predictions = 5
model = tspy.forecasters.auto(8)
confidence = .99

predictions = ts.forecast(num_predictions, model, confidence=confidence)

print(predictions.to_time_series())

TimeStamp: 10     Value: {value=10.0, lower_bound=10.0, upper_bound=10.0, error=0.0}
TimeStamp: 11     Value: {value=10.997862810553725, lower_bound=9.934621260488143, upper_bound=12.061104360619307, error=0.41277640121597475}
TimeStamp: 12     Value: {value=11.996821082897318, lower_bound=10.704895525154571, upper_bound=13.288746640640065, error=0.5015571318964149}
TimeStamp: 13     Value: {value=12.995779355240911, lower_bound=11.50957896664928, upper_bound=14.481979743832543, error=0.5769793776877866}
TimeStamp: 14     Value: {value=13.994737627584504, lower_bound=12.33653268707341, upper_bound=15.652942568095598, error=0.6437557559526337}

print(predictions.to_time_series().to_df())

timestamp      value  lower_bound  upper_bound     error
0         10  10.000000    10.000000    10.000000  0.000000
1         11  10.997863     9.934621    12.061104  0.412776
2         12  11.996821    10.704896    13.288747  0.501557
3         13  12.995779    11.509579    14.481980  0.576979
4         14  13.994738    12.336533    15.652943  0.643756

SQL serie temporali

La libreria delle serie temporali è strettamente integrata con Apache Spark. Utilizzando nuovi tipi di dati in Spark Catalyst, è possibile eseguire operazioni SQL di serie temporali che scalano orizzontalmente utilizzando Apache Spark. Ciò consente di utilizzare facilmente le estensioni delle serie temporali in IBM Analytics Engine o in soluzioni che includono le funzionalità di IBM Analytics Engine, come gli ambienti watsonx.ai Studio Spark.

Le estensioni SQL coprono la maggior parte degli aspetti delle funzioni delle serie temporali, inclusi la segmentazione, le trasformazioni, i riduttori, le previsioni e l'I/O. Consultare Analisi dei dati delle serie temporali.

Ulteriori informazioni

Per utilizzare l'SDK tspy Python , vedi la documentazione dell'SDKtspy Python.

Argomento principale Analisi di serie temporali