2013-05-03 2 views
2

У меня около 500 датчиков, которые испускают значение примерно раз в минуту. Можно предположить, что значение для датчика остается постоянным до тех пор, пока не будет выбрано следующее значение, что создаст временной ряд. Датчики не синхронизируются с точки зрения того, когда они испускают данные (поэтому временные метки наблюдения меняются), но все они собираются централизованно и сохраняются на датчик (чтобы обеспечить фильтрацию подмножеством датчиков).Агрегаты таймеров от датчиков

Как я могу создать совокупный временной ряд, который дает сумму данных от датчиков? n (необходимо создать временные ряды в течение 1 дня наблюдений - поэтому необходимо учитывать 24x60x500 наблюдений в день). Расчеты также должны быть быстрыми, предпочтительно работать в < 1s.

Пример - необработанные входные данные:

q)n:10 
q)tbl:([]time:n?.z.t;sensor:n?3;val:n?100.0) 
q)select from tbl 
time   sensor val 
----------------------------  
01:43:58.525 0  33.32978 
04:35:12.181 0  78.75249 
04:35:31.388 0  1.898088  
02:31:11.594 1  16.63539 
07:16:40.320 1  52.34027 
00:49:55.557 2  45.47007 
01:18:57.918 2  42.46532 
02:37:14.070 2  91.98683 
03:48:43.055 2  41.855 
06:34:32.414 2  9.840246 

Выход Я ищу должен показать те же временные метки, а сумма по датчиков. Если у датчика нет записи, определенной в подходящей временной отметке, тогда должно использоваться предыдущее значение (в записях подразумеваются только времена, когда изменяется выход датчика).

Ожидаемые результаты, упорядоченные по времени

time   aggregatedvalue 
----------------------------  
00:49:55.557 45.47007/0 (sensor 0) + 0 (sensor 1) + 45.47007 (sensor 2) 
01:18:57.918 42.46532/0 (sensor 0) + 0 (sensor 1) + 42.46532 (new value on sensor 2) 
01:43:58.525 75.7951 /33.32978 + 0 + 42.46532 
02:31:11.594 92.43049/33.32978 + 16.63539 + 42.46532 
02:37:14.070 141.952 /33.32978 + 16.63539 + 91.98683 
03:48:43.055 91.82017/33.32978 + 16.63539 + 41.855 
04:35:12.181 137.24288/78.75249 + 16.63539 + 41.855 
04:35:31.388 60.388478/1.898088 + 16.63539 + 41.855 
06:34:32.414 28.373724/1.898088 + 16.63539 + 9.840246 
07:16:40.320 64.078604/1.898088 + 52.34027 + 9.840246 

ответ

0

Я предполагаю, что записи приходят для того времени, поэтому TBL будут отсортированы по времени. Если это не так, сначала сортируйте таблицу по времени.

d - словарь последней цены по датчику в каждый момент времени. Решение ниже, вероятно, не самое изящное, и я могу представить себе более эффективный метод, который не требовал бы каждого.

q)d:(`long$())!`float$() 
q)f:{d[x]::y;sum d} 
q)update agg:f'[sensor;val] from tbl 
time   sensor val  agg  
------------------------------------- 
00:34:28.887 2  53.47096 53.47096 
01:05:42.696 2  40.66642 40.66642 
01:26:21.548 1  41.1597 81.82612 
01:53:10.321 1  51.70911 92.37553 
03:42:39.320 1  17.80839 58.47481 
05:15:26.418 2  51.59796 69.40635 
05:47:49.777 0  30.17723 99.58358 
11:32:19.305 0  39.27524 108.6816 
11:37:56.091 0  71.11716 140.5235 
12:09:18.458 1  78.5033 201.2184 

Ваш набор данных из 720 тыс. Записей будет относительно небольшим, поэтому любые агрегаты должны быть под второй. Если вы храните много дней с данными, вы можете рассмотреть некоторые из этих методов (разметка, разбиение и т. Д.), Изложенные в here.

+0

благодарит за быстрый ответ, но не получает выход совершенно прав. Я обновил вопрос с ожидаемым выходом. У меня около 3 лет данных, поэтому вам также нужно будет посмотреть на развёртывание/разбиение. –

+0

только что обновил мой ответ. Как я уже упоминал, есть, вероятно, более эффективные способы сделать это в векторной форме. – user1895961

+0

ОК, что дает правильный выход. К сожалению, нет гарантии приезда (только приблизительный заказ) –

0

Это было время, так как я провел много времени с этим. Помогло бы оно вернуться, после того, как вы проведете большую партию и выполните линейные вычисления интерполяции через определенные промежутки времени и сохраните эти данные. Я работал над данными датчиков, которые поступают упорядоченными по времени, но датчики отправляют данные только тогда, когда данные действительно изменяются. Чтобы ускорить отчетность и другие вычисления, мы фактически собираем данные в определенные периоды (например, 1 секунду, 30 секунд, 1 минута), часто делая усреднение, о котором вы говорите по пути. Пока мы это делаем, мы также выполняем линейную интерполяцию.

Недостатком является то, что для этого требуется дополнительное пространство для хранения. Но прирост производительности значителен.

Похоже, у вас уже есть отличное предлагаемое решение.

Смежные вопросы