시계열 객체 및 컬렉션
시계열 데이터를 저장할 때 전처리, 재구성, 분석을 위한 광범위한 지원 함수를 갖춘 timetable
을 사용하는 것이 좋습니다. 타임테이블을 시작하려면 타임테이블 생성하기 항목을 참조하십시오.
일부 기존 코드는 이 항목에서 설명하는 다음 객체를 사용합니다.
timeseries
— 숫자형 데이터 및 시간 값뿐만 아니라 단위, 이벤트, 데이터 품질, 보간 방법이 포함된 메타데이터 정보도 저장합니다.tscollection
— 공통된 시간 벡터를 공유하는timeseries
객체 모음을 저장하며, 단위가 서로 다른 동기화된 시계열에 대해 간편하게 작업을 수행할 수 있습니다.
timeseries
에 포함된 데이터 샘플
3개의 센서 신호로 구성된 데이터가 있다고 가정해 보겠습니다. 2개의 신호는 객체의 위치(단위: 미터)를 나타내고 세 번째 신호는 객체의 속도(단위: 미터/초)를 나타냅니다. NaN
은 누락된 데이터 값을 나타냅니다.
x = [-0.2 -0.3 13; -0.1 -0.4 15; NaN 2.8 17; 0.5 0.3 NaN; -0.3 -0.1 15];
x
의 처음 2개 열에는 같은 단위의 양이 포함되기 때문에 다변량 timeseries
객체를 생성하여 이 시계열 2개를 저장할 수 있습니다.
ts_pos = timeseries(x(:,1:2),1:5,"name","Position")
timeseries Common Properties: Name: 'Position' Time: [5x1 double] TimeInfo: tsdata.timemetadata Data: [5x2 double] DataInfo: tsdata.datametadata
데이터 샘플은 timeseries
객체의 특정 시간과 연결된 하나 이상의 값으로 구성됩니다. 시계열에 포함된 데이터 샘플 개수는 시간 벡터의 길이(이 예제의 경우 5
)와 같습니다. 데이터 샘플의 크기를 구하려면 getdatasamplesize
를 사용합니다.
getdatasamplesize(ts_pos)
ans = 1×2
1 2
두 번째 timeseries
객체를 생성하여 속도 데이터를 저장할 수 있습니다.
ts_vel = timeseries(x(:,3),1:5,"name","Velocity");
ts_pos
와 ts_vel
을 동기화된 상태로 유지하면서 작업을 수행하려면 하나의 모음 내에서 두 객체를 그룹화하십시오. 자세한 내용은 시계열 컬렉션 항목을 참조하십시오.
시계열 객체 생성하기
count.dat
의 샘플 데이터에는 24개의 행과 3개의 열이 있습니다. 각 열은 도심 교차로 세 곳의 시간별 차량 수를 나타냅니다.
데이터를 불러오고 3개의 timeseries
객체를 생성하여 각 교차로에서 수집한 데이터를 저장합니다.
load count.dat count1 = timeseries(count(:,1),1:24,"name","Intersection1"); count2 = timeseries(count(:,2),1:24,"name","Intersection2"); count3 = timeseries(count(:,3),1:24,"name","Intersection3");
또는 모든 시계열의 데이터 단위가 동일하고 계산하는 동안 시계열을 동기화 상태로 유지하려는 경우 단일 객체를 만듭니다.
count_ts = timeseries(count,1:24,"name","traffic_counts");
단위 및 보간 방법 수정하기
기본적으로 시계열에는 단위가 초이고 시작 시간이 0초인 시간 벡터가 있으며 계열은 선형 보간을 사용합니다.
3개 시계열의 시간 단위를 hours로 수정합니다.
count1.TimeInfo.Units = "hours"; count2.TimeInfo.Units = "hours"; count3.TimeInfo.Units = "hours";
count1
의 데이터 단위를 cars로 변경합니다.
count1.DataInfo.Units = "cars";
count1
의 보간 방법을 영차 유지(Zero-Order Hold)로 설정합니다. 다른 시계열은 디폴트 방법인 선형 보간을 사용합니다.
count1.DataInfo.Interpolation = tsdata.interpolation("zoh");
수정된 데이터 속성을 봅니다.
count1.DataInfo
tsdata.datametadata Namespace: tsdata Common Properties: Units: 'cars' Interpolation: zoh (tsdata.interpolation)
이벤트 정의하기
이벤트는 특정 시간에 데이터에 표시를 합니다. 또한 이벤트를 사용하면 여러 시계열을 간편하게 동기화할 수 있습니다.
오전 통근 시간과 오후 통근 시간을 표시하는 2개의 이벤트를 각 계열에 추가합니다.
e1 = tsdata.event("AMCommute",8); e1.Units = "hours"; count1 = addevent(count1,e1); count2 = addevent(count2,e1); count3 = addevent(count3,e1); e2 = tsdata.event("PMCommute",18); e2.Units = "hours"; count1 = addevent(count1,e2); count2 = addevent(count2,e2); count3 = addevent(count3,e2);
첫 번째 시계열을 플로팅합니다. 빨간색 원 마커는 이벤트를 나타냅니다.
plot(count1)
시계열 컬렉션
컬렉션은 동기화된 시계열 그룹입니다. 컬렉션 내 timeseries
객체의 시간 벡터는 서로 일치해야 합니다. 컬렉션의 각 개별 시계열을 멤버라고 합니다. 일반적으로 데이터 단위가 서로 다른 시계열의 컬렉션을 사용합니다. 이 간단한 예제에서는 모든 시계열의 단위가 동일합니다.
tsc = tscollection({count1,count2,count3},"name","count_coll")
Time Series Collection Object: count_coll Time vector characteristics Start time 1 hours End time 24 hours Member Time Series Objects: Intersection1 Intersection2 Intersection3
컬렉션 리샘플링하기
리샘플링 작업은 특정 시간 값에서 기존 데이터를 선택하거나 데이터를 더 촘촘한 간격으로 보간하는 데 사용됩니다. 새 시간 벡터에 이전 시간 벡터에 없던 시간 값이 있으면 각 시계열에 연결된 보간 방법을 사용하여 새 데이터 값을 계산합니다.
시계열을 리샘플링하여 1시간이 아니라 2시간마다 데이터 값을 포함시키고 이 값을 새 tscollection
객체로 저장합니다.
tsc1 = resample(tsc,1:2:24);
일부 경우에는 정보를 현재보다 더 미세하게 샘플링해야 할 수도 있기 때문에 데이터 값을 보간하여 정보를 가져오는 것이 좋습니다. 예를 들어, 30분 표시마다 값을 보간합니다.
tsc1 = resample(tsc,1:0.5:24);
이전 샘플 상수의 값을 유지하는 영차 유지 보간 방법을 사용하여 Intersection1
의 새 데이터 점을 계산합니다. 마커와 함께 tsc1
의 멤버를 플로팅하여 보간 결과를 확인합니다.
plot(tsc1.Intersection1,"-x")
Intersection2
의 새로운 데이터 점은 디폴트 방법인 선형 보간을 사용합니다.
plot(tsc1.Intersection2,"-o")
컬렉션에 데이터 샘플 추가하기
3.25시에 첫 번째 컬렉션 멤버에 데이터 샘플을 추가합니다.
tsc1 = addsampletocollection(tsc1,"time",3.25,"Intersection1",5);
시계열에는 매 30분에 대한 값이 포함되기 때문에 새로 추가되는 값은 여섯 번째 요소가 됩니다.
tsc1.Intersection1.Data
ans = 48×1
11
11
7
7
14
5
14
11
11
43
⋮
새 샘플의 Intersection2
와 Intersection3
에 대한 데이터 값을 지정하지 않았기 때문에 이 멤버들의 누락값은 NaN
으로 표시됩니다.
tsc1.Intersection2.Data
ans = 48×1
11
12
13
15
17
NaN
15
13
32
51
⋮
누락된 데이터 처리하기
tsc1
컬렉션에서 3.25시의 Intersection2
멤버와 Intersection3
멤버에는 현재 NaN
으로 표시된 누락값이 포함되어 있습니다. 이 데이터를 분석하기 전에 누락값을 제거하거나 보간을 사용하여 누락된 값을 대체할 수 있습니다.
예를 들어, NaN
값이 포함된 데이터 샘플을 찾아 제거합니다. Intersection2
의 각 누락값에 대해, 해당 시간의 데이터가 컬렉션의 모든 멤버에서 제거됩니다.
tsc2 = delsamplefromcollection(tsc1,"index",... find(isnan(tsc1.Intersection2.Data)));
또는 보간을 사용해 리샘플링하여 Intersection2
와 Intersection3
에서 NaN
값을 대체합니다. 이러한 시계열의 디폴트 보간 방법은 선형 보간입니다.
tsc1 = resample(tsc1,tsc1.Time); tsc1.Intersection2.Data
ans = 48×1
11
12
13
15
17
16
15
13
32
51
⋮
컬렉션 멤버 플로팅하기
시계열 컬렉션의 데이터를 플로팅하려면 해당 멤버를 한 번에 하나씩 플로팅하십시오.
선택적으로 시간 벡터를 형식이 지정된 날짜와 시간으로 표시하려면 시작 날짜를 지정합니다. 이러한 경우 시간 단위는 시간이기 때문에 시와 분을 표시하는 표시 형식을 지정할 수 있습니다.
tsc1.TimeInfo.StartDate = "25-DEC-2022 00:00:00"; tsc1.TimeInfo.Format = "HH:MM";
컬렉션의 단일 멤버를 플로팅하면 멤버의 시간 단위는 x축, 데이터 단위는 y축에 표시됩니다. 플롯 제목은 Time Series Plot:<member name>
으로 표시됩니다.
컬렉션의 여러 멤버를 플로팅하기 전에 hold on
을 지정하면 주석이 표시되지 않습니다. 시계열 plot
메서드는 유지된 Figure에 레이블과 제목을 표시하지 않습니다. 계열의 설명자가 다를 수 있기 때문입니다. 날짜 형식을 유지하려면 첫 번째 멤버를 플로팅한 후 유지하십시오. 전체 컬렉션을 반영하도록 제목과 레이블을 업데이트합니다.
plot(tsc1.Intersection1,"Displayname","Intersection 1") hold on plot(tsc1.Intersection2,"Displayname","Intersection 2") legend("Location","NorthWest") title("Intersections 1 and 2") xlabel("Time (hours)") ylabel("Number of cars") hold off