2013-05-27 33 views
0

所有,大熊貓的Panel

我目前正在試圖優化小回溯測試程序,我已經建立了我自己的一些子例程使用.AT功能時返回一個副本。我有一個'current_data'熊貓面板,其中包含所有數據。

我想如下訪問它:

self.current_data.at[order['instrument'], self.current_day, 'low'] 

然而,這是非常緩慢的。從文檔看來,這應該會返回一個視圖 - 因爲我沒有設置任何值。我正在使用最新的熊貓(0.11.0)。

你能說出爲什麼會這樣嗎?也許更快的方式來做到這一點?

順便說一句,我知道這是一個副本,因爲探查表明,frame.py:383(INIT)被調用每一次,如果我減少對象的大小此行大大加快。

乾杯!

編輯:

下面是如何重新建立我的問題。我現在看到問題可能不在.at。

items = ['A', 'B', 'C', 'D'] 
cols = ['a', 'b', 'c', 'd'] 


indices = pd.date_range(datetime.datetime.now(), periods=1000, freq="D") 
res = {} 
for item in items: 
    res[item] = pd.DataFrame(np.random.randn(1000, 4), columns=cols, index=indices) 

first = pd.Panel(res) 

print timeit.Timer(""" 
for i in range(100, 200): 
    today = indices[i] 
    first_change = first.ix[:, :i + 1, :] 
    first_change.at["A", today, "a"] 
    first_change.at["A", today, "b"] 
    first_change.at["A", today, "c"] 
""", setup="from __main__ import first, indices").timeit(number=50)/50.0 

#--- Time: 0.0307311664639 

indices = pd.date_range(datetime.datetime.now(), periods=10000, freq="D") 
res = {} 
for item in items: 
    res[item] = pd.DataFrame(np.random.randn(10000, 4), columns=cols, index=indices) 
second = pd.Panel(res) 

print timeit.Timer(""" 
for i in range(8100, 8200): 
    today = indices[i] 
    second_change = second.ix[:, :i + 1, :] 
    second_change.at["A", today, "a"] 
    second_change.at["A", today, "b"] 
    second_change.at["A", today, "c"] 
""", setup="from __main__ import second, indices").timeit(number=50)/50.0 

#--- Time: 0848793384464 

無論如何,這基本上是發生了什麼事情。它可能在.ix函數中,但它只是簡單地返回一個視圖,所以我不明白爲什麼需要更多時間。

這個問題可能不在.at然後,我想。

+0

這個定義返回一個標量值。如果你正在放大,那麼它會創建並返回一個新的對象,請參閱:http://pandas.pydata.org/pandas-docs/dev/indexing.html#fast-scalar-value-getting-and-setting,什麼你想要做什麼? – Jeff

+0

我只需要從面板中獲取特定的標量,在特定的位置。 order ['instrument']類似於AAPL,self.current_day是當天的索引,'low'是列名。 我試圖用ix來執行相同的操作,但需要更多的時間。 –

+0

轉置,使你的變暗如下:物品(低)x主要(日期)x次要(ids),將提供更好的性能 – Jeff

回答

0

你必須測量別的東西,at是一個恆定的時間操作。請在你正在做的事情中展示一些更詳細的信息(例如樣本面板和訪問器)

In [24]: p = Panel(randn(1,1,1)) 

In [25]: %timeit p.at[0,0,0] 
100000 loops, best of 3: 5.33 us per loop 

In [26]: p = Panel(randn(10,10,10)) 

In [27]: %timeit p.at[0,0,0] 
100000 loops, best of 3: 5.34 us per loop 

In [28]: p = Panel(randn(100,100,100)) 

In [29]: %timeit p.at[0,0,0] 
100000 loops, best of 3: 5.28 us per loop 

In [30]: p = Panel(randn(1000,1000,1000)) 

In [31]: %timeit p.at[0,0,0] 
100000 loops, best of 3: 5.36 us per loop 
+0

你是對的 - 它不在.at中。檢查編輯。 奇怪的是,.at在累積運行時間增加的函數。這可能是cProfile中的一個錯誤,但我不知道。 –

+0

在這種情況下''.ix''可能不會*總是*回到視圖,它實際上取決於numpy如何對齊內存。如果你嘗試使用換位面板(例如,你的專業是你的項目變暗),那麼我認爲你總是會得到一個視圖,但是因爲你正在迭代另一個暗點,所以我不能100%確定。這可以解釋差異。 – Jeff

+0

謝謝!我已經選擇重構一切,而不是處理所有這些小的性能問題。我現在使用的是數據框和字典,它基本上是用1秒完成之前8秒完成的所有工作。 由於我不必操縱很多範圍/切片,我認爲這是最好的選擇。 –