es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando Timescale para encontrar el valor más reciente por intervalo.

Tengo datos de series temporales con una precisión de hasta milisegundos. Algunas de estas marcas de tiempo pueden coincidir en el tiempo exacto, por lo que se pueden ordenar por una columna de identificación de base de datos para determinar cuál es la más reciente.

Estoy intentando utilizar Timescale para obtener los valores más recientes por segundo. Aquí tienes un ejemplo de los datos que estoy considerando.

time                     db_id  value
2020-01-01 08:39:23.293 | 4460 | 136.01 | 
2020-01-01 08:39:23.393 | 4461 | 197.95 | 
2020-01-01 08:40:38.973 | 4462 |  57.95 | 
2020-01-01 08:43:01.223 | 4463 |    156 | 
2020-01-01 08:43:26.577 | 4464 | 253.43 | 
2020-01-01 08:43:26.577 | 4465 |  53.68 | 
2020-01-01 08:43:26.577 | 4466 | 160.00 |

Cuando se obtiene el último precio por segundo, mis resultados deberían verse así.

time                 value
2020-01-01 08:39:23 | 197.95 |
2020-01-01 08:39:24 | 197.95 |
.
.
.
2020-01-01 08:40:37 | 197.95 |
2020-01-01 08:40:38 | 57.95  |
2020-01-01 08:40:39 | 57.95  |
.
.
.
2020-01-01 08:43:25 | 57.95  | 
2020-01-01 08:43:26 | 160.00 |
2020-01-01 08:43:27 | 160.00 |
.
.
.

He logrado obtener los últimos resultados por segundo utilizando la función de agrupamiento temporal time_bucket de Timescale.

SELECT last(value, db_id), time_bucket('1 seconds', time) AS per_second FROM timeseries GROUP BY per_second ORDER BY per_second DESC;

pero deja huecos en la columna de tiempo.

time                 value
2020-01-01 08:39:23 | 197.95 |
2020-01-01 08:40:38 | 57.95  | 
2020-01-01 08:43:26 | 160.00 |

La solución que se me ocurrió es crear una base de datos con marcas de tiempo por segundo y valores nulos, migrar los datos de la tabla resultante anterior y luego reemplazar los valores nulos con el último valor que se produjo, pero parece que hay muchos pasos intermedios.

Me gustaría saber si hay una mejor forma de abordar este problema de encontrar el “último valor” por segundo, minuto, hora, etc. Originalmente intenté resolver el problema con Python, ya que parecía un problema sencillo, pero consume mucho tiempo de procesamiento.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en TimescaleDB y datos de series temporales, hay una solución más simple para obtener el valor más reciente por segundo sin dejar huecos en la columna de tiempo.

    En primer lugar, utiliza la función time_bucket_gapfill() en lugar de time_bucket() para rellenar los huecos de las marcas de tiempo que faltan. Esta función generará una serie temporal regular interpolando las marcas de tiempo que faltan para cada grupo.

    SELECT last(value, db_id), time_bucket_gapfill('1 second', time) as per_second 
    FROM timeseries 
    GROUP BY per_second 
    ORDER BY per_second DESC;
    

    Esto devolverá un conjunto de resultados sin huecos en la columna de tiempo, como el siguiente:

    time                 value
    2020-01-01 08:39:23 | 197.95 |
    2020-01-01 08:39:24 | 197.95 |
    ...
    2020-01-01 08:40:37 | 197.95 |
    2020-01-01 08:40:38 | 57.95  |
    2020-01-01 08:40:39 | 57.95  |
    ...
    2020-01-01 08:43:25 | 57.95  | 
    2020-01-01 08:43:26 | 160.00 |  
    2020-01-01 08:43:27 | 160.00 |
    ...
    

    Esta consulta producirá de manera eficiente el resultado deseado sin requerir pasos adicionales ni un tiempo de computación significativo.

    En resumen, para obtener el valor más reciente por segundo de datos de series temporales que tienen una precisión de milisegundos utilizando TimescaleDB, se recomienda utilizar la función time_bucket_gapfill() en lugar de time_bucket() para llenar los huecos en la columna de tiempo. Este enfoque resultará en un procesamiento de datos más eficiente y eliminará pasos intermedios innecesarios.

Comments are closed.