2012-05-24 5 views
3

У меня есть данные временного ряда. Я ищу упростить (уменьшите количество точек при сохранении одинаковой формы графика). Например, если у меня был этот набор данных:Сокращение/упрощение данных временных рядов

Time: 1, Value: 5 
Time: 6, Value: 5 
Time: 11, Value: 5.1 
Time: 12, Value: 5 
Time: 20, Value: 5.2 
Time: 22, Value: 6 
Time: 23, Value: 10 

Упрощенная версия с допуском .5 будет что-то вроде:

Time: 1, Value: 5 
Time: 20, Value: 5.2 
Time: 22, Value: 6 
Time: 23, Value: 10 

Я знаю алгоритма Дуглас-Peucker для данных ГИС но я не уверен, как применить его к данным временного ряда, поскольку в осях есть разные единицы. Было бы здорово, если бы я мог сделать все это в базе данных.

+0

Это не такая же форма, не так ли? Например, если это была прямоугольная волна '1,0 2,0 3,0 4,0 5,0 6,10', и вы изменили ее на' 1,0 6,10', вы собираетесь сделать наклон ; вам нужно поддерживать обе конечные точки вдоль постоянного наклона. – Phrogz

+0

@Phrogz Это правда, но если бы у вас было 1,0 5,0 6,10, это была бы такая же форма. В идеале было бы немного терпимости, поэтому я отфильтровал 3, 5,1 в моем примере выше. – Mike

ответ

1

Я бы не знал о встроенной функции для этого. Этот запрос может сделать работу:

WITH x AS (
    SELECT t, val 
      ,@(lead(val) OVER w - val) AS delta1 
      ,@(lag(val) OVER w - val) AS delta2 
    FROM tbl 
    WINDOW w AS (ORDER BY t) 
    ORDER BY t 
    ) 
SELECT t, val 
FROM x 
WHERE delta1 > 0.2 
    OR delta2 > 0.2 
    OR delta1 IS NULL 
    OR delta2 IS NULL; 

Я использую window functions lead() and lag() и absolute value operator @ в КТР для расчета дельты (должно быть быстрым).

Только те строки хранятся, где по крайней мере одна из дельт больше 0.2 (произвольный порог, соответствующий вашему примеру).

Первый и последний ряд являются частными случаями, в которых delta1 или delta2 являются NULL (нет ведущей/отстающей строки). Мы хотим включить эти строки в любом случае, поэтому я добавляю NULL-проверки в окончательный SELECT.

Производит результат, который вы запросили.


Другой вариант, который концентрируется на том, сколько изменения направления:

WITH x AS (
    SELECT t, val 
      ,@(lead(val) OVER w + lag(val) OVER w - 2*val) AS deviate 
    FROM tbl 
    WINDOW w AS (ORDER BY t) 
    ORDER BY t 
    ) 
SELECT t, val, deviate 
FROM x 
WHERE deviate > 0.2 
    OR deviate IS NULL; 

Это должно сохранить форму более тесно. Этот пример хранит строку Time: 12, Value: 5 и позволяет избежать эффекта, описанного в комментарии. (Ваш пример в вопросе не указал в этом направлении.)

+0

Это так близко к тому, что мне нужно. Единственная проблема заключается в том, что если бы я имел допущение .5, он возвращал бы 1,5 20,6 23,10, что изменило бы форму графика ... Чтобы сохранить форму, он должен вернуть 1,5 20,5,2 22, 6, 23, 10. Визуально разница между ними, если бы вы были на графике, - это первый метод, который будет иметь устойчивый восходящий тренд ко второй точке, во втором методе линия будет относительно плоской, а затем внезапно подскочит к третьей точке, которая ближе к исходным данным , – Mike

+0

@Mike: Ваш пример, казалось, сосредоточился на абсолютных значениях. Я добавил вариант с упором на изменение направления. –

1

Ramer Douglas Peucker будет работать здесь - устройства должны быть проблемой.