Tenho os 2 conjuntos de dados a seguir:
- Este é muito confiável para me dizer se um evento aconteceu, mas seu registro de data e hora só é válido com uma precisão de alguns segundos (vamos supor 2 segundos):
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 │ └──────┴───────────┘ """
- Este tem um tempo muito preciso, mas tem alguns ruídos/falsos positivos (observe que
t=0
é diferente para ambos os conjuntos de dados, há um deslocamento arbitrário):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 │ └──────┴────────┘ """
Estou tentando de alguma forma juntar esses conjuntos de dados para obter algo como o seguinte. Essencialmente, obtendo os timestamps do segundo conjunto de dados e usando as diferenças de tempo no primeiro conjunto de dados para filtrar os falsos positivos.
"""
┌──────┬────────┐
│ name ┆ time │
│ --- ┆ --- │
│ str ┆ f64 │
╞══════╪════════╡
│ a ┆ 10.05 │
│ a ┆ 12.51 │
│ b ┆ 106.0 │
│ c ┆ 128.01 │
│ a ┆ 132.9 │
└──────┴────────┘
"""
EDITAR
O que estou fazendo atualmente para identificar falsos positivos (em palavras, porque este é um loop for aninhado feio):
Dado que o deslocamento entre ambos os conjuntos de dados é arbitrário, suponha que o primeiro evento "a" seja o real:
Agora coarse
parece que o tempo mudou em 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
└──────┴───────────┘
Ok, não encontrei todos os resultados, então o segundo "a" deve ser o real (deslocado em 90 segundos):
┌──────┬───────────┐
│ 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
└──────┴───────────┘
Basicamente, estou deslizando o segundo conjunto de dados pelo tempo até encontrar um "padrão de tempo" que corresponda a todos os eventos no primeiro quadro de dados em um subconjunto do segundo.
A tabela final pode ser gerada com um ASOF JOIN usando a estratégia "mais próxima" .
No entanto, parece que você quer comparar vários "valores de deslocamento" de uma só vez.
E encontre o(s) turno(s) com mais valores.