Procesamiento de datos de series temporales de transmisión: descripción general

En este documento, se describen los desafíos clave para el procesamiento de datos de series temporales de transmisión cuando se usa Apache Beam y, luego, se explican los métodos usados en las bibliotecas Java de Timeseries Streaming para abordar estos desafíos. También se describe cómo los datos procesados con Timeseries Streaming son adecuados para un caso práctico común, que es el entrenamiento y la predicción con un modelo de aprendizaje automático (AA).

Este documento forma parte de una serie:

  • Procesa datos de series temporales de transmisión: descripción general (este documento).
  • Procesamiento de datos de series temporales de transmisión: instructivo, que explica cómo usar la solución Timeseries Streaming. Primero debes procesar los datos de series temporales con las bibliotecas Java de Timeseries Streaming y, luego, obtener predicciones sobre esos datos mediante las bibliotecas de transmisión de Python de Timeseries Streaming.

Este documento está dirigido a desarrolladores e ingenieros de datos, y se da por sentado que tienes los siguientes conocimientos:

  • Experiencia intermedia o mayor con la programación en Java
  • Conocimientos avanzados de Apache Beam
  • Conocimientos básicos sobre el desarrollo y el uso del modelo de AA

Datos de series temporales

Una serie temporal es un conjunto de datos con un orden de tiempo. Por ejemplo, las acciones bursátiles o las instantáneas de una cámara activada por movimiento. Cada dato se representa con una clave sincronizada con uno o más valores. Por ejemplo, la clave puede ser el símbolo bursátil y el valor podría ser el precio en ese momento.

A medida que se producen los datos, puedes agruparlos en intervalos de tiempo fijos, lo que te permite crear estadísticas que describan los eventos de ese intervalo. Este proceso se conoce como sistema de ventanas. Por ejemplo, para un precio de acciones, es posible que te interese captar valores analíticos y agregados, como el primero, el último, el mínimo, el máximo y la media de un período, como un minuto. Una vez que calcules estos tipos de métricas, puedes usarlas como componentes básicos para métricas más complejas.

Una serie temporal puede contener varios datos relacionados (multivariable) o un único dato (una variable). Por ejemplo, una serie temporal de transacciones de acciones que contienen tanto precios de venta como de oferta sería multivariable, mientras que una serie temporal de lecturas de temperatura de un sensor de Internet de las cosas (IoT) sería de una sola variable.

Desafíos del procesamiento de datos de series temporales de transmisión

El procesamiento de datos de series temporales de transmisión con Apache Beam puede ser un desafío debido a las siguientes limitaciones:

  • Cuando se usa el sistema de ventanas, no hay un mecanismo predeterminado en Apache Beam para transmitir el estado de un período a otro.
  • Es difícil mantener el orden de los datos en los períodos temporales de un entorno de procesamiento distribuido como Apache Beam por los siguientes motivos:

    • Necesitas acceso a todos los datos que se deben ordenar, los que pueden distribuirse entre trabajadores.
    • Este orden requiere la clasificación de lo que suele ser un conjunto de datos grande, lo que puede consumir muchos recursos.

Estas limitaciones generan los dos problemas que se describen en las siguientes secciones.

Rellena vacíos en los datos

El primer problema que surge de las limitaciones actuales al procesar datos de las series temporales de transmisión con Apache Beam es la incapacidad de llenar los vacíos de datos automáticamente con el último valor conocido.

Lo ideal es que los datos de series temporales que ingresan en tu aplicación no tengan vacíos, con un valor presente para la clave de cada período, como se muestra en la siguiente ilustración de los datos del sensor de IoT:

Diagrama que muestra los datos de series temporales ideales sin valores faltantes.

Sin embargo, en la vida real, los vacíos pueden producirse por cuestiones como la interrupción de la conectividad o los sensores, lo que hace que los datos se parezcan más a la siguiente ilustración:

Diagrama que muestra datos típicos de series temporales con valores faltantes.

Como resultado, una parte importante de la preparación de datos para el aprendizaje automático y muchos otros casos de uso consiste en reemplazar los valores nulos por los valores apropiados para la clave dada, para que los cálculos y otras operaciones de esa clave no fallen.

Cálculo de métricas en más de un período

El segundo problema que surge de las limitaciones actuales del procesamiento de datos de series temporales de transmisión es la incapacidad de Apache Beam para calcular las métricas que dependen de ventanas progresivas que abarcan más de un período.

