Contenido principal

Objetos y colecciones de series temporales

La forma recomendada de almacenar datos de series temporales es con timetable, que cuenta con un amplio conjunto de funciones compatibles para el preprocesamiento, la reestructuración y el análisis. Para empezar a trabajar con los horarios, consulte Create Timetables.

Algunas secciones de código existentes utilizan los siguientes objetos, descritos en este tema:

  • timeseries: almacena datos numéricos y valores de tiempo, así como la información de metadatos que incluye unidades, eventos, calidad de datos y método de interpolación.

  • tscollection: almacena una recopilación de objetos de timeseries que comparten un vector de tiempo común, conveniente para realizar operaciones en series temporales sincronizadas con diferentes unidades.

Muestras de datos en timeseries

Considere datos que constan de tres señales de sensores: dos señales representan la posición de un objeto en metros y la tercera representa su velocidad en metros/segundo. NaN representa un valor de datos faltantes.

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];

Las dos primeras columnas de x contienen cantidades con las mismas unidades y puede crear un objeto de timeseries multivariado para almacenar estas dos series temporales.

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

Una muestra de datos consta de uno o más valores asociados con un tiempo específico en el objeto de timeseries. El número de muestras de datos en una serie temporal es igual a la longitud del vector de tiempo, que en este ejemplo es 5. Para encontrar el tamaño de la muestra de datos, utilice getdatasamplesize.

getdatasamplesize(ts_pos)
ans = 1×2

     1     2

Puede crear un segundo objeto de timeseries para almacenar los datos de velocidad.

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

Si desea realizar operaciones en ts_pos y ts_vel mientras los mantiene sincronizados, agrúpelos en una recopilación. Para obtener más información, consulte Recopilaciones de series temporales.

Crear objetos de series temporales

Los datos de muestra de count.dat tienen 24 filas y tres columnas. Cada columna representa el recuento de vehículos por hora en cada una de las tres intersecciones urbanas.

Cargue los datos y cree tres objetos de timeseries para almacenar los datos recopilados en cada intersección.

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");

De manera alternativa, cuando todas las series temporales tienen las mismas unidades de datos y desea mantenerlas sincronizadas durante los cálculos, cree un objeto único.

count_ts = timeseries(count,1:24,"name","traffic_counts");

Modificar unidades y método de interpolación

De forma predeterminada, una serie temporal tiene un vector de tiempo con unidades de segundos y un tiempo de inicio de 0 segundos, y usa la interpolación lineal.

Modifique las unidades de tiempo para que sean horas para las tres series temporales.

count1.TimeInfo.Units = "hours";
count2.TimeInfo.Units = "hours";
count3.TimeInfo.Units = "hours";

Cambie las unidades de datos de count1 a automóviles.

count1.DataInfo.Units = "cars";

Establezca el método de interpolación para count1 para mantener el orden cero. Las demás series temporales utilizan el método predeterminado, la interpolación lineal.

count1.DataInfo.Interpolation = tsdata.interpolation("zoh");

Visualice las propiedades de los datos modificados.

count1.DataInfo
  tsdata.datametadata
  Namespace: tsdata

  Common Properties:
               Units: 'cars'
       Interpolation: zoh (tsdata.interpolation)

  More properties, Methods

Definir eventos

Los eventos marcan los datos en momentos específicos. Los eventos también proporcionan una manera conveniente de sincronizar varias series temporales.

Añada dos eventos a cada serie que marquen las horas de los desplazamientos al trabajo por la mañana y de vuelta a casa por la tarde.

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

Represente la primera serie temporal. Los círculos rojos representan los eventos.

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

Recopilaciones de series temporales

Una recopilación es un grupo de series temporales sincronizadas. Los vectores de tiempo de los objetos de timeseries en una recopilación deben coincidir. Cada serie temporal individual en una colección se denomina miembro. Normalmente, las recopilaciones se usan para agrupar series temporales que tienen datos de unidades diferentes. En este ejemplo simple, todas las series temporales tienen las mismas unidades.

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

Volver a muestrear una recopilación

Una operación de remuestreo se utiliza para seleccionar datos existentes en valores de tiempo específicos o para interpolar datos en intervalos más precisos. Si el nuevo vector de tiempo contiene valores de tiempo que no existían en el vector de tiempo anterior, los nuevos valores de datos se calculan utilizando el método de interpolación que asoció con cada serie temporal.

Vuelva a muestrear la serie temporal para incluir valores de datos cada dos horas en lugar de cada hora y guárdela como un nuevo objeto de tscollection.

tsc1 = resample(tsc,1:2:24);

En algunos casos, es posible que necesite una muestra más precisa de la información que tiene actualmente y es razonable obtenerla interpolando valores de datos. Por ejemplo, interpole valores en cada marca de media hora.

tsc1 = resample(tsc,1:0.5:24);

Los nuevos puntos de datos en Intersection1 se calculan utilizando el método de interpolación de retención de orden cero, que mantiene constante el valor de la muestra anterior. Represente los miembros de tsc1 con marcadores para ver los resultados de la interpolación.

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

Los nuevos puntos de datos en Intersection2 utilizan la interpolación lineal, que es el método predeterminado.

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

Añadir una muestra de datos a una recopilación

Añada una muestra de datos a la primera recopilación a las 3,25 horas.

tsc1 = addsampletocollection(tsc1,"time",3.25,"Intersection1",5);

La serie temporal incluye valores para cada media hora, por lo que el nuevo valor es el sexto elemento.

tsc1.Intersection1.Data
ans = 48×1

    11
    11
     7
     7
    14
     5
    14
    11
    11
    43
    43
    38
    38
    61
    61
      ⋮

Dado que no especificó los valores de datos para Intersection2 e Intersection3 en la nueva muestra, los valores faltantes se representan con valores NaN para estos miembros.

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
      ⋮

Gestionar los datos faltantes

Los miembros Intersection2 e Intersection3 de la recopilación tsc1 actualmente contienen valores faltantes, a las 3,25 horas, representados por NaN. Antes de analizar estos datos, puede eliminar los valores faltantes o utilizar la interpolación para sustituirlos.

Por ejemplo, encuentre y elimine las muestras de datos que contienen valores NaN. Para cada valor faltante en Intersection2, los datos en ese momento se eliminan de todos los miembros de la recopilación.

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

De manera alternativa, reemplace los valores de NaN en Intersection2 e Intersection3 con un remuestreo utilizando la interpolación. El método de interpolación predeterminado para estas series temporales es la interpolación lineal.

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
      ⋮

Representar miembros de la recopilación

Para representar datos en una recopilación de series temporales, se deben representar sus miembros de uno en uno.

De manera opcional, para visualizar los vectores de tiempo como fechas y horas con formato, especifique la fecha de inicio. En este caso, las unidades de tiempo son horas, por lo que puede especificar un formato de visualización que muestre horas y minutos.

tsc1.TimeInfo.StartDate = "25-DEC-2022 00:00:00";
tsc1.TimeInfo.Format = "HH:MM";

Cuando se representa un único miembro de una recopilación de series temporales, sus unidades de tiempo se muestran en el eje x y sus unidades de datos se muestran en el eje y. El título de la gráfica se muestra como Time Series Plot:<member name>.

Si especifica hold on antes de representar varios miembros de la recopilación, no se mostrará ninguna anotación. El método de serie temporal plot no intenta mostrar etiquetas y títulos en las figuras retenidas porque los descriptores de las series pueden ser diferentes. Para conservar el formato de fecha, utilice hold on después de representar el primer miembro. Actualice el título y las etiquetas para reflejar toda la recopilación.

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.

Consulte también

| |