我有以下两个数据集:
- 这个可以非常可靠地告诉我某个事件是否发生,但它的时间戳仅在几秒钟内有效(假设是 2 秒):
coarse = { "name": ["a", "a", "b", "c", "a"], "timestamp": [100, 103, 195, 220, 221], } coarse_df = pl.DataFrame(coarse) """ ┌──────┬───────────┐ │ name ┆ timestamp │ │ --- ┆ --- │ │ str ┆ i64 │ ╞══════╪═══════════╡ │ a ┆ 100 │ │ a ┆ 103 │ │ b ┆ 195 │ │ c ┆ 220 │ │ a ┆ 221 │ └──────┴───────────┘ """
- 这个具有非常准确的时间,但它有一些噪音/误报(请注意,
t=0
两个数据集是不同的,有一个任意偏移):fine = { "name": ["a", "a", "a", "a", "b", "c", "b", "a"], "time": [0.05, 10.05, 12.51, 51.12, 106.0, 128.01, 130.0, 132.9], } fine_df = pl.DataFrame(fine) """ ┌──────┬────────┐ │ name ┆ time │ │ --- ┆ --- │ │ str ┆ f64 │ ╞══════╪════════╡ │ a ┆ 0.05 │ │ a ┆ 10.05 │ │ a ┆ 12.51 │ │ a ┆ 51.12 │ │ b ┆ 106.0 │ │ c ┆ 128.01 │ │ b ┆ 130.0 │ │ a ┆ 132.9 │ └──────┴────────┘ """
我正在尝试以某种方式合并这些数据集以获得类似以下内容。本质上是从第二个数据集获取时间戳,并使用第一个数据集中的时间差来过滤掉误报。
"""
┌──────┬────────┐
│ name ┆ time │
│ --- ┆ --- │
│ str ┆ f64 │
╞══════╪════════╡
│ a ┆ 10.05 │
│ a ┆ 12.51 │
│ b ┆ 106.0 │
│ c ┆ 128.01 │
│ a ┆ 132.9 │
└──────┴────────┘
"""
编辑
我目前正在做什么来识别假阳性(用文字表示,因为这是一个丑陋的嵌套 for 循环):
鉴于两个数据集之间的偏移是任意的,假设第一个“a”事件是真实的:
现在coarse
看起来像是将时间转移了 100:
┌──────┬───────────┐
│ name ┆ timestamp │
│ --- ┆ --- │
│ str ┆ i64 │
╞══════╪═══════════╡
│ a ┆ 0 │ -> Good, there is a timestamp in `fine` within 2s
│ a ┆ 3 │ -> Bad, no timestamp in `fine` matches
│ b ┆ 95 │ -> Bad, ditto
│ c ┆ 120 │ -> Bad, ditto
│ a ┆ 121 │ -> Bad, ditto
└──────┴───────────┘
好的,我没有找到所有匹配项,那么第二个“a”一定是真正的“a”(而是偏移了 90 秒):
┌──────┬───────────┐
│ name ┆ timestamp │
│ --- ┆ --- │
│ str ┆ i64 │
╞══════╪═══════════╡
│ a ┆ 10 │ -> Good, it matches 10.05
│ a ┆ 13 │ -> Good, it matches 12.51
│ b ┆ 105 │ -> Good, it matches 106.0
│ c ┆ 130 │ -> Good, it matches 128.01
│ a ┆ 131 │ -> Good it matches 132.9
└──────┴───────────┘
基本上,我会随着时间滑动第二个数据集,直到找到一个“时间模式”,将第一个数据框中的所有事件匹配到第二个数据框的子集中。
可以使用“最近”策略通过ASOF JOIN生成最终表。
不过,听起来您想一次比较多个“移位值”。
并找到具有最多值的移位。