Para muchas de las métricas más complejas que deseas generar a partir de datos de series temporales, necesitas datos de más de una ventana de tiempo, y el orden de los datos es importante. Por ejemplo, es posible que desees realizar cálculos que dependen del estado de uno o más períodos anteriores, como determinar el cambio absoluto de un valor entre un período y el siguiente, o calcular un valor progresivo promedio móvil.

La aplicación de referencia de Timeseries Streaming

La aplicación de referencia de Timeseries Streaming te muestra cómo superar las limitaciones actuales de Apache Beam en el procesamiento de datos de series temporales de transmisión para que puedas rellenar los vacíos y realizar cálculos de métricas en los períodos. Contiene bibliotecas Java para un conjunto de transformaciones que puedes usar a fin de simplificar el desarrollo de una canalización de Apache Beam y procesar datos de series temporales de esta manera.

Timeseries Streaming también incluye bibliotecas de Python que te permiten obtener predicciones sobre los datos de un modelo de AA, que es un caso de uso común de datos de series temporales procesadas. En particular, proporciona el código fuente de Keras y una versión entrenada de un modelo de memoria de corta duración (LSTM), que es un tipo de modelo muy útil para la detección de anomalías.

La elección del modelo de AA no es la consideración clave en la implementación de la aplicación de referencia, que se enfoca principalmente en la forma de procesar los datos de series temporales de transmisión. Decidimos usar un modelo de detección de anomalías LSTM porque no se requiere conocimiento empresarial específico para interpretar los resultados.

Diseño del procesamiento de datos

La solución Timeseries Streaming te muestra cómo abordar los desafíos de procesamiento de datos descritos en la sección Desafíos del procesamiento de datos de series temporales con tres funciones de Apache Beam:

Primero, Timeseries Streaming usa un activador para capturar los resultados agregados de cada período fijo y, luego, los pone a disposición del procesamiento en la ventana global única. La ventana global única tiene una duración casi ilimitada, por lo que los resultados agregados permanecen disponibles en los períodos fijos. Esto te permite rellenar vacíos de datos y calcular métricas que requieren datos de varias ventanas.

Sin embargo, una vez que mueves los resultados agregados a la ventana global, no se garantiza su orden. Están disponibles para procesarse en el orden recibido en circunstancias normales, pero las interrupciones del sistema, que son, por ejemplo, cualquier cosa que interfiera con la marca de agua, pueden provocar que estén disponibles sin ningún orden. Para solucionar este problema, la solución usa temporizadores de bucle. El contrato de la API Timer garantiza que los temporizadores se activen en secuencia, lo que te permite aplicar un orden sobre cómo se procesan los resultados agregados.

La funcionalidad de procesamiento de datos de Timeseries Streaming se implementa en la biblioteca TimeSeriesPipeline.

Enfoques alternativos considerados

Puedes adoptar un enfoque alternativo para llenar los vacíos de los datos mediante la generación de un mensaje de señal de monitoreo de funcionamiento externo a la canalización que proporciona un valor alternativo. Sin embargo, este enfoque tiene varios problemas que dificultan su aplicación:

  • Los valores del mensaje de señal de monitoreo de funcionamiento deben transmitirse a todos los trabajadores de canalizaciones de todas las series temporales que se procesen, de modo que puede haber muchas. Tu aplicación debería controlar la propagación y el envío de estos mensajes, y también abordar los posibles cuellos de botella en la distribución de estos datos a los trabajadores.
  • Las claves que se usan en los datos pueden variar, mientras que las claves nuevas aparecen y las claves existentes se eliminan a medida que cambian los datos de la transmisión. Tu aplicación mantendría una lista de claves para actualizar los datos de series temporales, por ejemplo, mediante la extracción de valores DISTINCT(Key) a partir de los datos de cada período.
  • El requisito de los mensajes de señal de monitoreo de funcionamiento significa que debes agregar otro componente a tu aplicación, que luego se deberá desarrollar, supervisar y mantener.

Puedes evitar el primer y el tercer problema mediante la creación de un mensaje interno de señal de monitoreo de funcionamiento en la canalización, y puedes hacerlo si usas GenerateSequence. Sin embargo, tendrías que controlar la variación en el tiempo de las claves de los datos.

Tipos de vacíos de datos abordados

