首页 » 博客 » CnosDB:深入理解时序数据质量函数

CnosDB:深入理解时序数据质量函数

在CnosDB中,我们设计并实现了计算数据质量的多个指标,这些指标可以从多个维度评估时序数据的质量,对于时间戳列,我们考虑数据的缺失点、冗余点和延迟点。对于值列,我们考虑数据的异常值、范围、变化、速度和加速度。

CnosDB:深入理解时序数据质量函数

 

数据质量问题会对数据应用造成巨大影响,严重困扰着信息社会的各个领域。据统计,全球财富1000强公司中超过25%的关键数据存在错误。2009年,戴尔台湾网站将4800元新台币的19寸显示器以500元新台币售出,8小时内下单140万台,造成直接经济损失达60亿新台币。英国一家电话公司因数据错误每年损失6亿英镑。时序数据的获取、存储、传输和计算过程中均可能产生大量错误,如数据不完整、不一致等。其来源和形式上的多样使得数据有更大的可能产生不一致和冲突,数据的更新也会导致过时和不一致数据迅速产生。特别是在物联网场景中。在时序数据管理过程中,从数据的采集到最终将数据存储到时序数据库中,任何一个传感器故障或网络传输错误等问题都可能导致数据质量问题。在没有事先评估数据质量的情况下对脏数据进行分析可能会产生误导性的结果。

CnosDB 是一个专注于时序数据处理的数据库,旨在解决时序数据存储与分析问题,为用户提供高效的时序数据管理与查询便利。在CnosDB中,我们设计并实现了计算数据质量的多个指标,这些指标可以从多个维度评估时序数据的质量,对于时间戳列,我们考虑数据的缺失点、冗余点和延迟点。对于值列,我们考虑数据的异常值、范围、变化、速度和加速度。在CnosDB中,这些指标能通过聚合函数进行计算,其中包括以下四个函数:

completeness

用途

函数 completeness 用于计算时间序列的完整性,其衡量的是数据不缺失的比例。例如,网站日志的日访问量(即COUNT聚合值)就是一个记录值,若平时的日访问量在1000左右,突然某一天降到100了,就需要检查一下数据是否缺失了。

算法简述

函数 completeness 首先统计数据的行数 cnt ,然后考虑了数据列中可能出现的 NaN 和 Inf 的情况,对其进行线性平滑处理,同时统计上述两种特殊值计数 specialcnt ,再通过扫描数据统计缺失计数 misscnt,则完整性 completeness 的计算公式:1 – \frac{misscnt + specialcnt} {cnt + misscnt}。值为0~1之间的数值,越靠近1表示质量越好,越靠近0表示质量越差。

函数用法

completeness(time, value)

参数

  • time:Timestamp
  • value:BIGINT / BIGINT UNSIGNED / DOUBLE

返回类型

  • DOUBLE

示例

创建表 wzz:

CREATE table wzz(value double);
INSERT wzz VALUES (1,  12.34), (3, 34.54 ), (4, 1.43), (6, 14.03), (10, 12.30), (13, 11.54), (14,  112.20), (16, 14.44), (18,  134.02), (19, 116.34), (22, 1234.45),  (24,10.36), (26, 124.21),  (31, 6.34), (33, acos(12345));

最后一个数据中的 acos(12345) 表示NaN。

SELECT * FROM wzz;

插入数据后,表内数据为:

    +-------------------------------+---------+
    | time                          | val     |
    +-------------------------------+---------+
    | 1970-01-01T00:00:00.000000001 | 12.34   |
    | 1970-01-01T00:00:00.000000003 | 34.54   |
    | 1970-01-01T00:00:00.000000004 | 1.43    |
    | 1970-01-01T00:00:00.000000006 | 14.03   |
    | 1970-01-01T00:00:00.000000010 | 12.3    |
    | 1970-01-01T00:00:00.000000013 | 11.54   |
    | 1970-01-01T00:00:00.000000014 | 112.2   |
    | 1970-01-01T00:00:00.000000016 | 14.44   |
    | 1970-01-01T00:00:00.000000018 | 134.02  |
    | 1970-01-01T00:00:00.000000019 | 116.34  |
    | 1970-01-01T00:00:00.000000022 | 1234.45 |
    | 1970-01-01T00:00:00.000000024 | 10.36   |
    | 1970-01-01T00:00:00.000000026 | 124.21  |
    | 1970-01-01T00:00:00.000000031 | 6.34    |
    | 1970-01-01T00:00:00.000000033 | NaN     |
    +-------------------------------+---------+

