所有,大熊貓的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然後,我想。
這個定義返回一個標量值。如果你正在放大,那麼它會創建並返回一個新的對象,請參閱:http://pandas.pydata.org/pandas-docs/dev/indexing.html#fast-scalar-value-getting-and-setting,什麼你想要做什麼? – Jeff
我只需要從面板中獲取特定的標量,在特定的位置。 order ['instrument']類似於AAPL,self.current_day是當天的索引,'low'是列名。 我試圖用ix來執行相同的操作,但需要更多的時間。 –
轉置,使你的變暗如下:物品(低)x主要(日期)x次要(ids),將提供更好的性能 – Jeff