Existen cuatro patrones comunes en la continuidad de los datos de transmisión, y la solución Timeseries Streaming se encarga de tres de ellos. Son los siguientes:

  • Patrón 1: Hay datos en la transmisión de una clave determinada para todos los períodos. No se requiere rellenar vacíos.

    Datos de series temporales sin valores faltantes.

  • Patrón 2: Faltan datos de una clave determinada en algunas ventanas de tiempo, pero los datos se siguen brindando de manera intermitente para la clave.

    Datos de series temporales con valores intermitentes.

    Timeseries Streaming maneja esta situación mediante el uso de temporizadores de bucles a fin de crear un punto de entrada para ese período y proporcionar un valor de reemplazo.

  • Patrón 3: No hay datos de una clave determinada durante la fase de arranque cuando el sistema comienza a leer la transmisión de datos.

    Series temporales sin datos al inicio del sistema.

    Timeseries Streaming no aborda este caso. Si una clave no tiene datos cuando comienza la canalización de transmisión, el sistema no sabe que la clave existe y no se inicia el temporizador de bucle.

  • Patrón 4: Después de cierto punto, los datos dejan de llegar a una clave determinada. Por ejemplo, si un dispositivo de IoT envió señales, pero se retira de servicio.

    Series temporales en las que los valores dejan de llegar a una clave.

    Timeseries Streaming se encarga de esto y se configura un valor de tiempo de actividad configurable. El valor de tiempo de actividad indica a la aplicación que apague el temporizador de bucle para las claves que no reciben datos durante el período especificado.

Métricas incluidas

La solución Timeseries Streaming contiene las siguientes métricas:

Métrica Descripción
Media móvil simple Se usa para identificar tendencias a largo plazo en los datos.
Media móvil exponencial Se usa para identificar tendencias a corto plazo en los datos.
Desviación estándar Se usa para comprender la dispersión de los datos, a fin de evaluar el riesgo o la volatilidad.
Bandas de Bollinger Se usa para conocer la volatilidad del precio relativo.
Índice de fuerza relativa Se usa para comprender las tendencias históricas y actuales de los precios.

Estas métricas se implementan en TimeSeriesMetricsLibrary.

Para agregar otras métricas a la solución, sigue las instrucciones de Crea métricas nuevas a partir de una transmisión.

Diseño de aprendizaje automático

La aplicación del aprendizaje automático a la transmisión de datos de series temporales puede ser compleja. En general, los datos deben tener la forma correcta y no deben tener vacíos. Lo ideal es procesar de forma idéntica los datos utilizados para el entrenamiento y los datos enviados para la predicción, ya que esto ayuda a garantizar la coherencia del contenido y la forma de los datos, lo que puede mejorar el rendimiento del modelo.

En Timeseries Streaming, el modelo LSTM proporcionado se entrenó con datos de series temporales procesados por las bibliotecas de Java de Timeseries Streaming. Cuando ejecutas el código para obtener predicciones, los datos de ejemplo que usas se procesan a través de esas mismas bibliotecas de Java, lo que garantiza que se formatearon adecuadamente y sin vacíos.

Además, debido a que se conoce la forma del resultado procesado y la extracción de características se realiza como parte del paso de procesamiento de datos, puedes reemplazar el ejemplo de LSTM usado en la canalización de TFX con cualquier otro modelo, siempre y cuando este utilice los datos de la misma forma. Si lo deseas, puedes procesar tus propios datos con las bibliotecas Java, entrenar tu propio modelo y, luego, usarlo de esta manera.

La solución Timeseries Streaming simplifica el código necesario para realizar predicciones en la transmisión mediante el aprovechamiento de la transformación RunInference de TFX Basic Shared Libraries. Esta transformación también te ofrece la opción de orientar un modelo alojado de forma remota en lugar de uno local. Para ello, cambia la configuración de model_spec.proto.

Flujo de trabajo

La solución Timeseries Streaming sigue este flujo de trabajo:

  1. Lee datos de series temporales, que deben estar en el formato del búfer de protocolo que Timeseries Streaming usa. El formato del búfer de protocolo se implementa en la biblioteca TS.proto.

    El uso del formato del búfer de protocolo te brinda los siguientes beneficios:

    • Los objetos de serie temporal usados en la canalización también existen fuera de la canalización. Esto hace que los datos de series temporales estén disponibles para que puedas integrarlos a otros sistemas.
    • Puedes proporcionar datos de series temporales que usen cualquier combinación de tipos de datos de número entero, flotante, doble o de string y la transmisión de series temporales puede procesarlos sin conversión.
  2. Realiza el procesamiento para llenar los vacíos en los datos y, luego, calcular las métricas.

  3. Muestra los datos en uno o más formatos a fin de que estén disponibles para aplicaciones de consumidor.

  4. Obtén predicciones sobre los datos de series temporales procesados con el modelo LSTM proporcionado. Puedes obtener predicciones por lotes en datos que se generaron con el formato TF.Record, o bien obtener predicciones de transmisiones sobre los datos que se publicaron en un tema de Pub/Sub.

¿Qué sigue?