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.
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 detime_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.Esto devolverá un conjunto de resultados sin huecos en la columna de tiempo, como el siguiente:
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 detime_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.