异常检测

IQR

函数简介

本函数用于检验超出上下四分位数1.5倍IQR的数据分布异常。

函数名: IQR

输入序列: 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。

参数:

  • method:若设置为 “batch”,则将数据全部读入后检测;若设置为 “stream”,则需用户提供上下四分位数进行流式检测。默认为 “batch”。
  • q1:使用流式计算时的下四分位数。
  • q3:使用流式计算时的上四分位数。

输出序列:输出单个序列,类型为 DOUBLE。

说明:$IQR=Q_3-Q_1$

使用示例

全数据计算

输入序列:

  1. +-----------------------------+------------+
  2. | Time|root.test.s1|
  3. +-----------------------------+------------+
  4. |1970-01-01T08:00:00.100+08:00| 0.0|
  5. |1970-01-01T08:00:00.200+08:00| 0.0|
  6. |1970-01-01T08:00:00.300+08:00| 1.0|
  7. |1970-01-01T08:00:00.400+08:00| -1.0|
  8. |1970-01-01T08:00:00.500+08:00| 0.0|
  9. |1970-01-01T08:00:00.600+08:00| 0.0|
  10. |1970-01-01T08:00:00.700+08:00| -2.0|
  11. |1970-01-01T08:00:00.800+08:00| 2.0|
  12. |1970-01-01T08:00:00.900+08:00| 0.0|
  13. |1970-01-01T08:00:01.000+08:00| 0.0|
  14. |1970-01-01T08:00:01.100+08:00| 1.0|
  15. |1970-01-01T08:00:01.200+08:00| -1.0|
  16. |1970-01-01T08:00:01.300+08:00| -1.0|
  17. |1970-01-01T08:00:01.400+08:00| 1.0|
  18. |1970-01-01T08:00:01.500+08:00| 0.0|
  19. |1970-01-01T08:00:01.600+08:00| 0.0|
  20. |1970-01-01T08:00:01.700+08:00| 10.0|
  21. |1970-01-01T08:00:01.800+08:00| 2.0|
  22. |1970-01-01T08:00:01.900+08:00| -2.0|
  23. |1970-01-01T08:00:02.000+08:00| 0.0|
  24. +-----------------------------+------------+

用于查询的 SQL 语句:

  1. select iqr(s1) from root.test

输出序列:

  1. +-----------------------------+-----------------+
  2. | Time|iqr(root.test.s1)|
  3. +-----------------------------+-----------------+
  4. |1970-01-01T08:00:01.700+08:00| 10.0|
  5. +-----------------------------+-----------------+

KSigma

函数简介

本函数利用动态 K-Sigma 算法进行异常检测。在一个窗口内,与平均值的差距超过k倍标准差的数据将被视作异常并输出。

函数名: KSIGMA

输入序列: 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE

参数:

  • k:在动态 K-Sigma 算法中,分布异常的标准差倍数阈值,默认值为 3。
  • window:动态 K-Sigma 算法的滑动窗口大小,默认值为 10000。

输出序列: 输出单个序列,类型与输入序列相同。

提示: k 应大于 0,否则将不做输出。

使用示例

指定k

输入序列:

  1. +-----------------------------+---------------+
  2. | Time|root.test.d1.s1|
  3. +-----------------------------+---------------+
  4. |2020-01-01T00:00:02.000+08:00| 0.0|
  5. |2020-01-01T00:00:03.000+08:00| 50.0|
  6. |2020-01-01T00:00:04.000+08:00| 100.0|
  7. |2020-01-01T00:00:06.000+08:00| 150.0|
  8. |2020-01-01T00:00:08.000+08:00| 200.0|
  9. |2020-01-01T00:00:10.000+08:00| 200.0|
  10. |2020-01-01T00:00:14.000+08:00| 200.0|
  11. |2020-01-01T00:00:15.000+08:00| 200.0|
  12. |2020-01-01T00:00:16.000+08:00| 200.0|
  13. |2020-01-01T00:00:18.000+08:00| 200.0|
  14. |2020-01-01T00:00:20.000+08:00| 150.0|
  15. |2020-01-01T00:00:22.000+08:00| 100.0|
  16. |2020-01-01T00:00:26.000+08:00| 50.0|
  17. |2020-01-01T00:00:28.000+08:00| 0.0|
  18. |2020-01-01T00:00:30.000+08:00| NaN|
  19. +-----------------------------+---------------+

用于查询的 SQL 语句:

  1. select ksigma(s1,"k"="1.0") from root.test.d1 where time <= 2020-01-01 00:00:30

