aggregation aggregate

Análisis de Sensores IoT con Datos Faltantes en Series Temporales

Scénario de test & Cas d'usage

Contexto empresarial

Una planta de fabricación monitorea la temperatura de sus máquinas a través de sensores IoT. Los datos se transmiten cada segundo, pero a veces hay fallos de transmisión que generan valores faltantes. El objetivo es agregar los datos en intervalos de 10 segundos, pero es vital probar cómo la acción maneja los valores faltantes para asegurar que los promedios no se vean sesgados.
Sobre el conjunto : aggregation

Agregación de datos y cálculos estadísticos resumidos.

Descubrir todas las acciones de aggregation
Preparación de datos

Creación de una tabla de datos de sensores con valores de temperatura y timestamps, introduciendo deliberadamente valores faltantes.

¡Copiado!
1DATA casuser.DATOS_SENSORES;
2 FORMAT Timestamp_Sensor datetime20.;
3 DO ID_Maquina = 1 to 2;
4 DO sec = 1 to 60;
5 Timestamp_Sensor = dhms(today(), 0, 0, sec);
6 IF mod(sec, 7) = 0 THEN Valor_Sensor = . ; /* Valor faltante */
7 ELSE IF mod(sec, 15) = 0 THEN call missing(Timestamp_Sensor); /* Timestamp faltante */
8 ELSE Valor_Sensor = 80 + rand('NORMAL', 0, 5);
9 OUTPUT;
10 END;
11 END;
12RUN;

Étapes de réalisation

1
Cargar la tabla de sensores en CAS.
¡Copiado!
1 
2PROC CASUTIL;
3load
4DATA=casuser.DATOS_SENSORES casout='DATOS_SENSORES' caslib='casuser' replace;
5QUIT;
6 
2
Ejecutar la agregación por intervalo de tiempo con el manejo predeterminado de valores faltantes (excluyéndolos).
¡Copiado!
1PROC CAS;
2 aggregation.aggregate /
3 TABLE={name='DATOS_SENSORES', groupBy={'ID_Maquina'}},
4 id='Timestamp_Sensor',
5 interval='SECOND10.',
6 casOut={name='RESUMEN_SENSORES_DEFAULT', caslib='casuser', replace=true},
7 varSpecs={{name='Valor_Sensor', agg='MEAN'}};
8RUN;
9QUIT;
3
Ejecutar la agregación incluyendo explícitamente los valores faltantes en el análisis para observar el cambio en el recuento de observaciones.
¡Copiado!
1PROC CAS;
2 aggregation.aggregate /
3 TABLE={name='DATOS_SENSORES', groupBy={'ID_Maquina'}},
4 id='Timestamp_Sensor',
5 interval='SECOND10.',
6 includeMissing=true,
7 casOut={name='RESUMEN_SENSORES_INCL_MISS', caslib='casuser', replace=true},
8 varSpecs={{name='Valor_Sensor', agg=['MEAN', 'N']}};
9RUN;
10QUIT;

Resultado esperado


Se generarán dos tablas. 'RESUMEN_SENSORES_DEFAULT' contendrá promedios calculados solo a partir de observaciones no nulas. 'RESUMEN_SENSORES_INCL_MISS' también incluirá intervalos donde los datos eran faltantes. Se espera que el recuento de observaciones ('_N_') en la segunda tabla sea mayor o igual para cada intervalo en comparación con la primera, demostrando que el parámetro `includeMissing` funciona correctamente.