0

这是我最后一个问题的后续;设置是我正在使用 StreamInsight 进行时间序列预测。

扩展那里给出的描述,让我用x_n我的输入流来表示,为了这个例子,让我们假设每 10 次观察后我预测前面的 10 个值;我将这些预测称为p_n。系列索引将对应于时间,因此第一个p_n将是p_11.

所以我们有

x_1, x_2, ..., x_10 --> p_11, p_12, ..., p_20
x_11, x_12, ..., x_20 --> p_21, p_22, ..., p_30
etc.

我有一个用户定义的流运算符,它从我的输入流中收集,当有足够的事件时,它会为该循环x_n吐出所有的;p_nTXPower275 证实这是一个合理的策略。

我的下一步是将预测与输入时的实际值进行比较;为此,我想加入这两个流。加入使用事件时间戳,所以我需要时间戳正确排列。

(除此之外:虽然我有点事件,但我也可以使用间隔事件较短的间隔,以便我得到重叠的连接......当我到达它时我会越过那座桥)。

(为了完整性:当我收到处于周期中间的输入事件时,我的 UDSO 会输出一个“虚拟事件”,我使用事件有效负载中的一个字段来识别它。我过滤掉虚拟事件以创建预测的 -事件流。)

为了更清楚地说明这一点,这是我的接收器的一些输出。这些是上面提到的虚拟事件。每行开头的时间戳是 StreamInsight 事件时间(这些是点事件),每行末尾的时间戳实际上是我的有效负载中的一个字段。

12:03:30 PM CEP#NO_OUTPUT Predicted NaN  12:03:30 PM
12:03:40 PM CEP#NO_OUTPUT Predicted NaN  12:03:40 PM
12:03:50 PM CEP#NO_OUTPUT Predicted NaN  12:03:50 PM
12:04:00 PM CEP#NO_OUTPUT Predicted NaN  12:04:00 PM
12:04:10 PM CEP#NO_OUTPUT Predicted NaN  12:04:10 PM
12:04:20 PM CEP#NO_OUTPUT Predicted NaN  12:04:20 PM
12:04:30 PM CEP#NO_OUTPUT Predicted NaN  12:04:30 PM
12:04:40 PM CEP#NO_OUTPUT Predicted NaN  12:04:40 PM
12:04:50 PM CEP#NO_OUTPUT Predicted NaN  12:04:50 PM

实际的预测是这样的:

12:05:00 PM CEP#2#Space99 Predicted 0.57 12:05:10 PM
12:05:00 PM CEP#2#Space99 Predicted 0.66 12:05:20 PM
12:05:00 PM CEP#2#Space99 Predicted 1.54 12:05:30 PM
12:05:00 PM CEP#2#Space99 Predicted 1.34 12:05:40 PM
12:05:00 PM CEP#2#Space99 Predicted 1.31 12:05:50 PM
12:05:00 PM CEP#2#Space99 Predicted 0.93 12:06:00 PM
12:05:00 PM CEP#2#Space99 Predicted 2.19 12:06:10 PM
12:05:00 PM CEP#2#Space99 Predicted 0.86 12:06:20 PM

请注意,所有这些事件的时间都是相同的。这是因为我的 UDSO 将触发其计算p_n的时间戳分配给所有(一个周期) 。x_n

这与MSDN 文档一致—— “每个输出事件的时间戳是基于相应输入事件的时间戳”

我想做的是使用有效负载字段中的时间创建预测事件。

我认为我应该使用的是

ToPointStreamable(payload => PointEvent<MyPayload>.CreateInsert(payload.eventTime, payload)

,我尝试将其插入的方式是这样的:

var separated_stream = prediction_query.ToEnumerable(StreamEventOrder.FullyOrdered)
                                                   .ToPointStreamable(payload => PointEvent<MyPayload>.CreateInsert(payload.eventTime, payload),
                                                                      AdvanceTimeSettings.IncreasingStartTime);

prediction_query的类型是IQStreamable<MyPayload>.

这是行不通的。如上所示,事件即将到来并正在生成预测,但我的“ separated_stream”可能不存在。

使用与我的其他查询相同的模式打印到控制台 -

var observer = cepApplication_.DefineObserver(() => System.Reactive.Observer.Create<T>(/* print action */));
observer.Deploy(name);
separated_stream.Bind(observer).Run()

所以我认为那里没有任何错误。

我正在使用事件流调试器,但找不到此查询...但我确实找到了两个进程,我只识别其中一个中的流,所以我认为第二个可能与此有关separated_stream。诊断告诉我在此过程或其任何操作员中没有事件。查询和操作员一样“正在运行”,调试器中的任何内容都不像错误。

我的定义separated_stream不正确,我应该如何解决?

谢谢。

编辑:事件流调试器中的第二个进程与问题查询有关 - 如果我注释掉查询,则进程不会显示。

4

1 回答 1

0

哇。不确定我是否完全遵循除了一些建议之外的所有内容:首先,看看主题。请参阅此博客文章: http: //www.devbiker.net/post/Using-Subjects-as-a-e2809cFeedback-Loope2809d.aspx。您的详细信息会略有不同,但概念是相同的。第二……一个建议。不要将流中的事件视为点、间隔或边。他们不是,不是真的。事件形状是以对入口或出口有意义且方便的方式对事件的表达。全部引擎中的事件有开始时间和结束时间。您认为的“点事件”只是结束时间,即开始时间后 1 个滴答声。点、区间和边只是事件的不同表达方式,所有事件都可以是点、区间或边。在 LinqPad 中尝试一下,您会发现您可以通过三种方式转储完全相同的查询!

于 2013-09-25T03:22:54.857 回答