输出序列:

  1. +-----------------------------+---------------------------------+
  2. |Time |ksigma(root.test.d1.s1,"k"="3.0")|
  3. +-----------------------------+---------------------------------+
  4. |2020-01-01T00:00:02.000+08:00| 0.0|
  5. |2020-01-01T00:00:03.000+08:00| 50.0|
  6. |2020-01-01T00:00:26.000+08:00| 50.0|
  7. |2020-01-01T00:00:28.000+08:00| 0.0|
  8. +-----------------------------+---------------------------------+

LOF

函数简介

本函数使用局部离群点检测方法用于查找序列的密度异常。将根据提供的第k距离数及局部离群点因子(lof)阈值,判断输入数据是否为离群点,即异常,并输出各点的 LOF 值。

函数名: LOF

输入序列: 多个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE

参数:

  • method:使用的检测方法。默认为 default,以高维数据计算。设置为 series,将一维时间序列转换为高维数据计算。
  • k:使用第k距离计算局部离群点因子.默认为 3。
  • window:每次读取数据的窗口长度。默认为 10000.
  • windowsize:使用series方法时,转化高维数据的维数,即单个窗口的大小。默认为 5。

输出序列: 输出单时间序列,类型为DOUBLE。

提示: 不完整的数据行会被忽略,不参与计算,也不标记为离群点。

使用示例

默认参数

输入序列:

  1. +-----------------------------+---------------+---------------+
  2. | Time|root.test.d1.s1|root.test.d1.s2|
  3. +-----------------------------+---------------+---------------+
  4. |1970-01-01T08:00:00.100+08:00| 0.0| 0.0|
  5. |1970-01-01T08:00:00.200+08:00| 0.0| 1.0|
  6. |1970-01-01T08:00:00.300+08:00| 1.0| 1.0|
  7. |1970-01-01T08:00:00.400+08:00| 1.0| 0.0|
  8. |1970-01-01T08:00:00.500+08:00| 0.0| -1.0|
  9. |1970-01-01T08:00:00.600+08:00| -1.0| -1.0|
  10. |1970-01-01T08:00:00.700+08:00| -1.0| 0.0|
  11. |1970-01-01T08:00:00.800+08:00| 2.0| 2.0|
  12. |1970-01-01T08:00:00.900+08:00| 0.0| null|
  13. +-----------------------------+---------------+---------------+

用于查询的 SQL 语句:

  1. select lof(s1,s2) from root.test.d1 where time<1000

输出序列:

  1. +-----------------------------+-------------------------------------+
  2. | Time|lof(root.test.d1.s1, root.test.d1.s2)|
  3. +-----------------------------+-------------------------------------+
  4. |1970-01-01T08:00:00.100+08:00| 3.8274824267668244|
  5. |1970-01-01T08:00:00.200+08:00| 3.0117631741126156|
  6. |1970-01-01T08:00:00.300+08:00| 2.838155437762879|
  7. |1970-01-01T08:00:00.400+08:00| 3.0117631741126156|
  8. |1970-01-01T08:00:00.500+08:00| 2.73518261244453|
  9. |1970-01-01T08:00:00.600+08:00| 2.371440975708148|
  10. |1970-01-01T08:00:00.700+08:00| 2.73518261244453|
  11. |1970-01-01T08:00:00.800+08:00| 1.7561416374270742|
  12. +-----------------------------+-------------------------------------+

诊断一维时间序列

输入序列:

  1. +-----------------------------+---------------+
  2. | Time|root.test.d1.s1|
  3. +-----------------------------+---------------+
  4. |1970-01-01T08:00:00.100+08:00| 1.0|
  5. |1970-01-01T08:00:00.200+08:00| 2.0|
  6. |1970-01-01T08:00:00.300+08:00| 3.0|
  7. |1970-01-01T08:00:00.400+08:00| 4.0|
  8. |1970-01-01T08:00:00.500+08:00| 5.0|
  9. |1970-01-01T08:00:00.600+08:00| 6.0|
  10. |1970-01-01T08:00:00.700+08:00| 7.0|
  11. |1970-01-01T08:00:00.800+08:00| 8.0|
  12. |1970-01-01T08:00:00.900+08:00| 9.0|
  13. |1970-01-01T08:00:01.000+08:00| 10.0|
  14. |1970-01-01T08:00:01.100+08:00| 11.0|
  15. |1970-01-01T08:00:01.200+08:00| 12.0|
  16. |1970-01-01T08:00:01.300+08:00| 13.0|
  17. |1970-01-01T08:00:01.400+08:00| 14.0|
  18. |1970-01-01T08:00:01.500+08:00| 15.0|
  19. |1970-01-01T08:00:01.600+08:00| 16.0|
  20. |1970-01-01T08:00:01.700+08:00| 17.0|
  21. |1970-01-01T08:00:01.800+08:00| 18.0|
  22. |1970-01-01T08:00:01.900+08:00| 19.0|
  23. |1970-01-01T08:00:02.000+08:00| 20.0|
  24. +-----------------------------+---------------+

