From 772cd9bdfa62a5fc1fa443b54f0ed90d49ab6ee1 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 22 Nov 2024 13:45:54 +0800 Subject: [PATCH] doc: remove analysis dir --- .../06-advanced/06-data-analysis/01-arima.md | 54 --- .../06-data-analysis/02-holtwinters.md | 43 --- .../06-data-analysis/03-anomaly-detection.md | 46 --- .../zh/06-advanced/06-data-analysis/addins.md | 170 --------- docs/zh/06-advanced/06-data-analysis/index.md | 322 ------------------ .../06-data-analysis/pic/data-analysis.png | Bin 50231 -> 0 bytes .../06-advanced/06-data-analysis/pic/dir.png | Bin 7286 -> 0 bytes 7 files changed, 635 deletions(-) delete mode 100644 docs/zh/06-advanced/06-data-analysis/01-arima.md delete mode 100644 docs/zh/06-advanced/06-data-analysis/02-holtwinters.md delete mode 100644 docs/zh/06-advanced/06-data-analysis/03-anomaly-detection.md delete mode 100644 docs/zh/06-advanced/06-data-analysis/addins.md delete mode 100644 docs/zh/06-advanced/06-data-analysis/index.md delete mode 100644 docs/zh/06-advanced/06-data-analysis/pic/data-analysis.png delete mode 100644 docs/zh/06-advanced/06-data-analysis/pic/dir.png diff --git a/docs/zh/06-advanced/06-data-analysis/01-arima.md b/docs/zh/06-advanced/06-data-analysis/01-arima.md deleted file mode 100644 index b9d63e924f..0000000000 --- a/docs/zh/06-advanced/06-data-analysis/01-arima.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "ARIMA" -sidebar_label: "ARIMA" ---- - -本节讲述 ARIMA 算法模型的使用方法。 - -## 功能概述 - -ARIMA 即自回归移动平均模型(Autoregressive Integrated Moving Average, ARIMA),也记作 ARIMA(p,d,q),是统计模型中最常见的一种用来进行时间序列预测的模型。 -ARIMA 模型是一种自回归模型,只需要自变量即可预测后续的值。ARIMA 模型要求时间序列**平稳**,或经过差分处理后平稳,如果是不平稳的数据,**无法**获得正确的结果。 - ->平稳的时间序列:其性质不随观测时间的变化而变化。具有趋势或季节性的时间序列不是平稳时间序列——趋势和季节性使得时间序列在不同时段呈现不同性质。 - -以下参数可以动态输入,控制预测过程中生成合适的 ARIMA 模型。 - -- p= 自回归模型阶数 -- d= 差分阶数 -- q= 移动平均模型阶数 - - -### 参数 -分析平台中使用自动化的 ARIMA 模型进行计算,因此每次计算的时候会根据输入的数据自动拟合最合适的模型,然后根据该模型进行预测输出结果。 -|参数|说明|必填项| -|---|---|-----| -|period|输入时间序列每个周期包含的数据点个数,如果不设置该参数或该参数设置为 0,将使用非季节性/周期性的 ARIMA 模型预测|选填| -|start_p|自回归模型阶数的起始值,0 开始的整数,不推荐大于 10|选填| -|max_p|自回归模型阶数的结束值,0 开始的整数,不推荐大于 10|选填| -|start_q|移动平均模型阶数的起始值,0 开始的整数,不推荐大于 10|选填| -|max_q|移动平均模型阶数的结束值,0 开始的整数,不推荐大于 10|选填| -|d|差分阶数|选填| - -`start_p`、`max_p` `start_q` `max_q` 四个参数约束了模型在多大的范围内去搜寻合适的最优解。相同输入数据的条件下,参数范围越大,消耗的资源越多,系统响应的时间越长。 - -### 示例及结果 -针对 i32 列进行数据预测,输入列 i32 每 10 个点是一个周期,start_p 起始是 1, 最大拟合是 5,start_q 是 1,最大值是 5,预测结果中返回 95% 置信区间范围边界。 -``` -FORECAST(i32, "algo=arima,alpha=95,period=10,start_p=1,max_p=5,start_q=1,max_q=5") -``` - -```json5 -{ -"rows": fc_rows, // 返回结果的行数 -"period": period, // 返回结果的周期性,同输入 -"alpha": alpha, // 返回结果的置信区间,同输入 -"algo": "arima", // 返回结果使用的算法 -"mse": mse, // 拟合输入时间序列时候生成模型的最小均方误差(MSE) -"res": res // 列模式的结果 -} -``` - -### 参考文献 -- https://en.wikipedia.org/wiki/Autoregressive_moving-average_model -- https://baike.baidu.com/item/%E8%87%AA%E5%9B%9E%E5%BD%92%E6%BB%91%E5%8A%A8%E5%B9%B3%E5%9D%87%E6%A8%A1%E5%9E%8B/5023931?fromtitle=ARMA%E6%A8%A1%E5%9E%8B&fromid=8048415 diff --git a/docs/zh/06-advanced/06-data-analysis/02-holtwinters.md b/docs/zh/06-advanced/06-data-analysis/02-holtwinters.md deleted file mode 100644 index 38662ca2b3..0000000000 --- a/docs/zh/06-advanced/06-data-analysis/02-holtwinters.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "HoltWinters" -sidebar_label: "HoltWinters" ---- - -本节讲述 HoltWinters 算法模型的使用方法。 - -## 功能概述 -HoltWinters 模型又称为多次指数平滑模型(EMA)。适用于含有线性趋势和周期波动的非平稳序列,利用指数平滑法让模型参数不断适应非平稳序列的变化,并对未来趋势进行**短期**预测。 -HoltWinters 有两种不同的季节性组成部分,当季节变化在该时间序列中大致保持不变时,通常选择**加法模型**;而当季节变化与时间序列的水平成比例变化时,通常选择**乘法模型**。 -该模型对于返回数据不提供计算的置信区间范围结果,在 95% 置信区间的上下界结果与预测结果相同。 - - -### 参数 - -分析平台中使用自动化的 HoltWinters 模型进行计算,因此每次计算的时候会根据输入的数据自动拟合最合适的模型,然后根据该模型进行预测输出结果。 -|参数|说明|必填项| -|---|---|---| -|period|输入时间序列每个周期包含的数据点个数。如果不设置该参数或该参数设置为 0,将使用一次(简单)指数平滑方式进行数据拟合,并据此进行未来数据的预测|选填| -|trend|趋势模型使用加法模型还是乘法模型|选填| -|seasonal|季节性采用加法模型还是乘法模型|选填| - -参数 `trend` 和 `seasonal`的均可以选择 `add` (加法模型)或 `mul`(乘法模型)。 - -### 示例及结果 -针对 i32 列进行数据预测,输入列 i32 每 10 个点是一个周期,趋势采用乘法模型,季节采用乘法模型 -``` -FORECAST(i32, "algo=holtwinters,period=10,trend=mul,seasonal=mul") -``` - -```json5 -{ -"rows": rows, // 返回结果的行数 -"period": period, // 返回结果的周期性,该结果与输入的周期性相同,如果没有周期性,该值为 0 -"algo": 'holtwinters' // 返回结果使用的计算模型 -"mse": mse, // 最小均方误差(minmum square error) -"res": res // 具体的结果,按照列形式返回的结果。一般意义上包含了两列 [timestamp][fc_results]。 -} -``` - -### 参考文献 -- https://en.wikipedia.org/wiki/Exponential_smoothing -- https://orangematter.solarwinds.com/2019/12/15/holt-winters-forecasting-simplified/ diff --git a/docs/zh/06-advanced/06-data-analysis/03-anomaly-detection.md b/docs/zh/06-advanced/06-data-analysis/03-anomaly-detection.md deleted file mode 100644 index bdfa455ae3..0000000000 --- a/docs/zh/06-advanced/06-data-analysis/03-anomaly-detection.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Anomaly-detection" -sidebar_label: "Anomaly-detection" ---- - -本节讲述异常检测算法模型的使用方法。 - -## 概述 -分析平台提供了 6 种异常检查模型,6 种异常检查模型分为 3 个类别,分别属于基于统计的异常检测模型、基于数据密度的检测模型、基于深度学习的异常检测模型。在不指定异常检测使用的方法的情况下,默认调用 iqr 的方法进行计算。 - - -### 统计学异常检测方法 - -- k-sigma[1]: 即 ***68–95–99.7 rule*** 。***k***值默认为 3,即序列均值的 3 倍标准差范围为边界,超过边界的是异常值。KSigma 要求数据整体上服从正态分布,如果一个点偏离均值 K 倍标准差,则该点被视为异常点. - -|参数|说明|是否必选|默认值| -|---|---|---|---| -|k|标准差倍数|选填|3| - - -- IQR[2]:四分位距 (Interquartile range, IQR) 是一种衡量变异性的方法. 四分位数将一个按等级排序的数据集划分为四个相等的部分。即 Q1(第 1 个四分位数)、Q2(第 2 个四分位数)和 Q3(第 3 个四分位数)。IQR 定义为 Q3–Q1,位于 Q3+1.5。无输入参数。 - -- Grubbs[3]: 又称为 Grubbs' test,即最大标准残差测试。Grubbs 通常用作检验最大值、最小值偏离均值的程度是否为异常,该单变量数据集遵循近似标准正态分布。非正态分布数据集不能使用该方法。无输入参数。 - -- SHESD[4]: 带有季节性的 ESD 检测算法。ESD 可以检测时间序列数据的多异常点。需要指定异常点比例的上界***k***,最差的情况是至多 49.9%。数据集的异常比例一般不超过 5% - -|参数|说明|是否必选|默认值| -|---|---|---|---| -|k|异常点在输入数据集中占比,范围是$`1\le K \le 49.9`$ |选填|5| - - -### 基于数据密度的检测方法 -LOF[5]: 局部离群因子(LOF,又叫局部异常因子)算法是 Breunig 于 2000 年提出的一种基于密度的局部离群点检测算法,该方法适用于不同类簇密度分散情况迥异的数据。根据数据点周围的数据密集情况,首先计算每个数据点的一个局部可达密度,然后通过局部可达密度进一步计算得到每个数据点的一个离群因子,该离群因子即标识了一个数据点的离群程度,因子值越大,表示离群程度越高,因子值越小,表示离群程度越低。最后,输出离群程度最大的 top(n) 个点。 - - -### 基于深度学习的检测方法 -使用自动编码器的异常检测模型。可以对具有周期性的数据具有较好的检测结果。但是使用该模型需要针对输入的时序数据进行训练,同时将训练完成的模型部署到服务目录中,才能够运行与使用。 - - -### 参考文献 -1. https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule -2. https://en.wikipedia.org/wiki/Interquartile_range -3. Adikaram, K. K. L. B.; Hussein, M. A.; Effenberger, M.; Becker, T. (2015-01-14). "Data Transformation Technique to Improve the Outlier Detection Power of Grubbs's Test for Data Expected to Follow Linear Relation". Journal of Applied Mathematics. 2015: 1–9. doi:10.1155/2015/708948. -4. Hochenbaum, O. S. Vallis, and A. Kejariwal. 2017. Automatic Anomaly Detection in the Cloud Via Statistical Learning. arXiv preprint arXiv:1704.07706 (2017). -5. Breunig, M. M.; Kriegel, H.-P.; Ng, R. T.; Sander, J. (2000). LOF: Identifying Density-based Local Outliers (PDF). Proceedings of the 2000 ACM SIGMOD International Conference on Management of Data. SIGMOD. pp. 93–104. doi:10.1145/335191.335388. ISBN 1-58113-217-4. - diff --git a/docs/zh/06-advanced/06-data-analysis/addins.md b/docs/zh/06-advanced/06-data-analysis/addins.md deleted file mode 100644 index c0b8921718..0000000000 --- a/docs/zh/06-advanced/06-data-analysis/addins.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: "addins" -sidebar_label: "addins" ---- - -本节说明如何将自己开发的预测算法和异常检测算法整合到 TDengine 分析平台,并能够通过 SQL 语句进行调用。 - -## 目录结构 - -![数据分析功能架构图](./pic/dir.png) - -|目录|说明| -|---|---| -|taos|Python 源代码目录,其下包含了算法具体保存目录 algo,放置杂项目录 misc,单元测试和集成测试目录 test。 algo 目录下 ad 放置异常检测算法代码,fc 放置预测算法代码| -|script|是安装脚本和发布脚本放置目录| -|model|放置针对数据集完成的训练模型| -|cfg|配置文件目录| - -## 约定与限制 - -定义异常检测算法的 Python 代码文件需放在 /taos/algo/ad 目录中,预测算法 Python 代码文件需要放在 /taos/algo/fc 目录中,以确保系统启动的时候能够正常加载对应目录下的 Python 文件。 - - -### 类命名规范 - -算法类的名称需要以下划线开始,以 Service 结尾。例如:_KsigmaService 是 KSigma 异常检测算法的实现类。 - -### 类继承约定 - -- 异常检测算法需要从 `AbstractAnomalyDetectionService` 继承,并实现其核心抽象方法 `execute` -- 预测算法需要从 `AbstractForecastService` 继承,同样需要实现其核心抽象方法 `execute` - -### 类属性初始化 -每个算法实现的类需要静态初始化两个类属性,分别是: - -- `name`:触发调用的关键词,全小写英文字母 -- `desc`:算法的描述信息 - -### 核心方法输入与输出约定 - -`execute` 是算法处理的核心方法。调用该方法的时候,`self.list` 已经设置好输入数组。 - -异常检测输出结果 - -`execute` 的返回值是长度与 `self.list` 相同的数组,数组位置为 -1 的即为异常值点。例如:输入数组是 [2, 2, 2, 2, 100], 如果 100 是异常点,那么返回值是 [1, 1, 1, 1, -1]。 - -预测输出结果 - -对于预测算法,`AbstractForecastService` 的对象属性说明如下: - -|属性名称|说明|默认值| -|---|---|---| -|period|输入时间序列的周期性,多少个数据点表示一个完整的周期。如果没有周期性,那么设置为 0 即可| 0| -|start_ts|预测结果的开始时间| 0| -|time_step|预测结果的两个数据点之间时间间隔|0 | -|fc_rows|预测结果的数量| 0 | -|return_conf|预测结果中是否包含置信区间范围,如果不包含置信区间,那么上界和下界与自身相同| 1| -|conf|置信区间分位数 0.05| - - -预测返回结果如下: -```python -return { - "rows": self.fc_rows, # 预测数据行数 - "period": self.period, # 数据周期性,同输入 - "algo": "holtwinters", # 预测使用的算法 - "mse": mse, # 预测算法的 mse - "res": res # 结果数组 [时间戳数组, 预测结果数组, 预测结果执行区间下界数组,预测结果执行区间上界数组] -} -``` - - -## 示例代码 - -```python -import numpy as np -from service import AbstractAnomalyDetectionService - -# 算法实现类名称 需要以下划线 "_" 开始,并以 Service 结束,如下 _IqrService 是 IQR 异常检测算法的实现类。 -class _IqrService(AbstractAnomalyDetectionService): - """ IQR algorithm 定义类,从 AbstractAnomalyDetectionService 继承,并实现 AbstractAnomalyDetectionService 类的抽象函数 """ - - # 定义算法调用关键词,全小写ASCII码(必须添加) - name = 'iqr' - - # 该算法的描述信息(建议添加) - desc = """found the anomaly data according to the inter-quartile range""" - - def __init__(self): - super().__init__() - - def execute(self): - """ execute 是算法实现逻辑的核心实现,直接修改该实现即可 """ - - # self.list 是输入数值列,list 类型,例如:[1,2,3,4,5]。设置 self.list 的方法在父类中已经进行了定义。实现自己的算法,修改该文件即可,以下代码使用自己的实现替换即可。 - #lower = np.quantile(self.list, 0.25) - #upper = np.quantile(self.list, 0.75) - - #min_val = lower - 1.5 * (upper - lower) - #max_val = upper + 1.5 * (upper - lower) - #threshold = [min_val, max_val] - - # 返回值是与输入数值列长度相同的数据列,异常值对应位置是 -1。例如上述输入数据列,返回数值列是 [1, 1, 1, 1, -1],表示 [5] 是异常值。 - return [-1 if k < threshold[0] or k > threshold[1] else 1 for k in self.list] - - - def set_params(self, params): - """该算法无需任何输入参数,直接重载父类该函数,不处理算法参数设置逻辑""" - pass -``` - - -## 单元测试 - -在测试文件目录中的 anomaly_test.py 中增加单元测试用例。 - -```python -def test_iqr(self): - """ 测试 _IqrService 类 """ - s = loader.get_service("iqr") - - # 设置需要进行检测的输入数据 - s.set_input_list(AnomalyDetectionTest.input_list) - - # 测试 set_params 的处理逻辑 - try: - s.set_params({"k": 2}) - except ValueError as e: - self.assertEqual(1, 0) - - r = s.execute() - - # 绘制异常检测结果 - draw_ad_results(AnomalyDetectionTest.input_list, r, "iqr") - - # 检查结果 - self.assertEqual(r[-1], -1) - self.assertEqual(len(r), len(AnomalyDetectionTest.input_list)) -``` - -## 需要模型的算法 - -针对特定数据集,进行模型训练的算法,在训练完成后。需要将训练得到的模型保存在 model 目录中。需要注意的是,针对每个算法,需要建立独立的文件夹。例如 auto_encoder 的训练算法在 model 目录下建立 autoencoder 的目录,使用该算法针对不同数据集训练得到的模型,均需要放置在该目录下。 - -训练完成后的模型,使用 joblib 进行保存。 - -并在 model 目录下建立对应的文件夹存放该模型。 - -保存模型的调用,可参考 encoder.py 的方式,用户通过调用 set_params 方法,并指定参数 `{"model": "ad_encoder_keras"}` 的方式,可以调用该模型进行计算。 - -具体的调用方式如下: - -```python -def test_autoencoder_ad(self): - # 获取特定的算法服务 - s = loader.get_service("ac") - data = self.__load_remote_data_for_ad() - - # 设置异常检查的输入数据 - s.set_input_list(data) - - # 指定调用的模型,该模型是之前针对该数据集进行训练获得 - s.set_params({"model": "ad_encoder_keras"}) - # 执行检查动作,并返回结果 - r = s.execute() - - num_of_error = -(sum(filter(lambda x: x == -1, r))) - self.assertEqual(num_of_error, 109) -``` - diff --git a/docs/zh/06-advanced/06-data-analysis/index.md b/docs/zh/06-advanced/06-data-analysis/index.md deleted file mode 100644 index 2cbea1caba..0000000000 --- a/docs/zh/06-advanced/06-data-analysis/index.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -sidebar_label: 数据分析 -title: 数据分析功能 ---- - -## 概述 - -ANode(Analysis Node)是 TDengine 提供数据分析功能的扩展组件,通过 Restful 接口提供分析服务,拓展 TDengine 的功能,支持时间序列高级分析。 -ANode 是无状态的数据分析节点,集群中可以存在多个 ANode 节点,相互之间没有关联。将 ANode 注册到 TDengine 集群以后,通过 SQL 语句即可调用并完成时序分析任务。 -下图是数据分析的技术架构示意图。 - -![数据分析功能架构图](./pic/data-analysis.png) - -## 安装部署 -### 环境准备 -ANode 要求节点上准备有 Python 3.10 及以上版本,以及相应的 Python 包自动安装组件 Pip,同时请确保能够正常连接互联网。 - -### 安装及卸载 -使用专门的 ANode 安装包 TDengine-enterprise-anode-1.x.x.tar.gz 进行 ANode 的安装部署工作,安装过程与 TDengine 的安装流程一致。 - -```bash -tar -xzvf TDengine-enterprise-anode-1.0.0.tar.gz -cd TDengine-enterprise-anode-1.0.0 -sudo ./install.sh -``` - -卸载 ANode,执行命令 `rmtaosanode` 即可。 - -### 其他 -为了避免 ANode 安装后影响目标节点现有的 Python 库。 ANode 使用 Python 虚拟环境运行,安装后的默认 Python 目录处于 `/var/lib/taos/taosanode/venv/`。为了避免反复安装虚拟环境带来的开销,卸载 ANode 并不会自动删除该虚拟环境,如果您确认不需要 Python 的虚拟环境,可以手动删除。 - -## 启动及停止服务 -安装 ANode 以后,可以使用 `systemctl` 来管理 ANode 的服务。使用如下命令可以启动/停止/检查状态。 - -```bash -systemctl start taosanoded -systemctl stop taosanoded -systemctl status taosanoded -``` - -## 目录及配置说明 -|目录/文件|说明| -|---------------|------| -|/usr/local/taos/taosanode/bin|可执行文件目录| -|/usr/local/taos/taosanode/resource|资源文件目录,链接到文件夹 /var/lib/taos/taosanode/resource/| -|/usr/local/taos/taosanode/lib|库文件目录| -|/var/lib/taos/taosanode/model/|模型文件目录,链接到文件夹 /var/lib/taos/taosanode/model| -|/var/log/taos/taosanode/|日志文件目录| -|/etc/taos/taosanode.ini|配置文件| - -### 配置说明 - -Anode 提供的 RestFul 服务使用 uWSGI 驱动,因此 ANode 和 uWSGI 的配置信息存放在同一个配置文件中,具体如下: - -```ini -[uwsgi] -# charset -env = LC_ALL = en_US.UTF-8 - -# ip:port -http = 127.0.0.1:6050 - -# the local unix socket file than communicate to Nginx -#socket = 127.0.0.1:8001 -#socket-timeout = 10 - -# base directory -chdir = /usr/local/taos/taosanode/lib - -# initialize python file -wsgi-file = /usr/local/taos/taosanode/lib/taos/app.py - -# call module of uWSGI -callable = app - -# auto remove unix Socket and pid file when stopping -vacuum = true - -# socket exec model -#chmod-socket = 664 - -# uWSGI pid -uid = root - -# uWSGI gid -gid = root - -# main process -master = true - -# the number of worker processes -processes = 2 - -# pid file -pidfile = /usr/local/taos/taosanode/taosanode.pid - -# enable threads -enable-threads = true - -# the number of threads for each process -threads = 4 - -# memory useage report -memory-report = true - -# smooth restart -reload-mercy = 10 - -# conflict with systemctl, so do NOT uncomment this -# daemonize = /var/log/taos/taosanode/taosanode.log - -# log directory -logto = /var/log/taos/taosanode/taosanode.log - -# wWSGI monitor port -stats = 127.0.0.1:8387 - -# python virtual environment directory -virtualenv = /usr/local/taos/taosanode/venv/ - -[taosanode] -# default app log file -app-log = /var/log/taos/taosanode/taosanode.app.log - -# model storage directory -model-dir = /usr/local/taos/taosanode/model/ - -# default log level -log-level = DEBUG - -# draw the query results -draw-result = 0 -``` - -**提示** -请勿设置 `daemonize` 参数,该参数会导致 uWSGI 与 systemctl 冲突,从而无法正常启动。 - - -## ANode 基本操作 -### 管理 ANode -#### 创建 ANode -```sql -CREATE ANODE {node_url} -``` -node_url 是提供服务的 ANode 的 IP 和 PORT, 例如:`create anode 'http://localhost:6050'`。启动 ANode 以后如果不注册到 TDengine 集群中,则无法提供正常的服务。不建议 ANode 注册到两个或多个集群中。 - -#### 查看 ANode -列出集群中所有的数据分析节点,包括其 `FQDN`, `PORT`, `STATUS`。 -```sql -SHOW ANODES; -``` - -#### 查看提供的时序数据分析服务 - -```SQL -SHOW ANODES FULL; -``` - -#### 强制刷新集群中的分析算法缓存 -```SQL -UPDATE ANODE {node_id} -UPDATE ALL ANODES -``` - -#### 删除 ANode -```sql -DROP ANODE {anode_id} -``` -删除 ANode 只是将 ANode 从 TDengine 集群中删除,管理 ANode 的启停仍然需要使用`systemctl`命令。 - -### 时序数据分析功能 - -#### 白噪声检查 - -分析平台提供的 Restful 服务要求输入的时间序列不能是白噪声时间序列(White Noise Data, WND)和随机数序列 , 因此针对所有数据均默认进行白噪声检查。当前白噪声检查采用通行的 `Ljung-Box` 检验,`Ljung-Box` 统计量检查过程需要遍历整个输入序列并进行计算。 -如果用户能够明确输入序列一定不是白噪声序列,那么可以通过输入参数,指定预测之前忽略该检查,从而节省分析过程的 CPU 计算资源。 -同时支持独立地针对输入序列进行白噪声检测(该检测功能暂不独立对外开放)。 - - -#### 数据重采样和时间戳对齐 - -分析平台支持将输入数据进行重采样预处理,从而确保输出结果按照用户指定的等间隔进行处理。处理过程分为两种类别: - -- 数据时间戳对齐。由于真实数据可能并非严格按照查询指定的时间戳输入。此时分析平台会自动将数据的时间间隔按照指定的时间间隔进行对齐。例如输入时间序列 [11, 22, 29, 41],用户指定时间间隔为 10,该序列将被对齐重整为以下序列 [10, 20, 30, 40]。 -- 数据时间重采样。用户输入时间序列的采样频率超过了输出结果的频率,例如输入时间序列的采样频率是 5,输出结果的频率是 10,输入时间序列 [0, 5, 10, 15, 20, 25, 30] 将被重采用为间隔 为 10 的序列 [0, 10, 20,30],[5, 15, 25] 处的数据将被丢弃。 - -需要注意的是,数据输入平台不支持缺失数据补齐后进行的预测分析,如果输入时间序列数据 [11, 22, 29, 49],并且用户要求的时间间隔为 10,重整对齐后的序列是 [10, 20, 30, 50] 那么该序列进行预测分析将返回错误。 - - -#### 时序数据异常检测 -异常检测是针对输入的时序数据,使用预设或用户指定的算法确定时间序列中**可能**出现异常的时间序列点,对于时间序列中若干个连续的异常点,将自动合并成为一个连续的(闭区间)异常窗口。对于只有单个点的场景,异常窗口窗口退化成为一个起始时间和结束时间相同的点。 -异常检测生成的异常窗口受检测算法和算法参数的共同影响,对于异常窗口范围内的数据,可以应用 TDengine 提供的聚合和标量函数进行查询或变换处理。 -对于输入时间序列 (1, 20), (2, 22), (3, 91), (4, 120), (5, 18), (6, 19)。系统检测到 (3, 91), (4, 120) 为异常点,那么返回的异常窗口是闭区间 [3, 4]。 - - -##### 语法 - -```SQL -ANOMALY_WINDOW(column_name, option_expr) - -option_expr: {" -algo=expr1 -[,wncheck=1|0] -[,expr2] -"} -``` - -1. `column`:进行时序数据异常检测的输入数据列,当前只支持单列,且只能是数值类型,不能是字符类型(例如:`NCHAR` `VARCHAR` `VARBINARY`等类型),**不支持函数表达式**。 -2. `options`:字符串。其中使用 K=V 调用异常检测算法及与算法相关的参数。采用逗号分隔的 K=V 字符串表示,其中的字符串不需要使用单引号、双引号、或转义号等符号,不能使用中文及其他宽字符。例如:`algo=ksigma,k=2` 表示进行异常检测的算法是 ksigma,该算法接受的输入参数是 2。 -3. 异常检测的结果可以作为外层查询的子查询输入,在 `SELECT` 子句中使用的聚合函数或标量函数与其他类型的窗口查询相同。 -4. 输入数据默认进行白噪声检查,如果输入数据是白噪声,将不会有任何(异常)窗口信息返回。 - -**参数说明** -|参数|含义|默认值| -|---|---|---| -|algo|异常检测调用的算法|iqr| -|wncheck|对输入数据列是否进行白噪声检查|取值为 0 或者 1,默认值为 1,表示进行白噪声检查| - -异常检测的返回结果以窗口形式呈现,因此窗口查询相关的伪列在这种场景下仍然可用。可以使用的伪列如下: -1. `_WSTART`: 异常窗口开始时间戳 -2. `_WEND`:异常窗口结束时间戳 -3. `_WDURATION`:异常窗口持续时间 - -**示例** -```SQL ---- 使用 iqr 算法进行异常检测,检测列 i32 列。 -SELECT _wstart, _wend, SUM(i32) -FROM ai.atb -ANOMALY_WINDOW(i32, "algo=iqr"); - ---- 使用 ksigma 算法进行异常检测,输入参数 k 值为 2,检测列 i32 列 -SELECT _wstart, _wend, SUM(i32) -FROM ai.atb -ANOMALY_WINDOW(i32, "algo=ksigma,k=2"); -``` - -``` -taos> SELECT _wstart, _wend, count(*) FROM ai.atb ANOMAYL_WINDOW(i32); - _wstart | _wend | count(*) | -==================================================================== - 2020-01-01 00:00:16.000 | 2020-01-01 00:00:16.001 | 1 | -Query OK, 1 row(s) in set (0.028946s) -``` - - -**可用异常检测算法** -- iqr -- ksigma -- grubbs -- lof -- shesd -- tac - - -#### 时序数据预测 -数据预测以一段训练数据作为输入,预测接下来一个连续时间区间内,时序数据的趋势。 - -##### 语法 -```SQL -FORECAST(column_expr, option_expr) - -option_expr: {" -algo=expr1 -[,wncheck=1|0] -[,conf=conf_val] -[,every=every_val] -[,rows=rows_val] -[,start=start_ts_val] -[,expr2] -"} - -``` -1. `column_expr`:预测的时序数据列。与异常检测相同,只支持数值类型输入。 -2. `options`:异常检测函数的参数,使用规则与 anomaly_window 相同。预测还支持 `conf`, `every`, `rows`, `start`, `rows` 几个参数,其含义如下: - -**参数说明** - -|参数|含义|默认值| -|---|---|---| -|algo|预测分析使用的算法|holtwinters| -|wncheck|白噪声(white noise data)检查|默认值为 1,0 表示不进行检查| -|conf|预测数据的置信区间范围 ,取值范围 [0, 100]|95| -|every|预测数据的采样间隔|输入数据的采样间隔| -|start|预测结果的开始时间戳|输入数据最后一个时间戳加上一个采样时间段| -|rows|预测结果的记录数|10| - -1. 预测查询结果新增了三个伪列,具体如下:`_FROWTS`:预测结果的时间戳、`_FLOW`:置信区间下界、`_FHIGH`:置信区间上界, 对于没有置信区间的预测算法,其置信区间同预测结果 -2. 更改参数 `START`:返回预测结果的起始时间,改变起始时间不会影响返回的预测数值,只影响起始时间。 -3. `EVERY`:可以与输入数据的采样频率不同。采样频率只能低于或等于输入数据采样频率,不能**高于**输入数据的采样频率。 -4. 对于某些不需要计算置信区间的算法,即使指定了置信区间,返回的结果中其上下界退化成为一个点。 - -**示例** - -```SQL ---- 使用 arima 算法进行预测,预测结果是 10 条记录(默认值),数据进行白噪声检查,默认置信区间 95%. -SELECT _flow, _fhigh, _frowts, FORECAST(i32, "algo=arima") -FROM ai.ftb; - ---- 使用 arima 算法进行预测,输入数据的是周期数据,每 10 个采样点是一个周期。返回置信区间是 95%. -SELECT _flow, _fhigh, _frowts, FORECAST(i32, "algo=arima,alpha=95,period=10") -FROM ai.ftb; -``` -``` -taos> select _flow, _fhigh, _frowts, forecast(i32) from ai.ftb; - _flow | _fhigh | _frowts | forecast(i32) | -======================================================================================== - 10.5286684 | 41.8038254 | 2020-01-01 00:01:35.001 | 26 | - -21.9861946 | 83.3938904 | 2020-01-01 00:01:36.001 | 30 | - -78.5686035 | 144.6729126 | 2020-01-01 00:01:37.001 | 33 | - -154.9797363 | 230.3057709 | 2020-01-01 00:01:38.001 | 37 | - -253.9852905 | 337.6083984 | 2020-01-01 00:01:39.001 | 41 | - -375.7857971 | 466.4594727 | 2020-01-01 00:01:40.001 | 45 | - -514.8043823 | 622.4426270 | 2020-01-01 00:01:41.001 | 53 | - -680.6343994 | 796.2861328 | 2020-01-01 00:01:42.001 | 57 | - -868.4956665 | 992.8603516 | 2020-01-01 00:01:43.001 | 62 | - -1076.1566162 | 1214.4498291 | 2020-01-01 00:01:44.001 | 69 | -``` - - -**可用预测算法** -- arima -- holtwinters diff --git a/docs/zh/06-advanced/06-data-analysis/pic/data-analysis.png b/docs/zh/06-advanced/06-data-analysis/pic/data-analysis.png deleted file mode 100644 index 44fd82832f3e26d546ad15756decba130e5fc4a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50231 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

|1yF&^SgV9Uvu*tSEEClMA`Rag{L~7 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 dP2#WrIJ45LmAISpld_dyuIEnH{S-k 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