小编典典

有效存储具有很少变化变量的时间序列数据

all

我必须存储和分析从多个设备接收到的时间序列数据。每个设备每 20 毫秒发出一次数据,并且应存储大量变量 (50+)。每个样本的一些数据都在变化,但其他离散数据(枚举或布尔值)的变化频率较低(参见下面的示例)

目前,我正在使用由 Python (pandas) 提供的 TimescaleDb,并且通过根据典型变化率对数据进行分组,将数据拆分到多个表中。仅存储更改。最后,使用这种方法确实优化了数据量。

但是我在分析这些数据时遇到了麻烦,因为通常我必须运行查询并知道给定“时间戳”上所有“Data_x”值的值。目前,它需要一些复杂的重建过程,使用“ Last-Observation-Carried_Forward ”等。

会有更好的解决方案吗?

完整的数据集

时间戳 数据_1 数据_2 数据_3
2022-06-12 17:52:43.000 22.2 0 0
2022-06-12 17:52:44.000 25.4 0 1
2022-06-12 17:52:45.000 29.2 1 0
2022-06-12 17:52:46.000 31.3 1 0
2022-06-12 17:52:47.000 31.4 1 0
2022-06-12 17:52:48.000 33.7 0 1

Data_1 表

时间戳 数据_1
2022-06-12 17:52:43.000 22.2
2022-06-12 17:52:44.000 25.4
2022-06-12 17:52:45.000 29.2
2022-06-12 17:52:46.000 31.3
2022-06-12 17:52:47.000 31.4
2022-06-12 17:52:48.000 33.7

Data_2_and_3 表 (注意表中只有 4 个样本,因为只记录了变化。

时间戳 数据_2 数据_3
2022-06-12 17:52:43.000 0 0
2022-06-12 17:52:44.000 0 1
2022-06-12 17:52:45.000 1 0
2022-06-12 17:52:48.000 0 1

阅读 59

收藏
2022-06-15

共1个答案

小编典典

无法分析这些数据…
会有更好的解决方案吗?

很难说。您并没有真正向我们描述分析挑战。 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem


中心问题似乎是如何将“太多数据”归结为更少的行。

对于您当前使用的数据框方法,在 data_{1,2,3} 上使用 1 秒的固定分辨率时间戳,除了合成这些“结转”值之外别无选择。

从数据开始的自下而上压缩方法将忽略不相关的列,然后抑制任何未更改的行。如果间隔几乎没有变化,这可能会将一小时内的 3600 个观测值压缩到几百个。

从应用程序方面来看,自上而下的压缩方法会让您只关注应用程序感兴趣的时间戳,可能以 3 秒为间隔。有些事情可能会改变得更快,但应用程序不在乎。这可能更适合自定义 postgres 查询。

你没有描述你的应用程序。也许它并不真正需要等时样本,并且抑制“过于频繁”的观察就足够了。因此,如果您以标称的 3 秒间隔进行拍摄,并且在中午 +0、+1 和 +5 秒进行了观察,则 +1 读数被抑制,实际上我们以 5 秒的间隔结束。


聚合/抑制观察时,您可以自由选择

  • first
  • last
  • min
  • max
  • median
  • avg
  • imputed (interpolated)

根据您的应用程序的高级需求。


定义一个损失度量,例如“% error”。

以 K 秒的间隔聚合您的数据,K 的范围可能从 0.1 到 600,并评估与以最小可能间隔计算相关的损失。

权衡取舍后,选择一个 K 值,让您的应用程序以可接受的低损失计算速度。


也许您正在对在频域中更自然地查看的数据执行时域分析。在这种情况下,FFT是您的朋友。使用“自上次更改值以来的增量时间”来增加每个时间戳可能会大大简化您的数据处理任务。

2022-06-15