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