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 detimeseries
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)
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")
Los nuevos puntos de datos en Intersection2
utilizan la interpolación lineal, que es el método predeterminado.
plot(tsc1.Intersection2,"-o")
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