时间序列差异- ArangoDB(AQL或Python)

n3schb8v  于 2022-12-09  发布在  Go
关注(0)|答案(2)|浏览(168)

我有一个保存文档的集合,每个文档都有一个数据观察和捕获数据的时间。例如{ _key:....,“data”:26,“timecaptured”:1643488638.946702 }
其中现在捕捉的时间是UTC时间戳。
我想做的是得到连续观察之间的持续时间,用SQL我可以用LAG来做这个,但是用ArangoDB和AQL我很难在数据库中看到如何做这个。所以有效地在时间顺序上两个文档之间的时间戳的差异。我有很多数据,我真的不想把它们都拉到panda中。
任何帮助都非常感谢。

iovurdzv

iovurdzv1#

虽然CodeManX提供的解决方案可以工作,但我更喜欢另一种解决方案:

FOR d IN docs
  SORT d.timecaptured
  WINDOW { preceding: 1 } AGGREGATE s = SUM(d.timecaptured), cnt = COUNT(1)
  LET timediff = cnt == 1 ? null : d.timecaptured - (s - d.timecaptured)
  RETURN timediff

我们只需计算前一个文档和当前文档的总和,然后减去当前文档的timecaptured,就可以计算出前一个文档的timecaptured,这样就可以轻松计算出所需的差值。
我只使用COUNT返回第一个文档的null(它没有前一个文档),如果第一个文档的差值为零,您可以简单地删除它。
然而,这两种方法都不是非常直接或明显的。我在我的TODO列表中添加了一个可以在WINDOW和COLLECT操作中使用的APPEND聚合函数。

qrjkbowd

qrjkbowd2#

WINDOW函数不能直接访问滑动窗口中的数据,但这里有一个相当聪明的解决方法:

FOR doc IN collection
  SORT doc.timecaptured
  WINDOW { preceding: 1 }
  AGGREGATE d = UNIQUE(KEEP(doc, "_key", "timecaptured"))
  LET timediff = doc.timecaptured - d[0].timecaptured
  RETURN MERGE(doc, {timediff})

UNIQUE()函数可用于窗口聚合,并可用于获取所需的数据(上一个文档)。聚合整个文档可能效率不高,因此应该使用投影,但请记住UNIQUE()将删除重复值。文档_key在集合中是唯一的,因此我们可以将其添加到投影中以确保UNIQUE()不会删除任何内容。
时间差的计算方法是将当前文档的值减去前一个文档的值timecaptured。对于第一条记录,d[0]实际上等于当前文档,差值最终为0。我认为这是明智的。你也可以写d[-1].timecaptured - d[0].timecaptured来实现同样的目的。另一方面,d[1].timecaptured - d[0].timecaptured将为您提供第一条记录的反转时间戳,因为d[1]null(没有以前的文档),并且计算结果为0
有一个风险:UNIQUE()可能会改变文档的顺序。您可以使用子查询再次按timecaptured进行排序:

LET timediff = doc.timecaptured - (
  FOR dd IN d SORT dd.timecaptured LIMIT 1 RETURN dd.timecaptured
)[0]

但是使用子查询的性能并不好,相反,可以使用聚合变量d来访问两个文档,并计算减法的绝对值,这样顺序就不重要了:

LET timediff = ABS(d[-1].timecaptured - d[0].timecaptured)

相关问题