주요 콘텐츠

시계열 객체 및 컬렉션

시계열 데이터를 저장할 때 전처리, 재구성, 분석을 위한 광범위한 지원 함수를 갖춘 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: [1x1 tsdata.timemetadata]
            Data: [5x2 double]
        DataInfo: [1x1 tsdata.datametadata]

  More properties, Methods

데이터 샘플timeseries 객체의 특정 시간과 연결된 하나 이상의 값으로 구성됩니다. 시계열에 포함된 데이터 샘플 개수는 시간 벡터의 길이(이 예제의 경우 5)와 같습니다. 데이터 샘플의 크기를 구하려면 getdatasamplesize를 사용합니다.

getdatasamplesize(ts_pos)
ans = 1×2

     1     2

두 번째 timeseries 객체를 생성하여 속도 데이터를 저장할 수 있습니다.

ts_vel = timeseries(x(:,3),1:5,"name","Velocity");

ts_posts_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)

  More properties, Methods

이벤트 정의하기

이벤트는 특정 시간에 데이터에 표시를 합니다. 또한 이벤트를 사용하면 여러 시계열을 간편하게 동기화할 수 있습니다.

오전 통근 시간과 오후 통근 시간을 표시하는 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)

Figure contains an axes object. The axes object with title Time Series Plot:Intersection1, xlabel Time (hours), ylabel Intersection1 (cars) contains 2 objects of type stair, line. One or more of the lines displays its values using only markers

시계열 컬렉션

컬렉션은 동기화된 시계열 그룹입니다. 컬렉션 내 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")

Figure contains an axes object. The axes object with title Time Series Plot:Intersection1, xlabel Time (hours), ylabel Intersection1 (cars) contains 2 objects of type stair, line. One or more of the lines displays its values using only markers

Intersection2의 새로운 데이터 점은 디폴트 방법인 선형 보간을 사용합니다.

plot(tsc1.Intersection2,"-o")

Figure contains an axes object. The axes object with title Time Series Plot:Intersection2, xlabel Time (hours), ylabel Intersection2 contains 2 objects of type line. One or more of the lines displays its values using only markers

컬렉션에 데이터 샘플 추가하기

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
    43
    38
    38
    61
    61
      ⋮

새 샘플의 Intersection2Intersection3에 대한 데이터 값을 지정하지 않았기 때문에 이 멤버들의 누락값은 NaN으로 표시됩니다.

tsc1.Intersection2.Data
ans = 48×1

   11.0000
   12.0000
   13.0000
   15.0000
   17.0000
       NaN
   15.0000
   13.0000
   32.0000
   51.0000
   48.5000
   46.0000
   89.0000
  132.0000
  133.5000
      ⋮

누락된 데이터 처리하기

tsc1 컬렉션에서 3.25시의 Intersection2 멤버와 Intersection3 멤버에는 현재 NaN으로 표시된 누락값이 포함되어 있습니다. 이 데이터를 분석하기 전에 누락값을 제거하거나 보간을 사용하여 누락된 값을 대체할 수 있습니다.

예를 들어, NaN 값이 포함된 데이터 샘플을 찾아 제거합니다. Intersection2의 각 누락값에 대해, 해당 시간의 데이터가 컬렉션의 모든 멤버에서 제거됩니다.

tsc2 = delsamplefromcollection(tsc1,"index",... 
       find(isnan(tsc1.Intersection2.Data)));

또는 보간을 사용해 리샘플링하여 Intersection2Intersection3에서 NaN 값을 대체합니다. 이러한 시계열의 디폴트 보간 방법은 선형 보간입니다.

tsc1 = resample(tsc1,tsc1.Time);
tsc1.Intersection2.Data
ans = 48×1

   11.0000
   12.0000
   13.0000
   15.0000
   17.0000
   16.0000
   15.0000
   13.0000
   32.0000
   51.0000
   48.5000
   46.0000
   89.0000
  132.0000
  133.5000
      ⋮

컬렉션 멤버 플로팅하기

시계열 컬렉션의 데이터를 플로팅하려면 해당 멤버를 한 번에 하나씩 플로팅하십시오.

선택적으로 시간 벡터를 형식이 지정된 날짜와 시간으로 표시하려면 시작 날짜를 지정합니다. 이러한 경우 시간 단위는 시간이기 때문에 시와 분을 표시하는 표시 형식을 지정할 수 있습니다.

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

Figure contains an axes object. The axes object with title Intersections 1 and 2, xlabel Time (hours), ylabel Number of cars contains 2 objects of type stair, line. These objects represent Intersection 1, Intersection 2.

참고 항목

| |