deequ 2.0.1 anomaly的代码简单分析
创始人
2024-02-07 23:43:51
0

anomaly 总体说明

anomaly是基于两次check的结果,因此必须使用repository 进行比较,比较方法被称为strategy,有如下几种:

  • OnlineNormalStrategy 直接override def detect ,根据平均值和标准方差进行比较 mean and standard deviation.
  • SimpleThresholdStrategy : 值必须在指定范围内
  • BatchNormalStrategy :正太分布检测,所有数据在 mean lowerDeviationFactor * stdDev 和 mean + upperDeviationFactor * stdDev之间
  • AbsoluteChangeStrategy 两次变化的绝对数量,使用super trait的diff:减法
  • RelativeRateOfChangeStrategy ,两次变化的比例,diff函数中使用除法

repository

repository 目前只有文件及内存两种,文件其实就是json格式的结果保存(带timestamp 及tag:即key)

核心代码

生成Check,check包括3部分:

 /*** Add a check using Anomaly Detection methods. The Anomaly Detection Strategy only checks* if the new value is an Anomaly.** @param anomalyDetectionStrategy 策略,可以见上一节 The anomaly detection strategy* @param analyzer 和普通check一样的Analyzer,比如size,containUrl等The analyzer for the metric to run anomaly detection on* @param anomalyCheckConfig Some configuration settings for the Check 配置,主要是指定描述、指定可以比较的上一次结果的生成日期访问、tag等等,可以忽略不用,example里面也没有用*/def addAnomalyCheck[S <: State[S]](anomalyDetectionStrategy: AnomalyDetectionStrategy,analyzer: Analyzer[S, Metric[Double]],anomalyCheckConfig: Option[AnomalyCheckConfig] = None): this.type = {val anomalyCheckConfigOrDefault = anomalyCheckConfig.getOrElse {val checkDescription = s"Anomaly check for ${analyzer.toString}"AnomalyCheckConfig(CheckLevel.Warning, checkDescription)}checks :+= VerificationRunBuilderHelper.getAnomalyCheck(metricsRepository.get,anomalyDetectionStrategy, analyzer, anomalyCheckConfigOrDefault)this}

checkConfig 类

/*** Configuration for an anomaly check** @param level         Assertion level of the check group. If any of the constraints fail this*                      level is used for the status of the check.* @param description   The name describes the check block. Generally will be used to show in*                      the logs.* @param withTagValues Can contain a Map with tag names and the corresponding values to filter*                      for the Anomaly Detection* @param afterDate     The minimum dateTime of previous AnalysisResults to use for the*                      Anomaly Detection* @param beforeDate    The maximum dateTime of previous AnalysisResults to use for the*                      Anomaly Detection* @return*/
case class AnomalyCheckConfig(level: CheckLevel.Value,description: String,withTagValues: Map[String, String] = Map.empty,afterDate: Option[Long] = None,beforeDate: Option[Long] = None)

默认Constraint

 def anomalyConstraint[S <: State[S]](analyzer: Analyzer[S, Metric[Double]],anomalyAssertion: Double => Boolean,hint: Option[String] = None): Constraint = {val constraint = AnalysisBasedConstraint[S, Double, Double](analyzer, anomalyAssertion,hint = hint)new NamedConstraint(constraint, s"AnomalyConstraint($analyzer)")}

实际比较在detect 或者diff 函数内,不同strategy 类代码稍有不同

// 默认detect调用diff进行比较
override def detect(dataSeries: Vector[Double],searchInterval: (Int, Int))
: Seq[(Int, Anomaly)] = {val (start, end) = searchIntervalrequire(start <= end,"The start of the interval cannot be larger than the end.")val startPoint = Seq(start - order, 0).maxval data = diff(DenseVector(dataSeries.slice(startPoint, end): _*), order).datadata.zipWithIndex.filter { case (value, _) =>(value < maxRateDecrease.getOrElse(Double.MinValue)|| value > maxRateIncrease.getOrElse(Double.MaxValue))}.map { case (change, index) =>(index + startPoint + order, Anomaly(Option(dataSeries(index + startPoint + order)), 1.0,Some(s"[AbsoluteChangeStrategy]: Change of $change is not in bounds [" +s"${maxRateDecrease.getOrElse(Double.MinValue)}, " +s"${maxRateIncrease.getOrElse(Double.MaxValue)}]. Order=$order")))}
}/**
RelativeRateOfChangeStrategy 的diff ,除法* Calculates the rate of change with respect to the specified order.* If the order is set to 1, the resulting value for a point at index i* is equal to dataSeries (i) / dataSeries(i - 1).* Note that this difference cannot be calculated for the first [[order]] elements in the vector.* The resulting vector is therefore smaller by [[order]] elements.** @param dataSeries The values contained in a DenseVector[Double]* @param order      The order of the derivative.* @return A vector with the resulting rates of change for all values*         except the first [[order]] elements.*/
override def diff(dataSeries: DenseVector[Double], order: Int): DenseVector[Double] = {require(order > 0, "Order of diff cannot be zero or negative")if (dataSeries.length == 0) {dataSeries} else {val valuesRight = dataSeries.slice(order, dataSeries.length)val valuesLeft = dataSeries.slice(0, dataSeries.length - order)valuesRight / valuesLeft}
}// AbsoluteChangeStrategy 使用super trait的diff:减法
def diff(dataSeries: DenseVector[Double], order: Int): DenseVector[Double] = {require(order >= 0, "Order of diff cannot be negative")if (order == 0 || dataSeries.length == 0) {dataSeries} else {val valuesRight = dataSeries.slice(1, dataSeries.length)val valuesLeft = dataSeries.slice(0, dataSeries.length - 1)diff(valuesRight - valuesLeft, order - 1)}
}

