【原创】StreamInsight查询系列(十九)——查询模式之检测异常
上篇文章介绍了查询模式中如何发现趋势,这篇博文将介绍StreamInsight中如何检测异常。
测试数据准备
为了方便测试查询,我们首先准备一个静态的测试数据源:
var now = DateTime.Parse("09/12/2011 8:57:00 PM"); var input = new[] {new { Time = now + TimeSpan.FromSeconds(1), Value = 20},new { Time = now + TimeSpan.FromSeconds(2), Value = 30},new { Time = now + TimeSpan.FromSeconds(3), Value = 120},new { Time = now + TimeSpan.FromSeconds(4), Value = 200},new { Time = now + TimeSpan.FromSeconds(5), Value = 20},new { Time = now + TimeSpan.FromSeconds(6), Value = 110},new { Time = now + TimeSpan.FromSeconds(7), Value = 110},new { Time = now + TimeSpan.FromSeconds(8), Value = 210},new { Time = now + TimeSpan.FromSeconds(9), Value = 120},new { Time = now + TimeSpan.FromSeconds(10), Value = 130},new { Time = now + TimeSpan.FromSeconds(11), Value = 20},new { Time = now + TimeSpan.FromSeconds(12), Value = 30}, };
接下去将上述数据源转变为点类型复杂事件流:
var inputStream = input.ToPointStream(Application, t =>PointEvent.CreateInsert(t.Time.ToLocalTime(), new { Value = t.Value }),AdvanceTimeSettings.IncreasingStartTime);
异常检测
问题:怎样每秒1次的计算过去5秒内Value字段值超过阈值100的事件数超过事件总数目80%的异常事件?
首先我们定义一下结果事件流中的负载类型SpikeEvent如下:
struct SpikeEvent {public double Ratio { get; set; } }
我们最终希望调用查询的方式如下:
int threshold = 100; double ratio = 0.8;var resultStream = DetectSpikes(inputStream,threshold, // 指定阈值(超过该阈值的事件被认为是“特殊事件”)ratio, // “特殊事件”占事件总数的百分比TimeSpan.FromSeconds(5), // 窗口大小TimeSpan.FromSeconds(1), // 跳跃大小e => e.Value); // 指定的比较字段
因此最关键的部分就是如何实现DetectSpikes。阅读过
《StreamInsight查询系列(十五)——查询模式之窗口比率》文章的读者应该对此类查询并不陌生。
这里不加过多描述地给出DetectSpikes的实现:
/// <summary> /// 在输入流中检测异常 /// </summary> /// <typeparam name="TInput">输入流事件类型</typeparam> /// <param name="inputStream">输入流</param> /// <param name="threshold">异常定义阈值</param> /// <param name="ratio">异常事件占事件总数的百分比</param> /// <param name="windowSize">衡量事件数目的窗口大小</param> /// <param name="hopSize">跳跃大小</param> /// <param name="fieldSelector">选择输入事件中的某个字段来检测事件类型</param> /// <returns>query that detects the spikes</returns> private static CepStream<SpikeEvent> DetectSpikes<TInput>(CepStream<TInput> inputStream, int threshold, double ratio,TimeSpan windowSize, TimeSpan hopSize,Expression<Func<TInput, int>> fieldSelector) {// 统计跳跃窗口内所有事件的数目var totalValues = from w in inputStream.HoppingWindow(windowSize,hopSize,HoppingWindowOutputPolicy.ClipToWindowEnd)select new{Count = w.Count(),};// 构造包含过滤条件的LINQ语句var parameter = fieldSelector.Parameters.First();var field = fieldSelector.Body;Expression<Func<TInput, bool>> filterExpression = (Expression<Func<TInput, bool>>)Expression.Lambda(Expression.GreaterThan(field, Expression.Constant(threshold)),parameter);// 统计跳跃窗口内异常事件的数目var bigValues = from w in inputStream.Where(filterExpression).HoppingWindow(windowSize,hopSize,HoppingWindowOutputPolicy.ClipToWindowEnd)select new{Count = w.Count(),};// 选择异常事件数目超过事件总数一定百分比的事件var output = from total in totalValues.ToPointEventStream()join big in bigValues.ToPointEventStream()on true equals truewhere big.Count * 1.0 / total.Count >= ratioselect new SpikeEvent { Ratio = big.Count * 1.0 / (total.Count) };return output; }
输出结果如下:
下一篇将介绍StreamInsight查询模式中如何检测间隙事件。
转载于:https://www.cnblogs.com/StreamInsight/archive/2011/09/12/StreamInsight-Query-Series-Part19-Query-Patterns-Detect-Spikes.html
【原创】StreamInsight查询系列(十九)——查询模式之检测异常相关推荐
- 零基础带你学习MySQL—多子句查询(十九)
零基础带你学习MySQL-多子句查询(十九)
- 【SQL查询系列】子查询经典案例
文章目录 前言 数据库 查询案例 1. 查询工资最低的员工信息: last_name, salary 2. 查询平均工资最低的部门信息 3. 查询平均工资最低的部门信息和该部门的平均工资 4. 查询平 ...
- 数据与广告系列十九:推荐召回与广告LookAlike,万物皆可Embedding
作者·黄崇远 『数据虫巢』 全文共1000字 题图ssyer.com " 万物皆可Embedding,开启全面数据化的时代." 正式打算写Embedding相关话题之前,有突然想到 ...
- 【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码
本文是以下几篇文章对应的动态加载的用户程序/任务一代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 ...
- 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
本汇编代码对应以下两篇文章对应的用户程序汇编代码: [OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中 ...
- PostgreSQL在何处处理 sql查询之三十九
接前面,这次重点分析 ExecScan: 其for 循环内部: for (;;){ TupleTableSlot *slot;CHECK_FOR_INTERRUPTS(); slot = ExecSc ...
- Linux学习系列十九:如何高效的阅读Linux源码
1.引言 如何阅读代码还要单独写一篇文章?难道不是随便用一个IDE就可以了吗?回到上一篇文章里介绍的那个问题,需要修改uboot里board_mmc_init函数里的writel(0x66666666 ...
- 50个查询系列-第二个查询
-2.查询平均成绩大于60分的同学的学号和平均成绩: Select StuId,Avg(Score) as AvgScore From tblScore Group By StuId Hav ...
- WPF入门教程系列十九——ListView示例(一)
经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能.从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Windo ...
最新文章
- python ln2怎么写_Python2和3切换默认
- ×××生成算法的分析
- 160个Crackme010
- UML模型中的图-行为图【状态图、活动图】
- ffmpeg开发指南(使用 libavformat 和 libavcodec)
- thinkphp5.0助手函数占用服务器资源
- linux装redis环境变量,linux 怎样安装redis
- (转)ElasticSearch教程——汇总篇
- c++与unreal 的uc脚本交互
- 一个普通专科生,拿什么拯救你的未来?(精简版)
- STM32CubeMx开发之路—13使用SPI读写W25Q64
- JavaSE学生教师管理系统
- 解决onenote同步速度慢问题
- V4L2框架-视频流的停止(VIDIOC_STREAMOFF)
- 二元函数凹凸性判定及最值定理
- unity中使用render texture全黑的可能解决方案
- 彩色图像增强(限制对比度直方图阈值均衡化)Python,Win10
- 即时分账系统对B2B电商业务的重要性?
- 畅通工程 hdu 1232 HDU - 1863 (并查集+最小生成树)
- js 万年历农历转阳历 方法_利用JS制作万年历的方法
热门文章
- Pat乙级1011题:A+B和C
- Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控
- HDOJ 1233 (克鲁斯卡尔+并查集)
- C++学习(一)之Visual Studio安装以及首次使用
- Ubuntu下一个openldapserver部署步骤
- 选择不相交区间(贪心算法) By ACReaper
- beta:scrum5
- 如何建立好的索引.--针对Distinct
- glide工具类。加载显示原图片,显示圆角图片,gif图标显示
- 凯斯西储大学计算机工程排名,[转载]凯斯西储大学排名及世界排名【研究生】...