2013-02-06 55 views
2

我想使用像SQL这样的熊猫作为web应用程序(而不是在pSQL中保存数据,只是将其保存在pandas DataFrame中,因为数据刚刚低于1GB并且不会不断变化)。如果我正在根据列上的多个过滤器进行查找(例如,年龄> x,年龄< y,收入> p,收入< q)是否有任何方法来加速此过滤?或者它已经在下面完成了。在SQL中,会声明一个关于年龄和收入的索引来加速这样的查询,我想知道如果有的话,这是什么熊猫的方式。熊猫:通过创建索引加速过滤?

+0

你现在在做什么? –

回答

4

做此查询的“熊猫办法”是:

df[(x < df.age) & (df.age < y) & (p < df.income) & (df.income < q)] 

大熊猫指标都在默认情况下(包括所有列),所以你不必事先明确地声明你要什么查询。

(我不能说这是否成立将有意义的数据集。)

+0

“大熊猫默认索引一切” - 这就是我一直在寻找的!我现在已经像你所显示的那样做了,而且我看到一个具有100K行的数据集约30ms的时间,并且想知道这是否是最快的,或者如果我可以使用SQL并让它去更快。 – jason

+0

@jason你有没有试过计算SQL?我期望大熊猫的速度要快得多(有一点是它在内存中 - 尽管这意味着数据不是持久的,这是使用db的一个好处) –

+0

我现在没有一个方便测试的SQL设置,我计划在我准备好时测试它。但正如你所说,如果内存中的所有索引数据结构比SQL慢,我会感到非常惊讶。数据是只读的,所以我不需要任何持久性。 – jason

2

熊猫实际只是numpy.ndarray的包装。

所有的搜索都是使用ndarray内部进行的。

df[(df.age > x) & (y < df.age) & (df.income > p) & (df.income < q)] 

应该这样做。但是,您可以直接使用numpy.ndarray或通过使用蒙版阵列来加速进程:http://docs.scipy.org/doc/numpy/reference/maskedarray.html

这些将不会为新生成的阵列分配新的内存。这意味着您没有时间/ CPU的开销,无法为您的“过滤”结果查看和分配新内存,也不会因拷贝本身而导致内存开销。

然而,这是有代价的(实际上,这个因为面膜必须保存在某个地方,但你仍然没有复制你的表别的地方在内存中并不完全正确):屏蔽数组由于该过程必须检查内存中的每个值是否被屏蔽,因此需要更长的时间。但是,如果这只是为了“过滤”,这种特定的访问开销应该是不明显的(当人们想要使用被屏蔽的数组进行计算时,这变得非常重要)。

编辑:

有关磁盘和内存中的持久和优化的数据访问,存在被优化的方式PyTables。也就是说,Pytables以及Numpy/Pandas并不被认为是以这种方式使用的。

+0

假设我正在查询100K行数据,并且在应用上述4个过滤器后发现它只有100行结果集,那么这个副本可以忽略不计(不是?) - 除此之外,我还需要将这些数据返回给消费者,所以我不会通过在副本中工作来获取任何东西(否?) – jason

+0

您是对的:就您的情况而言,复制不会产生太多开销。所以你可以忽略这一点。 – 2013-02-06 09:35:31