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
(utilizzandofrom 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