2012-05-24 19 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 

简化版本为0.5的误差会是这样的:

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

我知道道格拉斯 - 普克算法GIS数据但我不知道如何将它应用于时间序列数据,因为轴有不同的单位。如果我可以在数据库中完成所有操作,那将会非常棒。

+0

这不是一个真正的形状相同,是吗?例如,如果它是一个方波“1,0 2,0 3,0 4,0 5,0 6,10”,并且你将它改为“1,0 6,10”,那么你将会产生一个斜率;你需要保持两个端点的斜率不变。 – Phrogz

+0

@Progrog这是真的,但如果你有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 @的CTE来计算增量(应该是最快的)。

只有那些行保留,其中增量中的至少一个是大于0.2(符合例如任意的阈值)。

第一行和最后一行是delta1delta2NULL(无前导/落后行)的特殊情况。我们希望在任何情况下都包含这些行,所以我将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

拉默道格拉斯·普克将在这里工作 - 单位应该是一个问题。