上篇文章介绍了查询模式中如何发现趋势,这篇博文将介绍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查询系列(十九)——查询模式之检测异常相关推荐

  1. 零基础带你学习MySQL—多子句查询(十九)

    零基础带你学习MySQL-多子句查询(十九)

  2. 【SQL查询系列】子查询经典案例

    文章目录 前言 数据库 查询案例 1. 查询工资最低的员工信息: last_name, salary 2. 查询平均工资最低的部门信息 3. 查询平均工资最低的部门信息和该部门的平均工资 4. 查询平 ...

  3. 数据与广告系列十九:推荐召回与广告LookAlike,万物皆可Embedding

    作者·黄崇远 『数据虫巢』 全文共1000字 题图ssyer.com " 万物皆可Embedding,开启全面数据化的时代." 正式打算写Embedding相关话题之前,有突然想到 ...

  4. 【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码

    本文是以下几篇文章对应的动态加载的用户程序/任务一代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 ...

  5. 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码

    本汇编代码对应以下两篇文章对应的用户程序汇编代码: [OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中 ...

  6. PostgreSQL在何处处理 sql查询之三十九

    接前面,这次重点分析 ExecScan: 其for 循环内部: for (;;){ TupleTableSlot *slot;CHECK_FOR_INTERRUPTS(); slot = ExecSc ...

  7. Linux学习系列十九:如何高效的阅读Linux源码

    1.引言 如何阅读代码还要单独写一篇文章?难道不是随便用一个IDE就可以了吗?回到上一篇文章里介绍的那个问题,需要修改uboot里board_mmc_init函数里的writel(0x66666666 ...

  8. 50个查询系列-第二个查询

    -2.查询平均成绩大于60分的同学的学号和平均成绩: Select StuId,Avg(Score) as AvgScore From tblScore   Group By StuId    Hav ...

  9. WPF入门教程系列十九——ListView示例(一)

    经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能.从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Windo ...

最新文章

  1. python ln2怎么写_Python2和3切换默认
  2. ×××生成算法的分析
  3. 160个Crackme010
  4. UML模型中的图-行为图【状态图、活动图】
  5. ffmpeg开发指南(使用 libavformat 和 libavcodec)
  6. thinkphp5.0助手函数占用服务器资源
  7. linux装redis环境变量,linux 怎样安装redis
  8. (转)ElasticSearch教程——汇总篇
  9. c++与unreal 的uc脚本交互
  10. 一个普通专科生,拿什么拯救你的未来?(精简版)
  11. STM32CubeMx开发之路—13使用SPI读写W25Q64
  12. JavaSE学生教师管理系统
  13. 解决onenote同步速度慢问题
  14. V4L2框架-视频流的停止(VIDIOC_STREAMOFF)
  15. 二元函数凹凸性判定及最值定理
  16. unity中使用render texture全黑的可能解决方案
  17. 彩色图像增强(限制对比度直方图阈值均衡化)Python,Win10
  18. 即时分账系统对B2B电商业务的重要性?
  19. 畅通工程 hdu 1232 HDU - 1863 (并查集+最小生成树)
  20. js 万年历农历转阳历 方法_利用JS制作万年历的方法

热门文章

  1. Pat乙级1011题:A+B和C
  2. Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控
  3. HDOJ 1233 (克鲁斯卡尔+并查集)
  4. C++学习(一)之Visual Studio安装以及首次使用
  5. Ubuntu下一个openldapserver部署步骤
  6. 选择不相交区间(贪心算法) By ACReaper
  7. beta:scrum5
  8. 如何建立好的索引.--针对Distinct
  9. glide工具类。加载显示原图片,显示圆角图片,gif图标显示
  10. 凯斯西储大学计算机工程排名,[转载]凯斯西储大学排名及世界排名【研究生】...