从时间序列数据事件重建状态

时间:2009-07-09 12:42:19

标签: language-agnostic time-series

对于特定项目,我们获取了许多事件的数据,并同时收集有关这些事件的变量。收集数据后,我们对所述数据执行用户可自定义的分析,以确定用户感兴趣的是什么。

以类似于以下的形式收集数据:

Timestamp    Event
0            x = 0
0            y = 1
3            Event A occurred
3            x = 1
4            Event A occurred
4            x = 2
9            Event B occurred
9            y = 2
9            x = 0

要随时了解整个状态,最直接的方法是遍历整个数据集。例如,如果我从时间0开始,并且“分析”直到时间戳5,我知道那时x = 2,y = 1,并且事件A已经发生两次。这是一个非常简单的例子。用户可能<(并且经常)对事件之间的时间感兴趣,例如从A到B,并且他们可能指定第一次出现A,然后是B,或者最后一次出现A,然后B(分别为9-3 = 6或9-4 = 5)。就像我说的那样,当你走遍整个场景时,这很容易分析。

现在,我们需要调整模型来分析任意时间窗口。如果我们看一下0-N,这就是一个简单的例子。但是,如果我看1-5,例如,我没有y的概念,除非我从0开始并知道y最初为1并且在1-5窗口中没有变化。

我们的方法是基本上创建变量字典,并对事件运行回调。如果一个分析是“当事件A发生时什么是x并且时间> 3”那么我们将在第一个事件A上运行该回调,并且它将立即返回,因为时间不大于3.它将再次运行在4 ,并且它会报告在t = 4时x为1。

为了适应“时间窗”,我认为我将(在后台)处理分析的其他条件。如果他们的分析只是“当事件A发生时什么是x”,并且当前窗口是1-5,那么我将其更改为“事件A发生时什么是x,时间&gt; = 1和时间&lt; = 5 ”。然后,如果下一个窗口是6-10,我可以根据需要重新调整条件。

我的主要问题是:这种模式适合哪种模式?我们显然不是第一个接近这样的问题的人,但我无法找到其他人如何接近它。我可能只是不知道究竟要在Google上搜索什么。 除了保留整个全局状态的字典以便在给定时间查找单个状态之外,还有其他方法吗?还要注意数据可能有几个,也许成千上万的记录,所以对数据集的迭代次数越少越好。

2 个答案:

答案 0 :(得分:4)

我认为你最好的方法是定期拍摄完整状态数据的“快照”,例如每1000个样本(例如),并记录增量。当您将数据存储为来自某些原始值(也称为增量)的偏移量时,除了从原始值开始重建完整数据之外,您没有任何选择。存储定期快照将减少您必须进行的重建 - 设计权衡是在低存储要求之间,但一方面是重建时间长,另一方面是更高的存储要求,但是重建时间更短。

例如,MPEG将每个帧存储为当前帧和前一帧之间的差异。通常,这会强制从头开始查看MPEG,但格式也会周期性地存储完整帧,这样解码器就不必一直回溯到文件的开头。

答案 1 :(得分:1)

你可以按时间在Log(N)中搜索,你可以感受到多少更新是可以接受的...因此这是我的解决方案:

选择可接受的更新数N,以便返回结果。考虑到你到目前为止提到的尺度,256可能是好的。

每N条记录,使用时间戳将所有状态的条目提交到字典。

现在,你有一个权衡,字典大小与速度。 N&gt; \ infty是常规搜索。 N&lt; -1是你当前的解决方案,N在其他任何地方都需要更少的内存,但速度更慢。

您的实施现在(时间X): 将二次采样全局字典的日志(n)搜索到X之前的时间戳,(时间戳为Y)。 将事件列表的日志(n)搜索到时间戳Y,并执行少于N次更新。

选择N作为2的幂将甚至允许你做一些漂亮的移位技巧来做一个很好的和快速的向下舍入整数除法。