用于查询的 SQL 语句:

  1. select lof(s1, "method"="series") from root.test.d1 where time<1000

输出序列:

  1. +-----------------------------+--------------------+
  2. | Time|lof(root.test.d1.s1)|
  3. +-----------------------------+--------------------+
  4. |1970-01-01T08:00:00.100+08:00| 3.77777777777778|
  5. |1970-01-01T08:00:00.200+08:00| 4.32727272727273|
  6. |1970-01-01T08:00:00.300+08:00| 4.85714285714286|
  7. |1970-01-01T08:00:00.400+08:00| 5.40909090909091|
  8. |1970-01-01T08:00:00.500+08:00| 5.94999999999999|
  9. |1970-01-01T08:00:00.600+08:00| 6.43243243243243|
  10. |1970-01-01T08:00:00.700+08:00| 6.79999999999999|
  11. |1970-01-01T08:00:00.800+08:00| 7.0|
  12. |1970-01-01T08:00:00.900+08:00| 7.0|
  13. |1970-01-01T08:00:01.000+08:00| 6.79999999999999|
  14. |1970-01-01T08:00:01.100+08:00| 6.43243243243243|
  15. |1970-01-01T08:00:01.200+08:00| 5.94999999999999|
  16. |1970-01-01T08:00:01.300+08:00| 5.40909090909091|
  17. |1970-01-01T08:00:01.400+08:00| 4.85714285714286|
  18. |1970-01-01T08:00:01.500+08:00| 4.32727272727273|
  19. |1970-01-01T08:00:01.600+08:00| 3.77777777777778|
  20. +-----------------------------+--------------------+

MissDetect

函数简介

本函数用于检测数据中的缺失异常。在一些数据中,缺失数据会被线性插值填补,在数据中出现完美的线性片段,且这些片段往往长度较大。本函数通过在数据中发现这些完美线性片段来检测缺失异常。

函数名: MISSDETECT

输入序列: 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。

参数:

  • minlen:被标记为异常的完美线性片段的最小长度,是一个大于等于 10 的整数,默认值为 10。

输出序列: 输出单个序列,类型为 BOOLEAN,即该数据点是否为缺失异常。

提示: 数据中的NaN将会被忽略。

使用示例

输入序列:

  1. +-----------------------------+---------------+
  2. | Time|root.test.d2.s2|
  3. +-----------------------------+---------------+
  4. |2021-07-01T12:00:00.000+08:00| 0.0|
  5. |2021-07-01T12:00:01.000+08:00| 1.0|
  6. |2021-07-01T12:00:02.000+08:00| 0.0|
  7. |2021-07-01T12:00:03.000+08:00| 1.0|
  8. |2021-07-01T12:00:04.000+08:00| 0.0|
  9. |2021-07-01T12:00:05.000+08:00| 0.0|
  10. |2021-07-01T12:00:06.000+08:00| 0.0|
  11. |2021-07-01T12:00:07.000+08:00| 0.0|
  12. |2021-07-01T12:00:08.000+08:00| 0.0|
  13. |2021-07-01T12:00:09.000+08:00| 0.0|
  14. |2021-07-01T12:00:10.000+08:00| 0.0|
  15. |2021-07-01T12:00:11.000+08:00| 0.0|
  16. |2021-07-01T12:00:12.000+08:00| 0.0|
  17. |2021-07-01T12:00:13.000+08:00| 0.0|
  18. |2021-07-01T12:00:14.000+08:00| 0.0|
  19. |2021-07-01T12:00:15.000+08:00| 0.0|
  20. |2021-07-01T12:00:16.000+08:00| 1.0|
  21. |2021-07-01T12:00:17.000+08:00| 0.0|
  22. |2021-07-01T12:00:18.000+08:00| 1.0|
  23. |2021-07-01T12:00:19.000+08:00| 0.0|
  24. |2021-07-01T12:00:20.000+08:00| 1.0|
  25. +-----------------------------+---------------+

