Translation not up to date
Referenční systém času (TRS) je místní, regionální nebo globální systém sloužící k identifikaci času.
Referenční systém definuje specifickou projekci pro dopředné a převrácené mapování mezi časovým razítkem a jeho číselnou reprezentací. Běžným příkladem je čas, kdy je většina uživatelů obeznámen s časem UTC, který mapuje časové razítko, například (1. ledna 2019, 12 půlnoci (GMT) na 64bitovou celočíselnou hodnotu (1546300800000), která zachytí počet milisekund, které uplynuly od 1. ledna 1970, 12 půlnoci (GMT). Obecně řečeno, hodnota časového razítka se lépe hodí pro přehlednost člověka, zatímco numerické znázornění je vhodnější pro zpracování počítače.
V knihovně časových řad může být časová řada přidružena k TRS. Kanál TRS se skládá z:
- Časová značka, která zachycuje granularitu času, například 1 minuta.
- Zónový čas s datem, který zachycuje čas zahájení, například
1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT)
. Časové razítko je namapováno na numerickou reprezentaci tak, že počítáním počtu uplynulých časových pulzů od času zahájení. Číselná reprezentace je škálována podle granularity a posunuta o čas zahájení, když je namapována zpět na časové razítko.
Všimněte si, že tato dopředná a reverzní projekce může vést ke ztrátě času. Je-li například granularita času posloupnosti časové řady v sekundách, potom dopředné a zpětné mapování časových razítek 09:00:01
a 09:00:02
(pro čtení jako hh:mm:ss
) na granularitu jedné minuty by vedlo k tomu, že časová razítka 09:00:00
a 09:00:00
budou mít za následek zrušení platnosti. V tomto příkladu je časová řada, jejíž granularita se nachází v sekundách, mapována na minuty, a tedy zpětné mapování poskytuje informace o úhoně. Avšak pokud je mapovaná granularita vyšší než granularita vstupní časové řady (konkrétně, je-li granularita časové řady integrální násobkem namapované granularity), pak je zpětné projekci forward + reverzně zaručeno, že bude bezztrátová. Například mapování časové řady, jejíž granularita je v minutách, na sekundy a obrácené promítání na zápis, by vedlo k bezztrátové rekonstrukci časových razítek.
Nastavení TRS
Je-li vytvořena časová řada, je přidružena k TRS (nebo Žádná, pokud není zadán žádný TRS). Je-li TRS žádný, pak číselné hodnoty nelze namapovat na časová razítka. Všimněte si, že TRS může být nastaven pouze na časové řadě v době výstavby. Důvodem je to, že časová řada podle návrhu je neměnný objekt. Immutabilita je užitečná, když se knihovna používá ve vícevláknových prostředích nebo v distribuovaných výpočetních prostředích jako je Apache Spark. Zatímco SNM lze nastavit pouze v době výstavby, lze ji změnit pomocí metody with_trs
popsané v další sekci. Produkt with_trs
vytvoří novou časovou řadu, a tudíž nemá žádný vliv na neměnnost.
Podívejme se na jednoduchou časovou řadu vytvořenou ze seznamu v paměti:
values = [1.0, 2.0, 4.0]
x = tspy.time_series(values)
x
Tato funkce vrací:
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
V době konstrukce může být časová řada přidružena k TRS. Přidružení TRS k časové řadě umožňuje, aby numerická časová razítka byla podle časového pulzu a offse/časového pásma. Následující příklad ukazuje 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
Tato funkce vrací:
TimeStamp: 2019-01-01T00:00Z Value: 1.0
TimeStamp: 2019-01-01T00:01Z Value: 2.0
TimeStamp: 2019-01-01T00:02Z Value: 4.0
Zde je další příklad, kde jsou numerická časová razítka znovu interpretována s časovým pulzem jedné hodiny a offsem/časovým pásmem 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
Tato funkce vrací:
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
Všimněte si, že časová razítka nyní označují posun -4 hodin od GMT (EDT timezone) a zachytí časový interval jedné hodiny. Všimněte si také, že nastavení TRS nemění numerická časová razítka-to pouze určuje způsob interpretace číselných časových razítek.
x_trs.print(human_readable=False)
Tato funkce vrací:
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
Změna TRS
TRS přidruženou k časové řadě můžete změnit pomocí funkce with_trs
. Všimněte si, že tato funkce vygeneruje výjimku, pokud vstupní časová řada není přidružena k TRS (je-li TRS None). Při použití volby with_trs
se změní číselná časová razítka.
Následující ukázka kódu zobrazuje sadu TRS v době, kdy došlo ke kontrukci, bez použití 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)
Tato funkce vrací:
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
Následující příklad ukazuje, jak použít with_trs
ke změně granularity
na jednu minutu a uchování původního časového posunu (1. ledna 1970, 12 o půlnoci 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)
Tato funkce vrací:
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
Nyní použijte with_trs
pro změnu granularity
na jednu minutu a posunutí na 1. leden 2019, 12 o půlnoci 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)
Tato funkce vrací:
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
Chcete-li lépe pochopit, jak to má vliv na zpracování po zpracování, prozkoumejte následující. Všimněte si, že materialize
na číselných časových razítkách pracuje na výchozích číselných časových razítkách přidružených k časové řadě.
print(y.materialize(0,2))
print(y_minutely_1970.materialize(0,2))
print(y_minutely.materialize(0,2))
Tato funkce vrací:
# 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)]
Metodu materialize
lze také použít na objekty s datem a časem. To vede k výjimce, pokud základní časová řada není přidružena k TRS (je-li TRS None). Za předpokladu, že základní časová řada má TRS, jsou objekty data a času mapovány na číselný rozsah pomocí 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)]
Duplicitní časová razítka
Změna TRS může vést k duplicitním časovým razítkům. Následující příklad změní granularitu na jednu hodinu, což vede k duplicitním časovým razítkům. Knihovna časových řad zpracovává duplicitní časová razítka hladkým způsobem a poskytuje výhody kombinacím ke snížení hodnot přidružených k duplicitním časovým razítkům do jediné hodnoty, například výpočtem průměru hodnot seskupených duplicitními časovými razítky.
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))
Tato funkce vrací:
# 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)]
Duplicitní časová razítka lze volitelně kombinovat takto:
y_hourly_averaged = y_hourly.transform(transformers.combine_duplicate_granularity(lambda x: sum(x)/len(x))
print(y_hourly_averaged.materialize(0,0))
Tato funkce vrací:
# values corresponding to the duplicate numeric timestamp 0 have been combined using average
# average = (1+2+4)/3 = 2.33
[(0,2.33)]
Další informace
Chcete-li použít produkt tspy
Python SDK, přečtěte si dokumentaci sady tspy
Python SDK.
Nadřízené téma: Analýza časové řady