【原创】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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SIP协议详解

SIP协议概念** 会话启动协议SIP&#xff08;Session Initiation Protocol&#xff09;是一个在IP网络上进行多媒体通信的应用层控制协议&#xff0c;它被用来创 建、修改、和终结一个或多个参加者参加的会话进程。 **SIP协议可用于发起会话&#xff0c;也可以用于邀请成员加入…

arcgis判断两个字段是否相等

def a(b,c):if(bc):return 1else:return 0 不懂问题请进群交流

一元三次方程重根判别式_许兴华——关于复数集中解一元二次方程的问题

在学习复数时&#xff0c;最近有个别比较好学的同学提出一个问题&#xff1a;“对于复数系数一元二次方程&#xff0c;是否可以用求根公式求解呢&#xff1f;”——回答是肯定的&#xff01;关于复数集中解一元二次方程的问题。其实&#xff0c;在复数集内解关于x的一元二次方程…

arcgis批量将栅格里的nodata转为0

新建模型 修改名称 在arcgis的工具箱中新建一个模型&#xff0c;具体模型如下 模型里的具体参数如下 1.栅格计算器 2.输出路径&#xff0c;%—%这样的的输出可以保留之前的文件的名称 不懂问题请进群交流

arcgis中制作复杂符号

简介 在arcgis制图中常会遇到复杂的制图符号,如下 通过平常的代码显示并不会显示原图这样的效果,接下来我们开始解决改问题 主要思想: 通过字体文件将其显示 所以的软件: arcgis和FontCreator FontCreator软件下载链接

根据rtk参数在arcgis中进行可视化

RTK原始文件 通过原始文件发现&#xff0c;arcgis中并没有中央经线是113的CGS2000投影坐标&#xff0c;所以此处需要进行自定义投影转换 不懂问题请进群交流

解决mapgis转位置范围偏差过大的问题(比例尺)

问题描述: 在mapgis投影坐标转地理坐标,结果发现地理坐标错误 这样的地理坐标很明显是错误的,发现经度位置些许有些偏差,纬度有大幅度偏差 问题主要出现在在调整投影参数的比例尺分母不正确 解决: 找一个相似研究范围的mapgis文件或者shp文件 方法1(mapgis文件): …

有意思的小学数学竞赛题-2

刚刚在matrix67上看到一篇很有意思的帖子&#xff0c;原文http://www.matrix67.com/blog/archives/4485 我老早就写过一个经典的小学几何题。如果你还没看过这个问题&#xff0c;你一定要去看看。一个小学奥数老师曾 经告诉我&#xff0c;当年带领学生参加这次竞赛时&#xff0…

利用python处理中国地面气候资料日值数据集(V3.0)

原始文件 数据链接 00年到18年气象数据&#xff0c;但是未进行处理-数据集文档类资源-CSDN下载00年到18年气象数据&#xff0c;但是未进行处理&#xff0c;如果需要处理好的数据&#xff08;execl和shp&#xff09;&#xff0c;请查看本博主其他更多下载资源、学习资料请访问C…

mapgis转shp左右位置偏差

问题描述 问题原因 一般情况下&#xff0c;投影中心经度不会出现这么复杂的数字&#xff0c;一般都是1110000&#xff0c;1170000&#xff0c;前3个数字为整数后四个数字为0 问题解决 主要思想&#xff1a;通常相差的经纬度&#xff0c;调整投影中心点经度 解决步骤 1.试图…

Oracle Database Appliance

转载&#xff1a;http://www.hellodb.net/2011/09/oracle-database-appliance.html自从Oracle收购了SUN&#xff0c;不仅仅得到了MySQL&#xff0c;Java&#xff0c;Solaris等&#xff0c;还得到了SUN的硬件产品&#xff0c;真正成为了一家软硬通杀的服务提供商。这几年&#x…

arcgis中的插值分析了解

1.前言 打开arcgis工具箱我们可以发现arcgis为我们提供了多种插值分析的工具&#xff0c;克里金插值、反距离权重插值、样条函数插值等&#xff0c;具体如图所示 在工具箱中除地形转栅格和通过文件实现地形转栅格是用来绘制dem数据&#xff0c;其他就是我们日常研究所用的插值工…

解决MAPGIS导出数据乱码

所需软件&#xff1a; MAPGIS6.7 MAPGIS10版本以上 MAPGIS开发入门向导手册.zip-行业报告文档类资源-CSDN下载MAPGIS开发入门向导手册.zip更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_39397927/85321238ArcGIS 问题描述 在mapgis中的…

突破select的FD_SETSIZE限制

前言&#xff1a; 在很多比较各种网络模型的文章中&#xff0c;但凡提到select模型时&#xff0c;都会说select受限于轮询的套接字数量&#xff0c;这个 数量也就是系统头文件中定义的FD_SETSIZE值(例如64)。但事实上这个算不上真的限制。 C语言的偏方&#xff1a; 在C语…

袋装树和随机森林的区别

装袋法建树的时候是将所有预测变量都考虑进去&#xff0c; 而随机森林则是考虑每一个分裂点时&#xff0c;都是从所有的预测变量p中随机选取m个预测变量&#xff0c;分裂点所用的预测变量只能从这m个变量中选择。

arcgis中的SetNull(,)函数使用

SetNull(设置条件&#xff0c;将条件之内的值变为nodata,条件之外的值处理) 例如&#xff1a; 1.setnull("DEM"500,"DEM"),将DEM中值为500的数据赋为空&#xff0c;其他保留原值 2.setnull("DEM">500,"DEM"),将DEM中值大于500的…

如何处理MODIS蒸散数据(ET)中的填充值(仅作参考)

该处理过程是个人想法&#xff0c;仅做参考&#xff0c;如果想要等到比精确的蒸散数据请参考《京津唐地区城市扩张对地表蒸散发的影响》中蒸散的计算过程。 MOD16A3 第 6 版蒸发蒸腾/潜热通量产品是按 500 米 (m) 像素分辨率生成的年度复合数据集。 根据《京津唐地区城市扩张对…

如何计算栅格有效值范围内的统计值(最大值,最小值,平均值,方差)

大致思路&#xff1a; 1.将无效值设置为空(nodata) 2.对栅格进行计算 使用数据为&#xff1a;modis的蒸散数据&#xff08;有效值范围为0 至 65500&#xff0c;填充值范围为65529 至 65535&#xff09; 步骤 1&#xff0c;利用栅格计算器将填充值进行设置为空 结果 2计算栅…

arcgis将一个字段里的文字按上下标进行显示

示例 代码如下 def FindLabel ( [分区代号] ):a [分区代号]ba[0:1]<sub>a[1:2]</sub>return b