用于查询的SQL语句:

  1. select missdetect(s2,'minlen'='10') from root.test.d2

输出序列:

  1. +-----------------------------+------------------------------------------+
  2. | Time|missdetect(root.test.d2.s2, "minlen"="10")|
  3. +-----------------------------+------------------------------------------+
  4. |2021-07-01T12:00:00.000+08:00| false|
  5. |2021-07-01T12:00:01.000+08:00| false|
  6. |2021-07-01T12:00:02.000+08:00| false|
  7. |2021-07-01T12:00:03.000+08:00| false|
  8. |2021-07-01T12:00:04.000+08:00| true|
  9. |2021-07-01T12:00:05.000+08:00| true|
  10. |2021-07-01T12:00:06.000+08:00| true|
  11. |2021-07-01T12:00:07.000+08:00| true|
  12. |2021-07-01T12:00:08.000+08:00| true|
  13. |2021-07-01T12:00:09.000+08:00| true|
  14. |2021-07-01T12:00:10.000+08:00| true|
  15. |2021-07-01T12:00:11.000+08:00| true|
  16. |2021-07-01T12:00:12.000+08:00| true|
  17. |2021-07-01T12:00:13.000+08:00| true|
  18. |2021-07-01T12:00:14.000+08:00| true|
  19. |2021-07-01T12:00:15.000+08:00| true|
  20. |2021-07-01T12:00:16.000+08:00| false|
  21. |2021-07-01T12:00:17.000+08:00| false|
  22. |2021-07-01T12:00:18.000+08:00| false|
  23. |2021-07-01T12:00:19.000+08:00| false|
  24. |2021-07-01T12:00:20.000+08:00| false|
  25. +-----------------------------+------------------------------------------+

Range

函数简介

本函数用于查找时间序列的范围异常。将根据提供的上界与下界,判断输入数据是否越界,即异常,并输出所有异常点为新的时间序列。

函数名: RANGE

输入序列: 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE

参数:

  • lower_bound:范围异常检测的下界。
  • upper_bound:范围异常检测的上界。

输出序列: 输出单个序列,类型与输入序列相同。

提示: 应满足upper_bound大于lower_bound,否则将不做输出。

使用示例

指定上界与下界

输入序列:

  1. +-----------------------------+---------------+
  2. | Time|root.test.d1.s1|
  3. +-----------------------------+---------------+
  4. |2020-01-01T00:00:02.000+08:00| 100.0|
  5. |2020-01-01T00:00:03.000+08:00| 101.0|
  6. |2020-01-01T00:00:04.000+08:00| 102.0|
  7. |2020-01-01T00:00:06.000+08:00| 104.0|
  8. |2020-01-01T00:00:08.000+08:00| 126.0|
  9. |2020-01-01T00:00:10.000+08:00| 108.0|
  10. |2020-01-01T00:00:14.000+08:00| 112.0|
  11. |2020-01-01T00:00:15.000+08:00| 113.0|
  12. |2020-01-01T00:00:16.000+08:00| 114.0|
  13. |2020-01-01T00:00:18.000+08:00| 116.0|
  14. |2020-01-01T00:00:20.000+08:00| 118.0|
  15. |2020-01-01T00:00:22.000+08:00| 120.0|
  16. |2020-01-01T00:00:26.000+08:00| 124.0|
  17. |2020-01-01T00:00:28.000+08:00| 126.0|
  18. |2020-01-01T00:00:30.000+08:00| NaN|
  19. +-----------------------------+---------------+

用于查询的 SQL 语句:

  1. select range(s1,"lower_bound"="101.0","upper_bound"="125.0") from root.test.d1 where time <= 2020-01-01 00:00:30

输出序列:

  1. +-----------------------------+------------------------------------------------------------------+
  2. |Time |range(root.test.d1.s1,"lower_bound"="101.0","upper_bound"="125.0")|
  3. +-----------------------------+------------------------------------------------------------------+
  4. |2020-01-01T00:00:02.000+08:00| 100.0|
  5. |2020-01-01T00:00:28.000+08:00| 126.0|
  6. +-----------------------------+------------------------------------------------------------------+

TwoSidedFilter

函数简介

本函数基于双边窗口检测法对输入序列中的异常点进行过滤。

函数名: TWOSIDEDFILTER

输出序列: 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE

输出序列: 输出单个序列,类型与输入相同,是输入序列去除异常点后的结果。

