0 / 0
Torna alla versione inglese della documentazione

Sistema di riferimento temporale

Ultimo aggiornamento: 04 ott 2024
Sistema di riferimento temporale

Il sistema di riferimento temporale (TRS) è un sistema locale, regionale o globale utilizzato per identificare il tempo.

Un sistema di riferimento temporale definisce una proiezione specifica per la mappatura in avanti e inversa tra una registrazione data / ora e la sua rappresentazione numerica. Un esempio comune che la maggior parte degli utenti conosce è il tempo UTC, che assota una data / ora, ad esempio, (1 gen 2019, 12 di mezzanotte (GMT) in un valore intero di 64 - bit (1546300800000), che cattura il numero di millisecondi trascorsi dal 1 gen 1970, 12 di mezzanotte (GMT). Generalmente il valore della registrazione data / ora è più adatto alla leggibilità umana, mentre la rappresentazione numerica è più adatta per la lavorazione della macchina.

Nella libreria di serie temporali, una serie temporale può essere associata a un TRS. Un TRS è composto da un:

  • Time tick che cattura la granularità del tempo, ad esempio 1 minute
  • Tempo di data con zonatura che cattura un'ora di inizio, ad esempio 1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT). Una registrazione data / ora viene mappata in una rappresentazione numerica calcolando il numero di tic temporali trascorsi dall'ora di inizio. Una rappresentazione numerica viene scalata dalla granularità e spostata dall'ora di inizio quando viene mappata di nuovo in una data / ora.

Da notare che questa proiezione in avanti + inversa potrebbe portare alla perdita di tempo. Ad esempio, se la granularità in tempo reale di una serie temporale è in secondi, poi l'inoltro e la corrispondenza inversa dei timbri del tempo 09:00:01 e 09:00:02 (da leggere come hh:mm:ss) ad una granularità di un minuto risulterebbero rispettivamente nei francobolli 09:00:00 e 09:00:00 . In questo esempio, una serie temporale, la cui granularità è in secondi, viene mappata a minuti e quindi la corrispondenza inversa allunga le informazioni. Tuttavia, se la granularità mappata è superiore alla granularità della serie temporali di input (più precisamente, se la granularità della serie temporale è un multiplo integrale della granularità mappata) allora la proiezione in avanti + inversa è garantita lossless. Ad esempio, mappare una serie temporale, la cui granularità è in minuti, a secondi e invertire la proiezione a minuti provocherebbe una ricostruzione lossless delle timbri.

Impostazione di TRS

Quando viene creata una serie temporale, è associata a un TRS (o Nessuno se non viene specificato alcun TRS). Se il TRS è Nessuno, allora i valori numerici non possono essere mappati a timbri. Si noti che TRS può essere impostato solo su una serie temporale in fase di costruzione. Il motivo è che una serie temporale dal design è un oggetto immutabile. L'immutabilità arriva in handy quando la libreria viene utilizzata in ambienti multi - thread o in ambienti di calcolo distribuito come Apache Spark. Mentre un TRS può essere impostato solo in fase di costruzione, può essere modificato utilizzando il metodo with_trs come descritto nella sezione successiva. with_trs produce una nuova serie temporale e quindi non ha alcun impatto sull'immutabilità.

Consideriamo una semplice serie temporale creata da un elenco in memoria:

values = [1.0, 2.0, 4.0]
x = tspy.time_series(values)
x

Questa restituisce:

TimeStamp: 0     Value: 1.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0

In fase di costruzione, la serie temporale può essere associata a un TRS. Associare un TRS con una serie temporale consente alle sue timbri numeriche di essere come per il tempo tick e offset/timezone. Il seguente esempio mostra 1 minute and 1 Jan 2019, 12 midnight (GMT):

zdt = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
x_trs = tspy.time_series(data, granularity=datetime.timedelta(minutes=1), start_time=zdt)
x_trs

Questa restituisce:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

Ecco un altro esempio in cui i timbri numerici vengono reinterpretati con un time tick di un'ora e offset / timezone come 1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT).

tz_edt = datetime.timezone.edt
zdt = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=tz_edt)
x_trs = tspy.time_series(data, granularity=datetime.timedelta(hours=1), start_time=zdt)
x_trs

Questa restituisce:

TimeStamp: 2019-01-01T00:00-04:00     Value: 1.0
TimeStamp: 2019-01-01T00:01-04:00     Value: 2.0
TimeStamp: 2019-01-01T00:02-04:00     Value: 4.0

Si noti che i timestamp indicano ora uno scostamento di -4 ore dal GMT (fuso orario EDT) e catturano il tick di un'ora. Anche notare che l'impostazione di un TRS NON modifica i timbri numerici - specifica solo un modo di interpretare i timbri numerici.

x_trs.print(human_readable=False)

Questa restituisce:

TimeStamp: 0     Value: 1.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0

Modifica di TRS

È possibile modificare la TRS associata ad una serie temporale utilizzando la funzione with_trs . Si tenga presente che questa funzione butta un'eccezione se la serie temporale di input non è associata a un TRS (se TRS è Nessuno). L'utilizzo di with_trs modifica i timbri numerici.

Il seguente esempio di codice mostra TRS impostato a tempo di contrattazione senza utilizzare with_trs:

# 1546300800 is the epoch time in seconds for 1 Jan 2019, 12 midnight GMT
zdt1 = datetime.datetime(1970,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
y = tspy.observations.of(tspy.observation(1546300800, 1.0),tspy.observation(1546300860, 2.0), tspy.observation(1546300920,
    4.0)).to_time_series(granularity=datetime.timedelta(seconds=1), start_time=zdt1)
y.print()
y.print(human_readable=False)

Questa restituisce:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# TRS has been set during construction time - no changes to numeric timestamps
TimeStamp: 1546300800     Value: 1.0
TimeStamp: 1546300860     Value: 2.0
TimeStamp: 1546300920     Value: 4.0

Il seguente esempio mostra come applicare with_trs per cambiare granularity a un minuto e conservare l'offset del tempo originale (1 gen 1970, 12 mezzanotte GMT):

y_minutely_1970 = y.with_trs(granularity=datetime.timedelta(minutes=1), start_time=zdt1)
y_minutely_1970.print()
y_minutely_1970.print(human_readable=False)

Questa restituisce:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# numeric timestamps have changed to number of elapsed minutes since 1 Jan 1970, 12 midnight GMT
TimeStamp: 25771680     Value: 1.0
TimeStamp: 25771681     Value: 2.0
TimeStamp: 25771682     Value: 4.0

Ora applicare with_trs per cambiare granularity a un minuto e lo scostamento al 1 gen 2019, 12 mezzanotte GMT:

zdt2 = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
y_minutely = y.with_trs(granularity=datetime.timedelta(minutes=1), start_time=zdt2)
y_minutely.print()
y_minutely.print(human_readable=False)

Questa restituisce:

TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# numeric timestamps are now minutes elapsed since 1 Jan 2019, 12 midnight GMT
TimeStamp: 0     Value: 1.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0

Per capire meglio come impatta la post elaborazione, analizziamo quanto segue. Si noti che materialize su timbri numerici opera sui timbri numerici sottostanti associati alla serie temporale.

print(y.materialize(0,2))
print(y_minutely_1970.materialize(0,2))
print(y_minutely.materialize(0,2))

Questa restituisce:

# numeric timestamps in y are in the range 1546300800, 1546300920 and thus y.materialize(0,2) is empty
[]
# numeric timestamps in y_minutely_1970 are in the range 25771680, 25771682 and thus y_minutely_1970.materialize(0,2) is empty
[]
# numeric timestamps in y_minutely are in the range 0, 2
[(0,1.0),(1,2.0),(2,4.0)]

Il metodo materialize può essere applicato anche agli oggetti datetime. Questo risultato in un'eccezione se la serie temporale sottostante non è associata a un TRS (se TRS è Nessuno). Ipotizzando che la serie temporale sottostante abbia un TRS, gli oggetti datetime sono mappati ad una gamma numerica utilizzando la TRS.

# Jan 1 2019, 12 midnight GMT
dt_beg = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc)
# Jan 1 2019, 12:02 AM GMT
dt_end = datetime.datetime(2019,1,1,0,2,0,0,tzinfo=datetime.timezone.utc)

print(y.materialize(dt_beg, dt_end))
print(y_minutely_1970.materialize(dt_beg, dt_end))
print(y_minutely.materialize(dt_beg, dt_end))

# materialize on y in UTC millis
[(1546300800,1.0),(1546300860,2.0), (1546300920,4.0)]
# materialize on y_minutely_1970 in UTC minutes
[(25771680,1.0),(25771681,2.0),(25771682,4.0)]
# materialize on y_minutely in minutes offset by 1 Jan 2019, 12 midnight
[(0,1.0),(1,2.0),(2,4.0)]

Timestamp duplicati

La modifica del TRS può comportare timbri duplicati. Il seguente esempio modifica la granularità a un'ora che determina timbri duplicati. La libreria di serie temporali gestisce timestamp duplicati senza posa e fornisce combinatori di convenienza per ridurre i valori associati con timbri duplicati in un unico valore, ad esempio calcolando una media dei valori raggruppati per timbri duplicati.

y_hourly = y_minutely.with_trs(granularity=datetime.timedelta(hours=1), start_time=zdt2)
print(y_minutely)
print(y_minutely.materialize(0,2))

print(y_hourly)
print(y_hourly.materialize(0,0))

Questa restituisce:

# y_minutely - minutely time series
TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:01Z     Value: 2.0
TimeStamp: 2019-01-01T00:02Z     Value: 4.0

# y_minutely has numeric timestamps 0, 1 and 2
[(0,1.0),(1,2.0),(2,4.0)]

# y_hourly - hourly time series has duplicate timestamps
TimeStamp: 2019-01-01T00:00Z     Value: 1.0
TimeStamp: 2019-01-01T00:00Z     Value: 2.0
TimeStamp: 2019-01-01T00:00Z     Value: 4.0

# y_hourly has numeric timestamps of all 0
[(0,1.0),(0,2.0),(0,4.0)]

I timbri duplicati possono essere facoltativamente combinati come segue:

y_hourly_averaged = y_hourly.transform(transformers.combine_duplicate_granularity(lambda x: sum(x)/len(x))
print(y_hourly_averaged.materialize(0,0))

Questa restituisce:

# values corresponding to the duplicate numeric timestamp 0 have been combined using average
# average = (1+2+4)/3 = 2.33
[(0,2.33)]

Ulteriori informazioni

Per utilizzare l'SDK tspy Python , consultare la documentazione di tspy Python SDK.

Argomento principale Analisi di serie temporali