Translation not up to date
System odniesienia czasu (Time reference system-TRS) jest systemem lokalnym, regionalnym lub globalnym używanym do identyfikacji czasu.
System odniesienia czasu definiuje konkretną projekcję na potrzeby przekazywania i odwrotnego odwzorowania między znacznikiem czasu i jego reprezentacją numeryczną. Powszechnym przykładem, że większość użytkowników zna czas UTC, który odwzorowuje znacznik czasu, na przykład (1 sty 2019, 12 północy (GMT) na 64-bitową liczbę całkowitą (1546300800000), która przechwytuje liczbę milisekund, które upłynęły od 1 stycznia 1970 roku, 12 północy (GMT). Ogólnie rzecz biorąc, wartość znacznika czasu jest lepiej dopasowana do ludzkiej czytelności, podczas gdy reprezentacja liczbowa jest lepiej dopasowana do przetwarzania maszyn.
W bibliotece szeregów czasowych szeregi czasowe mogą być powiązane z TRS. System TRS składa się z:
- Znacznik czasu, który przechwytuje granulację czasu, na przykład 1 minuta
- Nieupakowany czas, który przechwytuje czas rozpoczęcia, na przykład
1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT)
. Znacznik czasu jest odwzorowywany na reprezentację liczbową, obliczając liczbę znaczników czasu, które upłynęły od czasu rozpoczęcia. Reprezentacja numeryczna jest skalowana przez granulację i przesunięta o czas rozpoczęcia, gdy jest ona odwzorowana z powrotem na znacznik czasu.
Należy zauważyć, że ta perspektywiczny + odwrócony projekcja może doprowadzić do utraty czasu. For instance, if the true time granularity of a time series is in seconds, then forward and reverse mapping of the time stamps 09:00:01
and 09:00:02
(to be read as hh:mm:ss
) to a granularity of one minute would result in the time stamps 09:00:00
and 09:00:00
respectively. W tym przykładzie seria czasowa, której granulacja jest podana w sekundach, jest odwzorowywana na minuty, a tym samym odwzorowanie odwrotne loże informacje. Jeśli jednak odwzorowana granulacja jest wyższa niż granulacja szeregów czasowych wejściowych (dokładniej, jeśli granulacja szeregów czasowych jest wielokrotnością odwzorowanej granulacji), to perspektywiczny + odwrócona projekcja jest gwarantowana jako bezstratna. Na przykład odwzorowanie szeregów czasowych, których granulacja jest w minutach, na sekundy i odwrócenie ich do minut, spowodowałoby bezstratną rekonstrukację datowników.
Ustawianie TRS
Kiedy tworzona jest seria czasowa, jest ona powiązana z TRS (lub None, jeśli nie określono TRS). Jeśli TRS ma wartość Brak, wartości liczbowe nie mogą być odwzorowywane na znaczniki czasu. Należy pamiętać, że TRS może być ustawiony tylko w szeregach czasowych w czasie budowy. Powodem jest to, że seria czasowa według projektu jest niezmiennym obiektem. Niezmienność jest przydatna, gdy biblioteka jest używana w środowiskach wielowątkowych lub w rozproszonych środowiskach obliczeniowych, takich jak Apache Spark. Zestaw TRS można ustawić tylko w czasie budowy, ale można go zmienić za pomocą metody with_trs
zgodnie z opisem w następnej sekcji. Produkt with_trs
tworzy nowy szereg czasowy i tym samym nie ma wpływu na niezmienność.
Zastanówmy się nad prostym szeregiem czasowym stworzonym z listy in-memory:
values = [1.0, 2.0, 4.0]
x = tspy.time_series(values)
x
Zwracane są następujące dane:
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
W czasie budowy szeregi czasowe mogą być powiązane z TRS. Powiązanie TRS z szeregami czasowymi pozwala na to, aby jego liczbowe znaczniki czasu były takie jak znacznik czasu i przesunięcia/strefa czasowa. W poniższym przykładzie przedstawiono 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
Zwracane są następujące dane:
TimeStamp: 2019-01-01T00:00Z Value: 1.0
TimeStamp: 2019-01-01T00:01Z Value: 2.0
TimeStamp: 2019-01-01T00:02Z Value: 4.0
Oto kolejny przykład, w którym liczbowe datowniki są reinterpretowane z czasem o jedną godzinę, a przesunięcie/strefę czasową jako 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
Zwracane są następujące dane:
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
Należy zauważyć, że datowniki wskazują teraz przesunięcie -4 godzin od czasu GMT (strefa czasowa EDT) i przechwytuje znacznik czasu o jednej godzinie. Należy również zauważyć, że ustawienie parametru TRS NIE zmienia datowników liczbowych-określa tylko sposób interpretowania liczbowych datowników.
x_trs.print(human_readable=False)
Zwracane są następujące dane:
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
Zmiana TRS
Istnieje możliwość zmiany TRS powiązanego z serią czasową za pomocą funkcji with_trs
. Należy zauważyć, że ta funkcja zgłosi wyjątek, jeśli wejściowa seria czasowa nie jest powiązana z TRS (jeśli TRS ma wartość Brak). Użycie produktu with_trs
powoduje zmianę liczbowych datowników.
Poniższy przykładowy kod przedstawia zestaw TRS ustawiony w czasie rywalizacji bez użycia produktu 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)
Zwracane są następujące dane:
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
W poniższym przykładzie przedstawiono sposób zastosowania produktu with_trs
w celu zmiany granularity
na jedną minutę i zachowania oryginalnego przesunięcia czasu (1 sty 1970, 12 północy 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)
Zwracane są następujące dane:
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
Teraz zastosuj with_trs
, aby zmienić granularity
na jedną minutę, a przesunięcie na 1 sty 2019, 12 północy 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)
Zwracane są następujące dane:
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
Aby lepiej zrozumieć, w jaki sposób wpływa ono na przetwarzanie końcowe, przeanalizujmy poniższe informacje. Należy zwrócić uwagę, że materialize
na liczbowym znacznikach czasu działa na bazowych znacznikach liczbowych powiązanych z serią czasową.
print(y.materialize(0,2))
print(y_minutely_1970.materialize(0,2))
print(y_minutely.materialize(0,2))
Zwracane są następujące dane:
# 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)]
Metoda materialize
może być również stosowana do obiektów typu data i godzina. Powoduje to wystąpienie wyjątku, jeśli bazowy szereg czasowy nie jest powiązany z TRS (jeśli TRS ma wartość Brak). Zakładając, że bazowy szereg czasowy ma TRS, obiekty typu data i godzina są odwzorowywane na zakres liczbowy przy użyciu 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)]
Duplikuj znaczniki czasu
Zmiana TRS może spowodować zduplikowanie datowników. W poniższym przykładzie można zmienić granulację na jedną godzinę, co powoduje zduplikowanie datowników. Biblioteka szeregów czasowych umożliwia bezproblemowe duplikowanie znaczników czasu i zapewnia wygodę kombinatorów w celu zredukowania wartości powiązanych ze zduplikowanymi znacznikami czasu do jednej wartości, na przykład przez obliczenie średniej wartości pogrupowanych przez zduplikowane znaczniki czasu.
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))
Zwracane są następujące dane:
# 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)]
Podwójne znaczniki czasu mogą być opcjonalnie łączone w następujący sposób:
y_hourly_averaged = y_hourly.transform(transformers.combine_duplicate_granularity(lambda x: sum(x)/len(x))
print(y_hourly_averaged.materialize(0,0))
Zwracane są następujące dane:
# values corresponding to the duplicate numeric timestamp 0 have been combined using average
# average = (1+2+4)/3 = 2.33
[(0,2.33)]
Więcej inform.
Aby użyć pakietu tspy
Python SDK, należy zapoznać się z dokumentacją pakietu tspy
Python SDK.
Temat nadrzędny: Analiza szeregów czasowych