参数:

  • len:双边窗口检测法中的窗口大小,取值范围为正整数,默认值为 5.如当len\=3 时,算法向前、向后各取长度为3的窗口,在窗口中计算异常度。
  • threshold:异常度的阈值,取值范围为(0,1),默认值为 0.3。阈值越高,函数对于异常度的判定标准越严格。

使用示例

输入序列:

  1. +-----------------------------+------------+
  2. | Time|root.test.s0|
  3. +-----------------------------+------------+
  4. |1970-01-01T08:00:00.000+08:00| 2002.0|
  5. |1970-01-01T08:00:01.000+08:00| 1946.0|
  6. |1970-01-01T08:00:02.000+08:00| 1958.0|
  7. |1970-01-01T08:00:03.000+08:00| 2012.0|
  8. |1970-01-01T08:00:04.000+08:00| 2051.0|
  9. |1970-01-01T08:00:05.000+08:00| 1898.0|
  10. |1970-01-01T08:00:06.000+08:00| 2014.0|
  11. |1970-01-01T08:00:07.000+08:00| 2052.0|
  12. |1970-01-01T08:00:08.000+08:00| 1935.0|
  13. |1970-01-01T08:00:09.000+08:00| 1901.0|
  14. |1970-01-01T08:00:10.000+08:00| 1972.0|
  15. |1970-01-01T08:00:11.000+08:00| 1969.0|
  16. |1970-01-01T08:00:12.000+08:00| 1984.0|
  17. |1970-01-01T08:00:13.000+08:00| 2018.0|
  18. |1970-01-01T08:00:37.000+08:00| 1484.0|
  19. |1970-01-01T08:00:38.000+08:00| 1055.0|
  20. |1970-01-01T08:00:39.000+08:00| 1050.0|
  21. |1970-01-01T08:01:05.000+08:00| 1023.0|
  22. |1970-01-01T08:01:06.000+08:00| 1056.0|
  23. |1970-01-01T08:01:07.000+08:00| 978.0|
  24. |1970-01-01T08:01:08.000+08:00| 1050.0|
  25. |1970-01-01T08:01:09.000+08:00| 1123.0|
  26. |1970-01-01T08:01:10.000+08:00| 1150.0|
  27. |1970-01-01T08:01:11.000+08:00| 1034.0|
  28. |1970-01-01T08:01:12.000+08:00| 950.0|
  29. |1970-01-01T08:01:13.000+08:00| 1059.0|
  30. +-----------------------------+------------+

用于查询的 SQL 语句:

  1. select TwoSidedFilter(s0, 'len'='5', 'threshold'='0.3') from root.test

输出序列:

  1. +-----------------------------+------------+
  2. | Time|root.test.s0|
  3. +-----------------------------+------------+
  4. |1970-01-01T08:00:00.000+08:00| 2002.0|
  5. |1970-01-01T08:00:01.000+08:00| 1946.0|
  6. |1970-01-01T08:00:02.000+08:00| 1958.0|
  7. |1970-01-01T08:00:03.000+08:00| 2012.0|
  8. |1970-01-01T08:00:04.000+08:00| 2051.0|
  9. |1970-01-01T08:00:05.000+08:00| 1898.0|
  10. |1970-01-01T08:00:06.000+08:00| 2014.0|
  11. |1970-01-01T08:00:07.000+08:00| 2052.0|
  12. |1970-01-01T08:00:08.000+08:00| 1935.0|
  13. |1970-01-01T08:00:09.000+08:00| 1901.0|
  14. |1970-01-01T08:00:10.000+08:00| 1972.0|
  15. |1970-01-01T08:00:11.000+08:00| 1969.0|
  16. |1970-01-01T08:00:12.000+08:00| 1984.0|
  17. |1970-01-01T08:00:13.000+08:00| 2018.0|
  18. |1970-01-01T08:01:05.000+08:00| 1023.0|
  19. |1970-01-01T08:01:06.000+08:00| 1056.0|
  20. |1970-01-01T08:01:07.000+08:00| 978.0|
  21. |1970-01-01T08:01:08.000+08:00| 1050.0|
  22. |1970-01-01T08:01:09.000+08:00| 1123.0|
  23. |1970-01-01T08:01:10.000+08:00| 1150.0|
  24. |1970-01-01T08:01:11.000+08:00| 1034.0|
  25. |1970-01-01T08:01:12.000+08:00| 950.0|
  26. |1970-01-01T08:01:13.000+08:00| 1059.0|
  27. +-----------------------------+------------+