2013-02-06 54 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