OnlineNormalStrategy 直接override def detect ,根据平均值和标准方差进行比较 mean and standard deviation.

SimpleThresholdStrategy : 值必须在指定范围内

BatchNormalStrategy :正太分布检测,所有数据在 mean - lowerDeviationFactor * stdDev 和 mean + upperDeviationFactor * stdDev之间

相关内容

热门资讯

孙根成和王天一谁更厉害? 孙根成和王天一谁更厉害?已知长方形的表面积=2乘(长×宽+长×高+宽×高)
拉开序幕的同义表达 拉开序幕的同义表达拉开序幕的同义词应该是展开帷幕。 展开帷幕,读音zhǎn kāi wéi mù ,...
幸福 电视剧剧情介绍 幸福 电视剧剧情介绍国产剧《幸福》讲述九十年代中期罗志刚一家发生的故事。韩剧《幸福》以新冠疫情结束的...
砸缸砸的家喻户晓的司马光,当时... 砸缸砸的家喻户晓的司马光,当时救的人是谁,很有名气吗?当时救的人是上官尚光。这个人懂得知恩图报,给司...
读了愿望的实现明白了什么道理?... 读了愿望的实现明白了什么道理?明白了要自己去努力 。加油哟~~~生活,还是要行动。
直线导轨的维护与清洁的重要性 直线导轨的维护与清洁的重要性导轨属于精密机械零件对清洁要求高。一般都带有防护罩。日常的维护主要是加油...
悦樘公寓安保如何?晚上半夜回去... 悦樘公寓安保如何?晚上半夜回去安不安全?住在悦樘公寓最不用担心的就是安保问题,全国所有的悦樘公寓都有...
校园励志微电影剧本怎么写 校园励志微电影剧本怎么写 校园励志剧本有很多类型的,你可以从体育类开始写或是关于考试的也可以。
无知者无畏 知而深深畏的意思 无知者无畏 知而深深畏的意思“无知者无畏,知而深深畏”是指那些不了解事物真相的人往往会无所畏惧,而看...
你名人轶事为主题的作文该如何写... 你名人轶事为主题的作文该如何写?名人轶事——作文素材①梁启超梁启超,字卓如,广东省新会人。他 11岁...
平凡人的生活状态是什么? 平凡人的生活状态是什么?生活就是理解,生活就是面对现实微笑。生活就是越过心灵的障碍,平静心性,淡泊名...
打算开个零食铺,名字要带水火木... 打算开个零食铺,名字要带水火木的,都有什么啊?店名要带水火木含义的,实在想不到了。请大家帮帮忙!开个...
深圳大學出了什麽名人? 深圳大學出了什麽名人?马化腾、史玉柱、周海江、张亚东、欧绮雯、陈文生、冼燃、黄子良、罗锦潮、方文权、...
家的方向才是心的方向是几个意思 家的方向才是心的方向是几个意思意思是,成就一个家需要心也就是感觉,这得问你自己的心这可能是一种表白,...
博字含义是什 博字含义是什 基本字义:博(拼音:bó)是汉语常用字,最早字形见于西周金文。本意是大;引申指丰富、宽...
梁嘉泓叶絮为什么分手 梁嘉泓叶絮为什么分手两人因为原生家庭的差距而分手。在很多所谓过来人的长辈眼中,十七岁的承诺就像小孩子...
求几本好看的修真玄幻小说,不要... 求几本好看的修真玄幻小说,不要开场主角无敌的那种!几年书龄,辰东,三少,土豆,我爱吃西红柿,耳根…求...
请问电影《查理和巧克力工厂》中... 请问电影《查理和巧克力工厂》中的巧克力是真那么多吗?如果是真的那得多么浪费啊!!这个问题我想了很久了...
排球的英语怎么读(有声) 排球的英语怎么读(有声)volleyball音标:英 [ˈvɒlibɔ:l] 美 [ˈvɑ:libɔ...
幼儿园最美教师演讲比赛怎么写稿... 幼儿园最美教师演讲比赛怎么写稿子   做最美的幼儿教师  各位领导,各位老师,大家好!  记得在很...