通过Julia中的“中间”键查询的高效数据结构

时间:2019-01-09 11:52:30

标签: julia

我有一个这样的数据库

key - value
0     10
1.2   20
2.7   25
3.5   35
...

我想创建一个函数,该函数在给定连续键的情况下检索相关值,例如对于0.2或0.4,应返回10;对于[2.7,3.5 [中的任何值,应返回25;高于或等于最后一个键的所有值应返回35。

原始数据结构是一个数据框,目前我在它的每一行上使用循环,但是我想知道其他哪种数据结构(可能在Base中)会更有效,尤其是在查询中。

1 个答案:

答案 0 :(得分:4)

如果您的key已排序,则假设df是存储数据的DataFrame,这样的事情应该很有效:

df.value[searchsortedlast(df.key, value_you_want_to_find)]

使用屏障将其包装在函数中可能会更快一些(但我想不是很多):

range_find(df::AbstractDataFrame, val) =
    _range_find(df.key, df.value, val)

_range_find(key::AbstractVector, value:AbstractVector, val) =
    value[searchsortedlast(key, val)]

编辑:

根据您的范围条件,应该为searchsortedlast

请注意,如果您将val设置为小于values的最小值,则此函数将引发错误,但是如果您传递的val大于最后一个值,则该函数将返回最后一个值(本质上,最后一个间隔假定为[df.values[end], Inf[。如果您希望对“边界”使用其他行为,则必须手动添加一些其他检查。