查询时序数据的完整性:

SELECT completeness(time, value) FROM wzz;
    +----------------------------------+
    | completeness(wzz.time,wzz.value) |
    +----------------------------------+
    |  0.8235294117647058              |
    +----------------------------------+

consistency

用途

函数 consistency 计算时间序列的一致性,其衡量的是时序数据均匀分布的不密集冗余的比例。例如,气象站的冗余温度传感器可能会造成站点的数据重复采集等。

算法简述

同函数 completeness ,经过缺失值填充后,通过扫描数据统计出冗余计数 redundancy ,则一致性 consistency 的计算公式:

1 – \frac{redundancycnt} {cnt}。值为0~1之间的数值,越靠近1表示质量越好,越靠近0表示质量越差。

参数

  • time: Timestamp
  • value: BIGINT / BIGINT UNSIGNED / DOUBLE

返回类型

  • DOUBLE

示例

建立的表即为函数completeness中示例的表wzz。查询时序数据的一致性:

SELECT consistency(time, value) FROM wzz;
    +---------------------------------+
    | consistency(wzz.time,wzz.value) |
    +---------------------------------+
    |  0.8666666666666667             |
    +---------------------------------+

timeliness

用途

函数 timeliness 用于计算时间序列的时效性,其衡量的是时序数据按时到达不延迟的比例。例如监控数据的时效性场景很多,包括汇聚值报警、查看指标的历史趋势图、实时的数据报表(天/周/季/年的同/环比)、趋势异常检测以及历史数据离线分析等,可以看到,每种场景的查询数据量、数据的分布以及对数据时效性的需求不尽相同,时序数据库需要在这些场景下都能够高效地获取数据。

算法简述

同函数 completeness ,经过缺失值填充后,通过扫描数据统计出延迟计数 latecnt ,则时效性 timeliness 的计算公式:

1 – \frac{latecnt}{cnt}。值为0~1之间的数值,越靠近1表示质量越好,越靠近0表示质量越差。

参数

  • time: Timestamp
  • value: BIGINT / BIGINT UNSIGNED / DOUBLE

返回类型

  • DOUBLE

示例

建立的表即为函数completeness中示例的表wzz。查询时序数据的一致性:

SELECT timeliness(time, value) FROM wzz;
    +--------------------------------+
    | timeliness(wzz.time,wzz.value) |
    +--------------------------------+
    |  0.9333333333333333            |
    +--------------------------------+

validity

用途

函数validity用于计算时间序列的有效性,其衡量的是数据满足约束条件的比例。例如一地的月平均降水量是负值,这必然是有问题的。

算法简述

首先统计数据的行数 cnt ,然后进行缺失值填充,去除其中的 NaN 和 Inf ,然后通过自定义计算方法得到计数 valuecnt、variationcnt、speedcnt、speedchangecnt ,则有效性 validity 的计算公式:

1 – \frac{0.25 * (valuecnt + variationcnt + speedcnt + speedchangecnt)}{cnt}。值为0~1之间的数值,越靠近1表示质量越好,越靠近0表示质量越差。

参数

  • time: Timestamp
  • value: BIGINT / BIGINT UNSIGNED / DOUBLE

返回类型

  • DOUBLE

示例

建立的表即为函数completeness中示例的表wzz。查询时序数据的有效性:

SELECT validity(time, value) FROM wzz;
    +------------------------------+
    | validity(wzz.time,wzz.value) |
    +------------------------------+
    |  0.8                         |
    +------------------------------+

 

参与 CnosDB 社区交流群:

 

扫描下方二维码,加入 CC 进入 CnosDB 社区交流,CC 也会在群内分享直播链接哒