TimeSeries en Informix

TimeseriesInformix

TimeSeries en Informix

La extensión TimeSeries de Informix és una solución para almacenar series temporales. Dicha extensión permite:

  • Definir la estructura de datos
  • Control de la frecuencia de los datos. Limitar la frecuencia a intervalos regulares de tiempo o manejar registros espaciados arbitrariamente.
  • Control del almacenaje. Especificar y alterar dónde se guardan los datos. Monitoreo del espacio usado
  • Análisis de datos. Extraer valores para un intervalo de tiempo.

Ejemplo: Almacenje de datos GPS en un campo TimeSeries

En este ejemplo se guardarán series temporales consistentes en datos obtenidos de un receptor GPS. Los datos en la serie temporal serán las coordenadas GPS, la alitutd, el margen de error de la medida, la velocidad y la dirección de movimiento.

Definir calendario

Antes de crear las tablas, se debe definir una calendario para las series temporales.
En nuestro ejemplo las medidas del GPS no siguen intervalos de tiempo constantes. Sin embargo, es necesario definir un calendario que se vinculará a la serie temporal.
A continución se define un patron de calendario consistente en una medida cada 30 segundos y un calendario con fecha incial 2012-01-01 00:00:00 y que sigue el patrón definido anterirormente.

-- creación del patrón
INSERT INTO CalendarPatterns values ( 'patt_30sec', '{1 on , 29 off}, second');

-- Creación del calendario
INSERT INTO CalendarTable(c_name, c_calendar) values ('cal_30sec', 'startdate(2012-01-01 00:00:00), pattstart(2012-01-01 00:00:00), pattname(patt_30sec)');

Definir tipo de datos

Definimos un tipo que contendrá un datetime en la primera columna y N columnas con datos asociados al datetime. En este caso, los datos serán los proporcionados por el receptor GPS.


CREATE ROW type gps_reading(
    timestamp       DATET YEAR TO FRACTION(5),
    provider        CHAR(6),    
    user_latitude   DECIMAL,
    user_longitude  DECIMAL,
    user_altitude   DECIMAL,
    user_accuracy   DECIMAL,
    user_speed      DECIMAL,
    user_bearing    DECIMAL
);

Definimos una tabla con los campos usuario, id de tracking y la serie temporal de tipo TimeSeries(gps_reading)


CREATE TABLE user_geopos_ts (
    user_code   CHAR(15),
    track_id    INT,
    gps_data    TimeSeries(gps_reading)
);

Definir una tabla virtual

Las tablas virtuales proporcionan una vista relacional sobre los datos de las series temporales.
La tablas virtuales són útiles para visualizar series temporales en un formato simple. Por ejemplo una consulta tipo SQL SELECT contra una
tabla virtual retorna los datos en el formato ordinario, en vez de retornar una columna de tipo TimeSeries .

Crear la tabla virtual


EXECUTE PROCEDURE TSCREATEVIRTUALTAB('virtual_user_geopos_ts', 'user_geopos_ts'); 

Inserción de datos

Incializar el contenedor de datos temporales. En este ejemplo se inicializa para el usuario ‘android’ y el track ‘0’:


INSERT INTO user_geopos_ts VALUES(  'android',0,  TSCREATEIRR('cal_30sec','2012-01-01 00:00:00.00000',100,0,0, NULL)::timeseries(gps_reading) );

La función TSCreateIRR indica que los datos estan distribuidos en intervalos irregulares de tiempo.
Si los intervalos de tiempo fuesen regulares la función a emplear sería TSCreate. Cuando los intervalos són regulares, informix puede optimizar aún más el espacio y el rendimiento.

Existen distintos procedimientos para insertar datos en campos timeseries, en este artículo se empleará la función PutElem definida en el módulo TimeSeries.


UPDATE user_geopos_ts
   SET gps_data = PutElem(gps_data,
                          row('25-08-2013 03:00:00'::datetime year to fraction(5),      -- timestamp
                              'gps',                                                    -- provider 
                               41.4062798023,                                           -- latitude
                               2.1166920662,                                            -- longitude
                               211,                                                     -- altitude
                               9.49,                                                    -- accuracy
                               0.28 ,                                                   -- speed
                               267                                                      -- bearing
                          )::gps_reading)
  WHERE user_code = 'android'  AND track_id =0 ;


UPDATE user_geopos_ts
   SET gps_data = PutElem(gps_data,
                          row('25-08-2013 03:02:34'::datetime year to fraction(5),      -- timestamp
                              'gps',                                                    -- provider 
                               41.415678389,                                            -- latitude
                               2.1327450120,                                            -- longitude
                               217,                                                     -- altitude
                               11.13,                                                   -- accuracy
                               5.71 ,                                                   -- speed
                               234                                                      -- bearing
                          )::gps_reading)
  WHERE user_code = 'android'  AND track_id =0 

Análisis de datos
Visualizar el contenido de la tabla

Se puede visualizar las series temporales haciendo la consulta sobre la tabla virtual:

SELECT * FROM virtual_user_geopos_ts WHERE user_code = 'android' AND track_id = 0

El resultado retornado:

user_code   track_id    timestamp           provider    user_latitude   user_longitude  user_altitude   user_accuracy   user_speed  user_bearing
android     0           22-03-2013 07:55:00 net         41.4031852      2.1508869       0               47.44           0           0
android     0           22-03-2013 12:20:00 net         40.5140494      -3.6770392      0               96              0           0
android     0           22-03-2013 16:50:00 net         41.4062302      2.1167345       0               34              0           0
android     0           22-03-2013 17:02:00 gps         41.4063763618   2.1166491508    195             45.6            0           0
android     0           23-03-2013 16:04:00 gps         41.3981688023   2.1195888519    995             98.35           0           0
android     0           23-03-2013 16:09:00 gps         41.4065802097   2.1178936958    839             45.6            0           0
android     0           23-03-2013 16:14:00 gps         41.4090585709   2.1128082275    332             181.94          0           0
android     0           25-03-2013 09:29:00 net         41.4062322      2.1167354       0               39              0           0
android     0           25-03-2013 10:00:00 net         41.4062603      2.1167493       0               24              0           0