Combinando múltiples datos de series temporales en una matriz numpy 2d

Tengo datos de timeseries de tres sensores diferentes durante un período de un año, los sensores producen un punto de datos aproximadamente cada 3 minutos, los sensores no están sincronizados, por lo que producen una salida de punto de datos en diferentes momentos entre sí.

Estos datos se encuentran en una db sqlite en una tabla de aproximadamente medio millón de registros. Tengo la intención de mostrar estos datos utilizando el gráfico de la biblioteca de gráficos javascript. Ya he producido gráficos de timeseries para cada uno de estos sensores individualmente al hacer una consulta de SQL por nombre de sensor y guardar en csv. Deseo tener un gráfico que muestre todos los puntos de datos, con una línea que represente a cada sensor.

He creado una matriz numpy 2d de tipo cadena llamada ‘minutes_array’ con la primera columna como marcas de tiempo de Unix redondeadas al minuto más cercano que cubre cada minuto desde el inicio de la serie temporal del sensor hasta el final con tres columnas vacías para llenar con datos de cada una de los 3 sensores donde estén disponibles.

minutos_array

 [['1316275620' '' '' ''] ['1316275680' '' '' ''] ['1316275740' '' '' ''] ..., ['1343206920' '' '' ''] ['1343206980' '' '' ''] ['1343207040' '' '' '']] 

Los datos de la serie temporal del sensor también se redondean al minuto más cercano y uso numpy.in1d ​​y tomo las marcas de tiempo de la matriz ‘minutes_array’ y ‘sensor_data’ anteriores y creo una máscara para los registros relacionados con ese sensor.

datos del sensor

 [['1316275680' '215.2'] ['1316275860' '227.0'] ['1316276280' '212.2'] ..., ['1343206380' '187.7'] ['1343206620' '189.4'] ['1343206980' '192.9']] mask = np.in1d(minutes_array[:,0], sensor_data[:,0]) [False True False ..., False True False] 

Luego deseo modificar los registros en la matriz de minutos que son verdaderos para esa máscara y colocar el valor sensor_data en la primera columna después de la marca de tiempo en la matriz de minutos. A partir de mis bashs, no parece posible alterar el original ‘minutes_array’ cuando se le aplica una máscara, ¿hay alguna forma de lograr este resultado en números sin usar bucles y marcas de tiempo coincidentes individualmente?

Resuelto

Basado en la respuesta a continuación de @eumiro, utilicé una solución de Pandas Docs y la matriz numpy ‘sensor_data’ descrita anteriormente

 sensors = ['s1','s2','s3'] sensor_results = {} for sensor in sensors: sensor_data = get_array(db_cursor, sensor) sensor_results[sensor] = pd.Series(sensor_data[:,1], \ index=sensor_data[:,0]) df = pd.DataFrame(buoy_results) df.to_csv("output.csv") 

Medio millón no es un número que no puedas administrar con un diccionario de Python.

Lea los datos de todos los sensores de la base de datos, complete un diccionario y luego cree una matriz numpy, o incluso mejor, conviértalo a pandas.Data de datos :

 import pandas as pd inp1 = [(1316275620, 1), (1316275680, 2)] inp2 = [(1316275620, 10), (1316275740, 20)] inp3 = [(1316275680, 100), (1316275740, 200)] inps = [('s1', inp1), ('s2', inp2), ('s3', inp3)] data = {} for name, inp in inps: d = data.setdefault(name, {}) for timestamp, value in inp: d[timestamp] = value df = pd.DataFrame.from_dict(data) 

df es ahora:

  s1 s2 s3 1316275620 1 10 NaN 1316275680 2 NaN 100 1316275740 NaN 20 200