2012-12-06 55 views
3

我想使用Pandas實時處理系列。每一秒鐘,我都需要將最新觀察添加到現有系列中。我的系列被分組到一個DataFrame中並存儲在一個HDF5文件中。高效添加單行到Pandas系列或DataFrame

這裏是我如何做到這一點的時刻:

>> existing_series = Series([7,13,97], [0,1,2]) 
>> updated_series = existing_series.append(Series([111], [3])) 

這是最有效的方法是什麼?我讀過無數篇文章,但無法找到任何關注高頻數據效率的文章。

編輯:我剛剛閱讀了關於模塊擱置和醃製。看起來他們會實現我想要做的,基本上是在磁盤上保存列表。由於我的列表很大,有沒有辦法不將完整列表加載到內存中,而是有效地追加一個值?

+2

這可能與任何有效的一樣,但熊貓/ numpy結構從根本上不適合有效地增長。當它們以固定尺寸創建並保持這種狀態時,它們的工作效果最佳。 – BrenBarn

+1

'append'是'concat'的一個包裝器,所以'concat'會稍微更有效率,但是@BrenBarn說Pandas可能不適合每秒更新一次HDF5文件。如果您出於某種原因絕對需要熊貓,您是否可以收集系列清單並定期更新文件? –

+0

Bren是正確的關於預分配時最佳工作的numpy/pandas。如果內存不是約束,只需預先分配一個巨大的零數組,並在程序結尾追加刪除多餘的零。我想這是Matti說的一點點。 – arynaq

回答

2

看看0.10中的新PyTables文檔(即將推出),或者您可以從主站獲得。 http://pandas.pydata.org/pandas-docs/dev/whatsnew.html

PyTables實際上是非常好的附加功能,並且每秒都會寫入HDFStore。你想存儲一個DataFrame表。然後你可以選擇像時尚這樣的查詢中的數據,例如

store.append('df', the_latest_df) 
store.append('df', the_latest_df) 
.... 
store.select('df', [ 'index>12:00:01' ]) 

如果這一切都來自相同的過程,那麼這將工作得很好。如果你有一個編寫器進程,然後另一個進程正在讀取,這是有點棘手(但會根據你在做什麼正確工作)。

另一個選擇是使用消息傳遞從一個進程傳輸到另一個進程(然後添加到內存中),這樣可以避免序列化問題。

相關問題