在pytables中相当于“从表中选择最大值(列)”

时间:2012-03-31 05:05:10

标签: python sql pytables

我有一个包含大量数值的表,我知道我可以提取列并对其执行max(),但是可能有一种方法可以使用in-kernel方法来实现。但似乎无法找到它。

3 个答案:

答案 0 :(得分:6)

在我做过的测试中,使用iterrows方法而不是在哪里可以获得超过两倍的结果:

In [117]: timeit max(row['timestamp'] for row in table.iterrows(stop=1000000))
1 loops, best of 3: 1 s per loop

In [118]: timeit max(row['timestamp'] for row in table.where('(timestamp<=Tf)'))
1 loops, best of 3: 2.21 s per loop

In [120]: timeit max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 974 ms per loop

In [121]: timeit np.max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 876 ms per loop

注意,上面的Tf是该列的1000000条目(它是Float64)。

由于问题没有要求进行比较检查,因此可以避免测试... 请注意,问题中提出的方法(将数据加载为numpy数组)仍然稍微快一点(尽管差异小于3%,对于较大的数据集而言,进一步缩小,我没有测试超过10 ^ 7行)。  我发现使用max numpy函数的最佳结果(见上文)。

我也很乐意学习更有效的方法!

答案 1 :(得分:3)

我发现这样做的最快方法是将你的表格索引到你感兴趣的cols上:

table.cols.timestamp.createCSIndex()

一旦编入索引,获得最大值几乎是即时的:

max_timestamp = table.cols.timestamp[table.colindexes['timestamp'][-1]]

这将首先从表的Index对象获取时间戳列(table.colindexes['timestamp'][-1])的最后一个(对应于最大时间戳)行索引,然后它将只通过索引获取它指向的行进入相应的列引用(table.cols.timestamp)。

答案 2 :(得分:1)

来自High Performance Data Management with PyTables & Family(pdf):

e = sum(row['col1'] for row in table.where(3<table.cols.col2<=20))

修改此项以使用max()

e = max(row['col1'] for row in table.where(3<table.cols.col2<=20))