首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何改进数据检索中的索引

如何改进数据检索中的索引
EN

Stack Overflow用户
提问于 2018-08-11 21:50:57
回答 1查看 505关注 0票数 2

给出了熊猫的数据和时间戳指数,排序。我有一个标签,我需要找到最接近那个标签的索引。另外,我需要找到一个更小的时间戳,所以搜索应该在小时间戳中计算。这是我的代码:

代码语言:javascript
运行
复制
import pandas as pd
import datetime

data = [i for i in range(100)]
dates = pd.date_range(start="01-01-2018", freq="min", periods=100)
dataframe = pd.DataFrame(data, dates)

label = "01-01-2018 00:10:01"
method = "pad"
tol = datetime.timedelta(seconds=60)
idx = dataframe.index.get_loc(key=label, method="pad", tolerance=tol)

print("Closest idx:"+str(idx))
print("Closest date:"+str(dataframe.index[idx]))

搜索太慢了。有什么办法可以改进吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-11 22:27:42

为了提高性能,我建议您对正在搜索的内容进行转换。与使用get_loc不同,您可以将DateTimeIndex转换为Unix,并在底层numpy数组上使用np.searchsorted (顾名思义,这需要一个排序索引)。

get_loc

(你目前的做法)

代码语言:javascript
运行
复制
label = "01-01-2018 00:10:01"
tol = datetime.timedelta(seconds=60)
idx = dataframe.index.get_loc(key=label, method="pad", tolerance=tol)
print(dataframe.iloc[idx])

0    10
Name: 2018-01-01 00:10:00, dtype: int64

现在是时间:

代码语言:javascript
运行
复制
%timeit dataframe.index.get_loc(key=label, method="pad", tolerance=tol)
2.03 ms ± 81.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

np.searchsorted

代码语言:javascript
运行
复制
arr = df.index.astype(int)//10**9
l = pd.to_datetime(label).timestamp()
idx = np.max(np.searchsorted(arr, l, side='left')-1, 0)
print(dataframe.iloc[idx])

0    10
Name: 2018-01-01 00:10:00, dtype: int64

还有时间安排:

代码语言:javascript
运行
复制
%timeit np.max(np.searchsorted(arr, l, side='left')-1, 0)
56.6 µs ± 979 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

(我没有包括安装成本,因为最初的数组创建应该是一次,然后对每个查询使用,但是即使包括了设置成本,这个方法也更快):

代码语言:javascript
运行
复制
%%timeit
arr = df.index.astype(int)//10**9
l = pd.to_datetime(label).timestamp()
np.max(np.searchsorted(arr, l, side='left')-1, 0)

394 µs ± 3.84 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

上面的方法没有强制执行对60s的容忍度,尽管这是很简单的检查:

代码语言:javascript
运行
复制
>>> np.abs(arr[idx]-l)<60
True
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51804034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档