From 7c42a3ccae315e73c95015c1e726c183a73a5b4a Mon Sep 17 00:00:00 2001 From: lxd1190 Date: Thu, 8 Nov 2018 19:34:12 +0800 Subject: [PATCH] docs(api): add python api description --- .../time_series_detector/detect_service.py | 2 +- app/sql/time_series_detector/anomaly.sql | 20 ++-- .../time_series_detector/sample_dataset.sql | 24 ++--- app/sql/time_series_detector/train_task.sql | 25 +++-- docs/api_userguide.md | 102 +++++++++++++++++- docs/images/python_api_rate_predict.png | Bin 0 -> 6442 bytes docs/images/python_api_value_predict.png | Bin 0 -> 7033 bytes time_series_detector/detect.py | 2 +- 8 files changed, 135 insertions(+), 40 deletions(-) create mode 100644 docs/images/python_api_rate_predict.png create mode 100644 docs/images/python_api_value_predict.png diff --git a/app/service/time_series_detector/detect_service.py b/app/service/time_series_detector/detect_service.py index bc32f59..c97efe8 100644 --- a/app/service/time_series_detector/detect_service.py +++ b/app/service/time_series_detector/detect_service.py @@ -120,7 +120,7 @@ class DetectService(object): return True def __check_param(self, data): - if ("viewName" not in data.keys()) or ("attrId" not in data.keys()) or ("attrName" not in data.keys()) or ("time" not in data.keys()) or ("dataC" not in data.keys()) or ("dataB" not in data.keys()) or ("dataA" not in data.keys()): + if ("viewName" not in data.keys()) or ("viewId" not in data.keys()) or ("attrId" not in data.keys()) or ("attrName" not in data.keys()) or ("time" not in data.keys()) or ("dataC" not in data.keys()) or ("dataB" not in data.keys()) or ("dataA" not in data.keys()): return CHECK_PARAM_FAILED, "missing parameter" return OP_SUCCESS, "" diff --git a/app/sql/time_series_detector/anomaly.sql b/app/sql/time_series_detector/anomaly.sql index 98b255d..ab93c00 100644 --- a/app/sql/time_series_detector/anomaly.sql +++ b/app/sql/time_series_detector/anomaly.sql @@ -4,16 +4,16 @@ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- DROP TABLE IF EXISTS `anomaly`; CREATE TABLE `anomaly` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `view_id` varchar(31) DEFAULT NULL, - `view_name` varchar(63) DEFAULT NULL, - `attr_id` varchar(31) DEFAULT NULL, - `attr_name` varchar(63) DEFAULT NULL, - `time` datetime DEFAULT NULL, - `data_c` text NOT NULL, - `data_b` text NOT NULL, - `data_a` text NOT NULL, - `mark_flag` int(1) NOT NULL DEFAULT '0', + `id` int(10) NOT NULL AUTO_INCREMENT, + `view_id` varchar(31) NOT NULL DEFAULT '' comment '指标集id', + `view_name` varchar(63) NOT NULL DEFAULT '' comment '指标集名', + `attr_id` varchar(31) NOT NULL DEFAULT '' comment '指标id', + `attr_name` varchar(63) NOT NULL DEFAULT '' comment '指标名', + `time` datetime DEFAULT NULL comment '数据时间', + `data_c` text, + `data_b` text, + `data_a` text, + `mark_flag` tinyint(1) NOT NULL DEFAULT 0 comment '0:没有打标、1:打标为正样本、2:打标为负样本', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; diff --git a/app/sql/time_series_detector/sample_dataset.sql b/app/sql/time_series_detector/sample_dataset.sql index 70cfb71..98d807f 100644 --- a/app/sql/time_series_detector/sample_dataset.sql +++ b/app/sql/time_series_detector/sample_dataset.sql @@ -4,21 +4,21 @@ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- DROP TABLE IF EXISTS `sample_dataset`; CREATE TABLE `sample_dataset` ( - `id` bigint(10) NOT NULL AUTO_INCREMENT, - `update_time` timestamp NULL DEFAULT NULL, - `view_id` varchar(31) DEFAULT NULL, - `view_name` varchar(63) DEFAULT NULL, - `attr_name` varchar(63) DEFAULT NULL, - `attr_id` varchar(31) DEFAULT NULL, - `source` varchar(31) DEFAULT NULL, - `train_or_test` varchar(31) DEFAULT NULL, - `positive_or_negative` varchar(31) DEFAULT NULL, - `window` int(2) DEFAULT NULL, - `data_time` int(11) DEFAULT NULL, + `id` int(10) NOT NULL AUTO_INCREMENT, + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP comment '样本更新时间', + `view_id` varchar(31) NOT NULL DEFAULT '' comment '指标集id', + `view_name` varchar(63) NOT NULL DEFAULT '' comment '指标名', + `attr_name` varchar(63) NOT NULL DEFAULT '' comment '指标名', + `attr_id` varchar(31) NOT NULL DEFAULT '' comment '指标id', + `source` varchar(31) NOT NULL DEFAULT '' comment '样本来源', + `train_or_test` varchar(10) NOT NULL DEFAULT '' comment 'test:测试样本、train:训练样本', + `positive_or_negative` varchar(20) NOT NULL DEFAULT '' comment 'positive:正样本、negative负样本', + `window` int(10) NOT NULL DEFAULT 0 comment '窗口值,目前支持180', + `data_time` int(10) DEFAULT NULL comment '样本时间', `data_c` text, `data_b` text, `data_a` text, - `anomaly_id` bigint(10) DEFAULT NULL, + `anomaly_id` int(10) DEFAULT NULL comment '标识从anomaly里插入的样本', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; diff --git a/app/sql/time_series_detector/train_task.sql b/app/sql/time_series_detector/train_task.sql index fc157de..4ba63f0 100644 --- a/app/sql/time_series_detector/train_task.sql +++ b/app/sql/time_series_detector/train_task.sql @@ -4,19 +4,18 @@ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- DROP TABLE IF EXISTS `train_task`; CREATE TABLE `train_task` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `task_id` char(255) DEFAULT NULL, - `sample_num` int(11) DEFAULT NULL, - `postive_sample_num` int(11) DEFAULT NULL, - `negative_sample_num` int(11) DEFAULT NULL, - `window` int(2) DEFAULT NULL, - `model_name` varchar(20) DEFAULT NULL, - `source` varchar(255) DEFAULT NULL, - `start_time` timestamp NULL DEFAULT NULL, - `end_time` timestamp NULL DEFAULT NULL, - `status` varchar(11) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `id` (`id`) + `id` int(10) NOT NULL AUTO_INCREMENT, + `task_id` varchar(20) NOT NULL DEFAULT '' comment '训练任务id', + `sample_num` int(10) NOT NULL DEFAULT 0 comment '训练总样本数', + `postive_sample_num` int(10) NOT NULL DEFAULT 0 comment '训练正样本数', + `negative_sample_num` int(10) NOT NULL DEFAULT 0 comment '训练负样本数', + `window` int(10) NOT NULL DEFAULT 0 comment '窗口值,目前支持180', + `model_name` varchar(20) NOT NULL DEFAULT '' comment '模型名', + `source` varchar(255) NOT NULL DEFAULT '' comment '样本来源', + `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP comment '训练任务开始时间', + `end_time` timestamp NULL DEFAULT NULL comment '训练任务结束时间', + `status` varchar(11) NOT NULL DEFAULT '' comment 'complete:任务完成、running:任务正在运行、failed:任务失败', + PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- ---------------------------- diff --git a/docs/api_userguide.md b/docs/api_userguide.md index 3677b4b..7723485 100644 --- a/docs/api_userguide.md +++ b/docs/api_userguide.md @@ -14,7 +14,9 @@ 针对当前一个值的检测,需要依赖过去三段数据,数据选取规则参考示例图: ![data_info](images/data_info.png) -### 1、量值检测 +### 1、HTTP接口 + +#### 1、量值检测 * API: POST /{ip}:{port}/PredictValue * 功能说明:根据参考数据检测最近一个数据点是否异常 @@ -73,7 +75,7 @@ | ret | int | 检测结果是否异常。0:异常;1:正常 | | p | string | 概率值,值越小,判定为异常的置信度越高,目前p<0.15,判决为异常 | -### 2、率值检测 +#### 2、率值检测 * API: POST /{ip}:{port}/PredictRate * 功能说明:根据参考数据检测最近一个数据点是否异常 @@ -129,4 +131,98 @@ | code | int | 返回码。0:成功;非0:失败 | | msg | string | 返回消息 | | ret | int | 检测结果是否异常。0:异常;1:正常 | -| p | string | 概率值,值越小,判定为异常的置信度越高 | \ No newline at end of file +| p | string | 概率值,值越小,判定为异常的置信度越高 | + +### 2、Python API + +Metis工程目录下time_series_detector目录为时间序列异常检测学件库,可以在python下直接调用 + +#### 1、量值检测 +* 调用方法: + +``` + # Python + from time_series_detector import detect + detect_obj = detect.Detect() + detect_obj.value_predict(data) +``` + +* 功能说明:根据参考数据检测最近一个数据点是否异常 +* 传入参数:python字典 + +``` +{ + "taskId":"1530608070706", + "window":180, + "dataC":"9,10,152,...,255,...,16", + "dataB":"9,10,152,...,255,...,18", + "dataA":"9,10,152,...,458" +} +``` + +* 传入参数说明:同上 + +* 返回参数: +``` + code, { + "ret":0, + "p":"0.05", + } + +``` + +* 返回参数说明: + +| 名称 | 类型 | 说明 | +|---|---|---| +| code | int | 返回码。0:成功;非0:失败 | +| ret | int | 检测结果是否异常。0:异常;1:正常 | +| p | string | 概率值,值越小,判定为异常的置信度越高,目前p<0.15,判决为异常 | + +* 调用案例: + +![data_info](images/python_api_value_predict.png) + +#### 2、率值检测 +* 调用方法: + +``` + # Python + from time_series_detector import detect + detect_obj = detect.Detect() + detect_obj.rate_predict(data) +``` + +* 功能说明:根据参考数据检测最近一个数据点是否异常 +* 传入参数:python字典 + +``` +{ + "dataC":"9,10,152,...,255,...,16", + "dataB":"9,10,152,...,255,...,18", + "dataA":"9,10,152,...,458" +} +``` + +* 传入参数说明:同上 + +* 返回参数: +``` + code, { + "ret":0, + "p":"0", + } + +``` + +* 返回参数说明: + +| 名称 | 类型 | 说明 | +|---|---|---| +| code | int | 返回码。0:成功;非0:失败 | +| ret | int | 检测结果是否异常。0:异常;1:正常 | +| p | string | 概率值,值越小,判定为异常的置信度越高,目前p<0.15,判决为异常 | + +* 调用案例: + +![data_info](images/python_api_rate_predict.png) \ No newline at end of file diff --git a/docs/images/python_api_rate_predict.png b/docs/images/python_api_rate_predict.png new file mode 100644 index 0000000000000000000000000000000000000000..6a09d446d71b2c7785741a33d3b87a1c71fb7f8b GIT binary patch literal 6442 zcmZ`-cRZW#*N&>vWtLj86-B98Tfa1BsZwplR<$W&D@x7Qidq#^W7VwMBlKIf384~% zD54Rwh&}Q~e|_J-e(ygy`JD6I&$*xHKF@Vs=fpoS(z$wx^AZ36xT>eC{SW{+XGr-U zOLu|ti~n&U7XV=2)YHCe76@C*MPy7jKqEdO!mjDPO3Jq-o&Un3W0YR6rR4p~mfFdv zy8tGJNM%mW(?lw4dw)Q`aWBlZsHw8Oq6vuRjhvb7F^!eI9|1_9VLbn89`5*5U6PUm zz_{44i~M?PS|YzSzI}Q%`%_;tSbb%wEdW#%VSuTB_vX;w{niY~Ddw=23xlz1L1gZQ zIN9se6^MUwXWs2P+*|n8^x#5EgI&#v$skPe^2E}j)mZj`tO>5Fx|8HOL-v30z#;e`~b}r@m>?oe;z|H9w>l?R& ziIrXQ^_nL&i9uR9yPnpr{k8Q6!Rw9;H4y!UCui9O2gb_RqeuI%+Bjg$frX>)sg0uw-(9`f zI8Z#!9P8&c)s=emtM6ChT-Op0Ws6Tqnc9FEB#j7=wImuvWLuFY{xWa!6*59Ld!C!y z325Y33bC`8>8&96a;0-yWxf+B9#)a^teggoqEuf)?E7-M{Pq1jhH~!FvZ30dw?6b7 z*SW5K_+BMRY{Cec7qbP4duUlq!G5R?jZ#Xa7R9Q0c8-u|Pak=4lS9t>c$m9TGrbqaG+ZC{Jj4q5b7_N;MWB zR-!?kG8L9epuz-2^JP9<-aJ+u9`Z`H-qIJ1NZOWY~A+=oa|X%^aRnjtB1fuX2jxA7jgp!!PnBi7)Uwl3$~#w>b?(!|&;wpN$K(Rz6xLTrz8U55*LL(Yac zN&=l^zh9gDEi8+5B6Z>u9Mdg{31vTAuj~bo8y}onR70^ARqw&=PuSgpAXtl}sj}6A zl~3jF{}91j=B><b>Xr)NzRb8AE4!maq^=4YitIYn1p?7R@} zKSp`nE59WWy%`Wsv8abL55o_aTP)9MvE(^-H`RlYq8od)@48} z%LWaT#NQ~WQw1k2*eB-RvrqbMzu5R|$X=zWrQz4mN9s4?c`%2@04JgRnU7^)HmIX$IViEpV0G#}QjyEW zy~qmMC|JiI!oPcM>|bZZj;GEijfOTqP{OXu#u+6XlbIn;Ys3_BYF7M!^SyhW=PAw? zMI(0SC{|Z9_F_`BV;SyB{)Cdi5+~rN#^1o#LN7`@;{01_DvA~Q@Ml>{1pOI!YMxU* zyEEY8(*Fh_*1vgcMLq_g$j$#YlPqxZcQA&waB10xv!04c`56P{X)n@8?3Q22(bwXB zK1YJDj*4nnlf!D9K=j`R{iS_z5`&g`Q*C-Wddt}IMCodbH01rypOh8<4l1r@Z<|Mj zqAWV{*1{LLcw}mUq`@42#(%!Z>p$!)TDIVMSO~A%i9U2Z*m4ZfE6+@#xhx*mCNVI6&6(f8HjwT!OhfQ0YyePS=~@7p%hPR{U%hoExIkEFyrt0pfg$G%q`(Hop6sHzX$1M&q2x3g1zV z-Rf*}KJCIV=)gG|nZGaYqq=)kAC-uVpAv65jr2#Wo58de(Eid?7t&_! zpnWYCc8(u+H(0u;mR?QRBQ@9R4fQ)Nybu8Zn6{J+WnP!%vIo(mZVSoYG`dw&l08z! z{PNtP$7C2QOK`MVq%d$?Pjoh9`?mMA3@rSdqc*GUxl!Pa zpva8=ET8ZW9T;~V)1^nhClbNpJ{v)@Xh@xd4A$v_S-yr&61i^OAZFWi`(v<-D?N+C zRLoSe)W8x{{d4nn+{n&#xnw0A!ok_n8r4a4vBUYrW2wcec6N%SnBHzJmkFiyI=#s> z(~z;*Jvwb6u>M9E7_eim>jWld;449x(=r82rKTtn?Q=NY)?h8HsQ(!i%(e4au9*9u z!=9P_0tjlSQ`KS(p`aeQD)Nd~YG^EAFl4LJcd&!w;Pll$V58>aA+OR(qI=M5&veB% zg&Ff;608+}P)a%fIvmJA#jr*a?X8Jn82eH;sZ#}~V^-t4szbaAG2?!-f3?5wNX_4r z{-rA)!9@c7yQ|+-Pb33W)sZ>fmae~a40eo{pDIdRMsYc~*C9a;M!b!XRZk@homJz3 zoW4{~Gu@~OPh~iOo7ej;f4(`BjdlHY0)Q`R@Oqk3iOgNKfG;XLEc8b0V5*2o)Q0K! zejHVVoD>FO2p#tB;Eq-OpcyjI1mZ1_UeGc#5^5>I@j#zPKq_XkwbdprG9W;fb= zK12S@jm;Lbl!s*f)N1WcA&mvBH%kS)&n%~A}wYPUN-R91!-bGT_ zcJ#rU>i5@i8}l4_NanA1p521(Bc`^}iUm#TlhmmEWAtYKplF~lEye!7*m{Q7lwexZ z{%mJ5Vrg}SPNwxh>jgsOLYisgMuz_`hNZ7$qe4Cw-rzMKml1p=?QZNR+9|r> z3Ed%BBWK~Omu;tOM^4JjnZYlgYeOm;wgQPI+f!~gfx>-+^5;rr4zCjv1gEZF&b^U! zN!d^>>mWwW7w5{z@QoMKG3!ACgBc*yWd)3k#?94loxt+YmZm|BDM?WLhDpwuhu~32>KBT$QL+mGk+!Pp# zqf08K#I}ljYI#(2wnDBekMcW8^&zdJBhn`{9j$Jq5C358yRaXk?caM--NdB=2eFeyl_T-Z#D6*(DgQ$MfA+~ zZb-()NfKe`g=Fd;oML}wv{`$@FTviO@U;_#vG2npeo&bMjBfu@X6MyeAERzjF4kvq z6ZwHK-A6^Pk!MeTW_c`=-z^bid1ZD-xIFQlwcvT86vwM+ z{-tS_822@L9Fh&NU!@{C>d~GBN-HFGpj1de1`} z^^MG(m$tz18L~e#ZW<*xt(+zgJs{(cw7E}Cp5g;HAdsb#%zhGhd#xp$OX(DSnIK>g z7d{=gT_<28nbKF%5z=wucxSi=k|F_`EVW0dHwV|g>v`B%`L@E>ruvB6>Af0cgz_qj zWm_Fgnl5e4T^EzVC!0{HeR z-DL8TMuU(Qp>?16J=xywT_PG;fMXUq+F8wfq}!$4KjkIq=2_L?*IU{Kg(BB zWR#4#B(qC%$6mZmpq6HlxyVWTPFfc3{;maZT^mQ2)~XE3yW*>S8$OR`4w1R2wzxDl z=;fwv&m4TuGN5QI}s7qg2dp znXhnlfdS;KT#98~<(O=vAhCL}Mh2GKl;ew1_+HR0;=h2_pA5mhl?Qq_KRvi0QY;skcZE zf~kS5Jpy5HpRF)swfoIrWSV`&W^(#C)JP)Hl2^SsNIZSyps}CXEy94S7aAk~OX&7< z#iEw@bYVv?xO>Sji(i(!RA9~!{3Ypwu?(5wzGnD z>hb+oW4d?vGu$p635JzS58t!8{LtK6mgTUH{;Lr_=zQEXQn=bl%(?bL#ND z_>Rx$_TJ|p9dxjYHI1mIrMC5$?_~mjlvc2;weEu*;N%&h{=IwSDP>}-_a4=W#a^?dbmt=`{cp-Auua5~}DS80B;ga=z zW2oFSh$HIG6A8p!80Ms>J7`iIczMYd*VdOfJFf~sZ~aIqr}c*1T;s^S0q7N~?i4b1 z7&U>$?3f5t9Q{yU7+V=$u^teJ6q(!|^rX#vz43K>>D@%q9fcpk6~K=Cg@4IWG1q6T z`b(7n5aAg+AB~88Ats}l$s>H*E@yPc+~RZ5&py{wA`VLHft6$6H8auU`mkv>Kmw(2 zoo3+s_1ag*Q=6osTdkGqUx;VniC-1jHx8JUu!-rH3R(i^C;1t@*5IheSYFKSkcpx+pu_vV z2_!O%f%V8vs~T>Uy0Ag*4NhL#`O=7RC-m%0Ctn9?Q1R&eQ<tJBG^84AzT3Lg``b!0asR)<7go)HBX zH8*-DKciK<=XKiBoC_FF4fjntsUl2`K4rjidU#d3_dpxD98}NWt-3EjTgTMb+#Jp6 zzE?cw&%P_+J}jcwh`OpK?4@=Wqg%agffw~30Uyh>_L$LnBJ{`Weessy;0>z=^e(#J zU(Uz{XiQ|k%P17A$yExA>GA6Q$G9M5M)ag)-WtyJDaSfqJ^7|A_Fvt;AOwD@Zw<5$ zTM$$+)cFhyA3zzblc*`1FrQCr&#ydUKru3)`br}!-1QFJr=munj?M#2tG4IEX~WXe zpMGQru-_i@lN!Kkjgyv;_6E*&Dr`EiDWn?q3Ju_~VUAay3w6;znB%8)MdT)z)U+!y-UTU_+R{xgAv5al( zMPmn4KkX-YVn*kFg zsa|VYtD|!1DI5EMGxn8|SmhYA^$fdo%Xz>>N&~f*uH$;^p4j?hOgijQko?jYykhRy ztM*kp6=_9_65knf=fG^0=;|8)-4sI8!_fCj)6vFYD)9%ratM@&UO?n(>W%JiTA)e# z!B`1hRB%OFr!VM@T-yXa912MJ_wgiu7ZJX1>q68b>^X)y6s5U^_#N9`37McDH1_Oy zsxu@t$sr1mi>^9@Qq4$(**}=tWcz>9k-rN5zmHD-TkzCRiVRd0;Qf3&8*-2z`9~)M z0MaSH>C!^qnyVWg1RorG4{(FJ&So?0hR0wZ#l5YtlcSlfgN0VHzi!>bh1Ouw0z$P< zb*1#q8K6_^8XsodN{86v$0z+UuA$r%Uj!At5}L-8AFwhzn%$f&N>A}=I-O~%>5sGM z4o4))<>Q~lz=NAAg%$Q8^`|Gt)~B%lT&P27gXhJGn}>VwLD^)Ang;+zvPt4f*#<(n z?Aa-~*mw@gXoVu60Gsq_hE3>kR~aT1r%&X+`-u-ZG>L1(4{{g#U By0!oS literal 0 HcmV?d00001 diff --git a/docs/images/python_api_value_predict.png b/docs/images/python_api_value_predict.png new file mode 100644 index 0000000000000000000000000000000000000000..460f0a56573fb98e78d1400166eec0b59fc71e39 GIT binary patch literal 7033 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 a>zatY;lqB4ITCx*Me}c+XO$|pZ~qt15Vy+! literal 0 HcmV?d00001 diff --git a/time_series_detector/detect.py b/time_series_detector/detect.py index db5a88f..84d0b29 100644 --- a/time_series_detector/detect.py +++ b/time_series_detector/detect.py @@ -33,7 +33,7 @@ class Detect(object): return True def __check_param(self, data): - if ("viewName" not in data.keys()) or ("attrId" not in data.keys()) or ("attrName" not in data.keys()) or ("time" not in data.keys()) or ("dataC" not in data.keys()) or ("dataB" not in data.keys()) or ("dataA" not in data.keys()): + if ("dataC" not in data.keys()) or ("dataB" not in data.keys()) or ("dataA" not in data.keys()): return TSD_CHECK_PARAM_FAILED, "missing parameter" if not data['dataA']: return TSD_CHECK_PARAM_FAILED, "dataA can not be empty"