2014-03-07 70 views
2

我正在處理大量數據集,每個數據集都是一個pandas DataFrame,因爲它們的大小,我需要從磁盤訪問它。從我讀到的內容來看,HDF看起來是一個很好的工作方式,但是由於各個DataFrame中包含的各種元數據元素,我對構建數據的最佳方式感到困惑。如果我存儲在內存中的數據我大概可以使用像一個namedtuple(雖然這不會允許輕鬆查詢):在HDF商店中構造數據

DataSet = namedtuple('DataSet', 'model method id data') 

data是控股的實際數據框屬性,和其它字段文本。但是,我現在需要包含一系列結果字段,我可能會在內存中使用DataFrame的字典來完成這些結果字段。如果我這個轉儲到MongoDB中,我想可能有一些看起來像這樣:

[{ 
    model: 'mir', 
    method: 'rfl_max', 
    id: 's0001', 
    data: <DataFrame>, 
    results: [ 
     { 
      option_r: 10, 
      window: 30, 
      data: <DataFrame> 
     }, 
     ... 
    ] 
}, 
.... 
] 

我的基本問題是,我可以有效地這種結構適用於HDF?具體如下:

  1. HDF是否支持這種嵌套,如果是的話,我該怎麼做?
  2. 查找這樣的數據在mongo中效率很高,因爲它使用索引。對於HDF也是如此,例如我能否有效地找到匹配特定方法和option_r的所有結果?
  3. 我對HDF的經驗有限,是通過熊貓,這似乎只允許存儲面板上的Series,DataFrames。這是一個真正的限制,還是我只是做錯了什麼?

另外,有沒有人知道一個基於文件的mongodb實現可能符合我的目的?

回答

2

HDFStore支持分層索引,請參閱here

您可以存儲附加到特定節點的屬性,請參閱here。這通常僅限於少量的元數據。

HDF5在存儲/搜索實際數據方面非常有效,例如,一個DataFrame。結構是2你,但它不是爲了競爭,而是它可以補充mongodb。 mongo擅長於保持/搜索這些'json-like'類型的嵌套結構。

您可以始終保持對數據實際位置(DataFrame/Series)的引用,而不是mongo數據庫中的實際數據。

對於存儲/搜索實際數據(除了非常小的數據集),HDF5將快幾個數量級。

+0

感謝您的回覆。所以你說在mongo中任何複雜的查詢都會更好,但是將數據存儲在HDF5中是好的嗎?我試圖避免mongo,因爲它需要一箇中央服務器(我無法訪問),因此很難共享數據。每個DataFrame都不是很大,目前我只是在酸洗它們並將它們加載到內存中,所以也許我應該繼續, – aquavitae

+0

複雜查詢當然可以在HDF5中完成。但是,您無法輕鬆查詢節點本身。請參閱pytables.org更多信息。 – Jeff