Временные ряды

timeseries

Справка MathWorks

Объект timeseries предназначен для представления изменяющихся в дискретном времени данных. Для создания временного ряда используется функция timeseries

>> ts1 = timeseries((1:5)','Name','MyTimeSeries')
  timeseries

  Common Properties:
            Name: 'MyTimeSeries'
            Time: [5x1 double]
        TimeInfo: [1x1 tsdata.timemetadata]
            Data: [5x1 double]
        DataInfo: [1x1 tsdata.datametadata]

  More properties, Methods

При создании временного ряда ts первым аргументом был передан массив значений ряда от 1 до 5 с шагом 1 . Вторым аргументом задано имя временного ряда (свойство ‘Name’). Значения времени переданы не были, поэтому MATLAB задает эти значения автоматически, считая, что первая точка данных (1) соответствует моменту времени 0, последняя 4. Это некоторые абстрактные значения, не привязанные к конкретным единицам времени. Значения времени содержаться в атрибуте (свойстве) объекта Time

>> ts1.Time

ans =
     0
     1
     2
     3
     4

Для того, чтобы задать и массив значений времени и массив значений исследуемой функции используется следующий способ вызова функции timeseries

>> ts1 = timeseries([1 3 2 5 7]',[0 10 20 30 40],'Name',' Ряд 1');

Первый аргумент (1:5)’ это значения функции (данные), второй – соответствующие этим значениям временные метки. В примере это массив [0 10 20 30 40].

Временными метками могут быть конкретные значения даты и времени, которые могут быть переданы в функцию timeseries в виде массива строк. Для того чтобы преобразовать массив дат в массив текстового представления этих дат используется функция datestr

>> datestr(datetime(2020,04,1:5,12,0,0))

ans =
  5×20 char array
    '01-Apr-2020 12:00:00'
    '02-Apr-2020 12:00:00'
    '03-Apr-2020 12:00:00'
    '04-Apr-2020 12:00:00'
    '05-Apr-2020 12:00:00'

Тогда

>> date_string_array  = datestr(datetime(2020,04,1:5,12,0,0));
>> ts1 = timeseries([1 3 2 5 7]', date_string_array, 'Name', ' Ряд 1');

Очень просто построить график временного ряда. Достаточно передать в функцию plot имя объекта timeseries

>> plot(ts1);

Чтобы метки дат на оси x отображались в нужном формате используем функцию datetick

>> datetick('x','dd.mm.yy');

Некоторые функции для работы с timeseries

resample

Функция пересчитывает значения временного ряда для новых значений времени, передаваемых в функцию вторым аргументом. Результатом работы функции resample является новый временной ряд

>> ts2 = resample(ts1,[3 12 25 31 39]);
>> ts2.Data

ans =
    1.6000
    2.8000
    3.5000
    5.2000
    6.8000

Для сравнения двух временных рядов построим их графики на одном рисунке

>> plot(ts1,'ro-');
>> hold on;
>> plot(ts2,'g^--');
>> hold off;

Как видно из результата, по умолчанию для пересчета значений используется линейная интерполяция. Способ интерполяции значений временного ряда задаётся функцией setinterpmethod

ts3 = setinterpmethod(ts2,'zoh');

Функция возвращает новый временной ряд. Первый аргумент – преобразуемый временной ряд, второй – способ интерполяции значений. Возможны два варианта ‘zoh’ и ‘linear’. ‘zoh’ – интерполяция нулевого порядка, которая представляет временной ряд в виде кусочно-постоянной функции

plot(ts3)

Функция detrend

Функция detrend удаляет из временного ряда постоянное число, равное среднему значению ряда, или линейную составляющую, вычисленную по методу наименьших квадратов.

Создадим временной ряд для интервала времени от 0 до 10 с шагом 0.2. Функция представляет собой сумму периодической функции с линейной функцией.

>> t = 0:0.2:10
>> y = sin(5*t)+3*t;
>> ts1 = timeseries(y,t);

Создадим два новых временных ряда на основе исходного, применив функцию detrend

>> ts2 = detrend(ts1,'constant');
>> ts3 = detrend(ts1,'linear');