시간 참조 시스템
시간 기준 시스템(TRS)은 시간을 식별하는 데 사용되는 로컬, 지역 또는 글로벌 시스템입니다.
시간 기준 시스템은 시간소인과 그의 숫자 표시 사이의 정방향 및 역방향 맵핑에 대한 특정 정사영을 정의합니다. 대부분의 사용자가 친숙한 공통적인 예는 UTC 시간으로, 예를 들어 시간 소인(2019년 1월 1일 12시 자정(GMT)을 64비트 정수 값(1546300800000)에 맵핑하며 값 1546300800000은 1970년 1월 1일 12시 자정(GMT) 이후에 경과한 밀리초 수를 캡처합니다. 일반적으로 시간소안 값이 사람이 읽기엔 더 적합한 반면, 숫자 표시는 기계 처리에 더 적합합니다.
시계열 라이브러리에서는 시계열을 TRS와 연관시킬 수 있습니다. TRS는 다음으로 구성됩니다.
- 시간 단위(예: 1분)를 캡처하는 시간 눈금
- 시작 시간을 캡처하는 구역화된 날짜 시간입니다(예:
1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT)
). 시간소인은 시작 시간 이후의 경과된 시간 눈금의 수를 계산하여 숫자 표시에 맵핑됩니다. 숫자 표시는 세분성에 의해 스케일되며 시간소인으로 다시 맵핑될 때 시작 시간에 의해 이동됩니다.
이 정방향 + 역방향 정사영이 시간 유실로 이어질 수 있음을 유의하십시오. 예를 들어, 시계열의 실제 시간 단위가 초 단위인 경우 시간소인 09:00:01
및 09:00:02
( hh:mm:ss
로 읽혀짐) 을 1분단위로 맵핑하면 시간소인이 각각 09:00:00
및 09:00:00
가 됩니다. 이 예에서 그의 단위가 초인 시계열이 분에 맵핑되고 있으므로, 역방향 맵핑은 정보를 유실합니다. 그러나 맵핑된 단위가 입력 시계열의 단위보다 더 높은 경우(특히 시계열 단위가
맵핑된 단위의 정수배인 경우) 정방향 + 역방향 정사영은 유실이 없습니다. 예를 들어, 단위가 분인 시계열을 초에 맵핑하고 다시 분으로 역방향 투영하면 시간소인의 무손실 재구성이 됩니다.
TRS 설정
시계열이 작성될 때 TRS에(또는 지정된 TRS가 없으면 None에) 연관됩니다. TRS가 None인 경우 숫자 값을 시간소인에 맵핑할 수 없습니다. TRS는 구성 시에 시계열에서만 설정될 수 있음을 유의하십시오. 그 이유는
디자인별 시계열이 불변 오브젝트라는 것입니다. 불변성은 라이브러리가 멀티스레드 환경이나 Apache Spark 같은 분산 컴퓨팅 환경에서 사용될 때 도움이 됩니다. TRS가 구성 시에만 설정할 수 있는 반면, 다음 절에서 설명하는 것처럼
with_trs
메소드를 사용하여 변경할 수 있습니다. with_trs
는 새 시계열을 생성하므로 불변성에 영향을 주지 않습니다.
인메모리 목록으로부터 작성되는 간단한 시계열을 고려하십시오.
values = [1.0, 2.0, 4.0]
x = tspy.time_series(values)
x
다음이 리턴됩니다.
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
구성 시에 시계열이 TRS와 연관될 수 있습니다. TRS를 시계열과 연관시키면 숫자 시간소인이 시간 눈금 및 오프셋/시간대별일 수 있습니다. 다음 예제는 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
다음이 리턴됩니다.
TimeStamp: 2019-01-01T00:00Z Value: 1.0
TimeStamp: 2019-01-01T00:01Z Value: 2.0
TimeStamp: 2019-01-01T00:02Z Value: 4.0
다음은 숫자 시간소인이 한 시간이라는 시간 틱 및 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
다음이 리턴됩니다.
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
시간소인이 이제 GMT로부터 -4 시간의 오프셋(EDT 시간대)을 나타내며 1시간의 시간 눈금을 캡처함을 주의하십시오. 또한 TRS를 설정하는 것이 숫자 시간소인을 변경하지 않음을 주의하십시오. 단지 숫자 시간소인을 해석하는 방법을 지정합니다.
x_trs.print(human_readable=False)
다음이 리턴됩니다.
TimeStamp: 0 Value: 1.0
TimeStamp: 1 Value: 2.0
TimeStamp: 2 Value: 4.0
TRS 변경
with_trs
함수를 사용하여 시계열과 연관된 TRS를 변경할 수 있습니다. 이 함수는 입력 시계열이 TRS와 연관되지 않는 경우(TRS가 None인 경우) 예외가 발생함을 유의하십시오. with_trs
을(를) 사용하면 숫자 시간소인이 변경됩니다.
다음 코드 샘플은 with_trs
을(를) 사용하지 않고 구성 시에 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)
다음이 리턴됩니다.
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
다음 예제는 with_trs
를 적용하여 granularity
을 1분으로 변경하고 원래 시간 오프셋(1 Jan 1970, 12 midnight 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)
다음이 리턴됩니다.
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
이제 with_trs
를 적용하여 granularity
을 1분으로 변경하고 오프셋을 1 Jan 2019, 12 midnight 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)
다음이 리턴됩니다.
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
사후 처리에 미치는 영향을 더 깊이 이해하려면 다음을 검토하십시오. 숫자 시간소인의 materialize
은(는) 시계열과 연관된 기본 숫자 시간소인에서 작동됩니다.
print(y.materialize(0,2))
print(y_minutely_1970.materialize(0,2))
print(y_minutely.materialize(0,2))
다음이 리턴됩니다.
# 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)]
materialize
메소드도 날짜 시간 오브젝트에 적용할 수 있습니다. 그러면 기본 시계열이 TRS와 연관되지 않는 경우(TRS가 None인 경우) 예외가 발생합니다. 기본 시계열이 TRS를 갖고 있다고 가정하면
datetime 오브젝트가 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)]
중복된 시간소인
TRS를 변경하면 시간소인이 중복될 수 있습니다. 다음 예에서는 단위를 1시간으로 변경하여 시간소인이 중복됩니다. 시계열 라이브러리가 중복 시간소인을 끊김 없이 처리하며, 예를 들어 중복 시간소인으로 그룹화된 값의 평균을 계산하여 중복 시간소인과 연관된 값을 단일 값으로 줄이는 편리한 결합기를 제공합니다.
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))
다음이 리턴됩니다.
# 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)]
중복 시간소인은 선택적으로 다음과 같이 결합될 수 있습니다.
y_hourly_averaged = y_hourly.transform(transformers.combine_duplicate_granularity(lambda x: sum(x)/len(x))
print(y_hourly_averaged.materialize(0,0))
다음이 리턴됩니다.
# values corresponding to the duplicate numeric timestamp 0 have been combined using average
# average = (1+2+4)/3 = 2.33
[(0,2.33)]
자세히 알아보기
tspy
Python SDK를 사용하려면 tspy
Python SDK 문서를 참조하십시오.
상위 주제: 시계열 분석