代码之家  ›  专栏  ›  技术社区  ›  Mark Rushakoff

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

  •  3
  • Mark Rushakoff  · 技术社区  · 16 年前

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

    数据收集的形式类似于:

    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发生并且时间为>3时x是什么”,那么我们将在第一个事件A上运行该回调,它将立即返回,因为时间不大于3。它将在4时再次运行,并报告x在t=4时为1。

    为了适应“时间窗口化”,我想我将(在背景中)在分析中附加一些条件。如果他们的分析只是“事件A发生时x是什么”,而当前窗口是1-5,那么我会将其更改为“事件A发生时x是什么,时间>=1,时间<=5”。如果下一个窗口是6-10,我可以根据需要重新调整条件。

    我的主要问题是: 这个适合什么式样? 我们显然不是第一个处理这样一个问题的人,但我还没有找到其他人是如何处理这个问题的。我可能只是不知道到底要在谷歌上搜索什么。 除了保存整个全局状态的字典以便在给定时间查找单个状态之外,还有其他方法吗? 还要注意的是,数据可能有几个,可能有几万条记录,所以数据集上的迭代次数越少越好。

    2 回复  |  直到 16 年前
        1
  •  4
  •   MusiGenesis    16 年前

    我认为您在这里的最佳方法是定期“快照”完整的状态数据,比如说每1000个样本(例如),并记录增量。当您将数据存储为与某个原始值(即delta)的偏移量时,您别无选择,只能从原始值开始重建完整的数据。存储定期快照将减少您必须执行的重建量——设计权衡一方面是在低存储需求但重建时间长,另一方面是在高存储需求但重建时间短之间。

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

        2
  •  1
  •   Dave Gamble    16 年前

    你可以在日志(n)中按时间搜索,你可以感觉到有多少更新是可以接受的…因此,我的解决方案是:

    选择一个可以接受的更新的数字n,以返回结果。256可能是好的,考虑到你提到的比例。

    每N条记录,向字典提交一个所有状态的条目,带有时间戳。

    现在,你有一个折衷,字典大小与速度。n->\infty是常规搜索。n<-1是您当前的解决方案,n任何其他地方都需要较少的内存,但速度较慢。

    您的实现现在是(对于时间x): 将子样本全局字典的搜索记录到x之前的时间戳(时间戳为y)。 将事件列表的(n)搜索记录到时间戳y,并执行少于n次的更新。

    选择n作为2的幂甚至可以让你做一些不错的移位技巧来做一个向下取整的整数除法,很快很好。

    推荐文章