写点什么

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

作者:CnosDB
  • 2024-05-26
    内蒙古
  • 本文字数:3055 字

    阅读完需:约 10 分钟

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                         |    +------------------------------+
复制代码

 

发布于: 2024-05-26阅读数: 3
用户头像

CnosDB

关注

还未添加个人签名 2022-04-18 加入

打造高性能、高压缩比、高可用的分布式云原生时间序列数据库,引领世界迈向万物智联 欢迎关注 https://www.cnosdb.com

评论

发布
暂无评论
CnosDB:深入理解时序数据质量函数_开源_CnosDB_InfoQ写作社区