【原创】保留时序数据波动细节的一种采样算法

1,为什么要对时序数据进行采样?

首先复习一下时序数据的概念,随着时间的变化而不断产生新的数据的数列被称为时序数据,时序数据常见于监控场景,例如服务器的CPU使用率、内存使用率等指标数据。
时序数据的一大特点就是数据随着时间往往会快速的跳动,例如下图:


原始时序数据

从图中可以看到,由于数据点数太密,且波动非常频繁,将所有数据点通过折线依次连接后已经重叠在了一次,可视化效果很差,这就需要对原始的数据点进行采样,比如将10000个原始数据点采样为200个数据点。

2,传统时序数据采样算法的缺陷

简单的数据采样算法是求平均、最大、最小等统计值,比如上面举到的10000个原始数据点采样为200个数据点的例子,可以将原始数据点划分为200个小组,每个小组包含50个原始数据点(200*50=10000),然后每个小组中对所有原始数据点求平均值,这样就获得了采样后的200个数据点。
这种算法很简单,但存在一个问题,就是丢失了很多原始数据波动变化的细节,如下图:


传统采样算法效果

图中灰色线条为原始数据,很色线条为采样后数据,可以看到数据采样后变的更加平滑,很多细节都丢失了。尤其是红框中原始数据的一个非常明显的峰值直接被抹掉了,而这个峰值很可能代表了业务异常。

3,一种可以保留时序数据波动细节的算法

论文Downsampling Time Series for Visual Representation中提到了一种数据采样算法LTTB(还有其它几种类似的算法,详见论文),可以在采样的同时保留原始数据的波动细节,具体原理不展开,这里展示下算法效果。

未采样的原始数据

使用LTTB算法采样后的数据(7500->500)

可以看到经过采样后,原始数据整体的波动情况被完整保留下来,只丢失了个别细小的波动,远远优于传统的采样算法。
这里有一个在线demo,能够更直观的体验这种算法:https://www.base.is/flot/

4,算法应用场景

可以广泛应用与监控类产品,能够很好的解决如下两类问题:

  • 原始数据点数过多导致存储及计算成本过高:对于监控来讲,原始数据的量是非常大的,然而这些数据的价值密度往往很低,有价值的地方主要在与整体趋势和数据波动情况,通过合理的采样算法能够提升数据的价值密度,降低成本
  • 用户一次观测的数据时间范围有限:如果数据不采样或采样丢失了大量数据波动细节,用户每次观测数据只能选择较小的时间范围,比如1小时,极大的影响分析效率。结合合理的采样算法能为用户一次呈现更大时间范围的数据,提升效率。

你可能感兴趣的:(【原创】保留时序数据波动细节的一种采样算法)