我希望能够在Julia中进行类似于pandas的merge_asof
或QuestDB的ASOF JOIN
。关键是,我还需要应用分组操作。
我很乐意使用Julia的Table.jl
工具。DataFrame的leftjoin
接近了,但需要精确的键值匹配,并且不支持分组(据我所知)。SplitApplyCombine.jl的leftgroupjoin
允许您传入自己的比较函数,但我不太清楚如何使用该函数指定“最接近小于”值或“最接近大于”值。
对于一个简单的例子,在两个带有time
列的表格left
和right
上,我可以使用以下函数:
function find_nearest_before(val, data)
findlast(x -> x <= val, data)
end
[find_nearest_before(t, right.time) for t in left.time]
这样可以得到在right
中与left
相匹配的索引。但是,我不太清楚如何将其与分组一起使用。
编辑
添加一个示例以使问题更清晰。第一个表sensor_pings
报告传感器何时看到某物。第二个表in_sensor_FOV
告诉我们在给定时间内实际上在传感器视野(FOV)中的对象是什么。假设传感器在其FOV中只有一个对象(反之未必正确)。
julia> using TypedTables
julia> sensor_pings = Table(time=[4,5,7,8,9,10,11,13,15,16], sensor_id=[2,1,1,3,2,3,1,2,3,2])
Table with 2 columns and 10 rows:
time sensor_id
┌────────────────
1 │ 4 2
2 │ 5 1
3 │ 7 1
4 │ 8 3
5 │ 9 2
6 │ 10 3
7 │ 11 1
8 │ 13 2
9 │ 15 3
10 │ 16 2
julia> in_sensor_FOV = Table(time=[1.3,2.6,3.8,5.9,7.3,8.0,12.3,14.7], sensor_id=[3,1,2,3,2,2,3,1], object_in_sensor_FOV=[:a,:b,:c,:b,:c,:a,:c,:b])
Table with 3 columns and 8 rows:
time sensor_id object_in_sensor_FOV
┌──────────────────────────────────────
1 │ 1.3 3 a
2 │ 2.6 1 b
3 │ 3.8 2 c
4 │ 5.9 3 b
5 │ 7.3 2 c
6 │ 8.0 2 a
7 │ 12.3 3 c
8 │ 14.7 1 b
所需操作的最终结果将如下所示:
julia> Table(time=[4,5,7,8,9,10,11,13,15,16], sensor_id=[2,1,1,3,2,3,1,2,3,2], object_in_sensor_FOV=[:c,:b,:b,:b,:a,:b,:b,:a,:c,:a])
Table with 3 columns and 10 rows:
time sensor_id object_in_sensor_FOV
┌──────────────────────────────────────
1 │ 4 2 c
2 │ 5 1 b
3 │ 7 1 b
4 │ 8 3 b
5 │ 9 2 a
6 │ 10 3 b
7 │ 11 1 b
8 │ 13 2 a
9 │ 15 3 c
10 │ 16 2 a
right
表有time
、region
和item
这些列,我想按region
来进行分组。如果我先进行不精确匹配,可能会将一个地区的行与另一个地区的行匹配起来。 - natemcintosh