热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【原创】StreamInsight查询系列(十八)——查询模式之趋势发现

上篇文章介绍了查询模式中如何应对瞬变及报警泛滥,这篇博文将介绍StreamInsight中的趋势发现。为了方便测试查询,我们首先准备一个静态的测试数据源:varsourceData

上篇文章介绍了查询模式中如何应对瞬变及报警泛滥,这篇博文将介绍StreamInsight中的趋势发现。

为了方便测试查询,我们首先准备一个静态的测试数据源:

var sourceData = new []
{
    new { SourceId = "A", Value = 22, Status = 1, TimeStamp = DateTime.Parse("10/23/2009 4:12:00 PM") },
    new { SourceId = "A", Value = 24, Status = 0, TimeStamp = DateTime.Parse("10/23/2009 4:13:00 PM") },
    new { SourceId = "A", Value = 31, Status = 1, TimeStamp = DateTime.Parse("10/23/2009 4:14:00 PM") },
    new { SourceId = "A", Value = 67, Status = 0, TimeStamp = DateTime.Parse("10/23/2009 4:15:00 PM") },
    new { SourceId = "A", Value = 54, Status = 0, TimeStamp = DateTime.Parse("10/23/2009 4:16:00 PM") },
    new { SourceId = "A", Value = 50, Status = 1, TimeStamp = DateTime.Parse("10/23/2009 4:30:00 PM") },
    new { SourceId = "A", Value = 87, Status = 0, TimeStamp = DateTime.Parse("10/23/2009 4:35:00 PM") },
};

接下去将上述数据源转变为点类型复杂事件流:

var source = sourceData.ToPointStream(Application, ev =>
    PointEvent.CreateInsert(ev.TimeStamp.ToLocalTime(), ev),
    AdvanceTimeSettings.StrictlyIncreasingStartTime);

趋势发现

问题:怎样将点类型事件流转变为间隔类型事件流,且保证每一个间隔包含了当前点事件和前一个点事件?

实现将点类型事件流转变为连续间隔类型事件流(或叫做“信号流”),通常可以通过剪辑事件达到效果。与剪辑事件息息相关的函数则是ClipEventDuration,它采用两个流作为参数,并且根据第二个流中下一匹配事件的开始时间更改第一个流中每个事件的生存期。

解决该问题,我们可以采取3步走:

  1. 扩展每一个点事件,并剪辑到下一个对应事件;
  2. 将每一个间隔事件向后移动一个刻度,以保证它可以和下一个事件重叠;
  3. 与原始事件流联接,将两个点事件的负载放在一起

下面是具体的实现:

var result = from s in source
            .AlterEventDuration(s => TimeSpan.MaxValue)
            .ClipEventDuration(source, (s, e) => s.SourceId == e.SourceId)
            .ShiftEventTime(e => e.StartTime + TimeSpan.FromTicks(1))
             join e in source on s.SourceId equals e.SourceId
             select new
             {
                 StartValue = s.Value,
                 EndValue = e.Value,
                 Delta = e.Value - s.Value,
                 Duration = e.TimeStamp - s.TimeStamp
             };

结果如下:

【原创】StreamInsight查询系列(十八)——查询模式之趋势发现

下一篇将介绍StreamInsight查询模式中如何检测异常。


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
author-avatar
Y死一般的痛过
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有