web-dev-qa-db-ja.com

Pandas)のHDF5ストアに繰り返し書き込みます

PandasSeriesDataFrames、およびPanelsをHDF5ファイルに保存する方法の例を以下に示します。

いくつかのデータを準備します。

In [1142]: store = HDFStore('store.h5')

In [1143]: index = date_range('1/1/2000', periods=8)

In [1144]: s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e'])

In [1145]: df = DataFrame(randn(8, 3), index=index,
   ......:                columns=['A', 'B', 'C'])
   ......:

In [1146]: wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'],
   ......:            major_axis=date_range('1/1/2000', periods=5),
   ......:            minor_axis=['A', 'B', 'C', 'D'])
   ......:

ストアに保存します。

In [1147]: store['s'] = s

In [1148]: store['df'] = df

In [1149]: store['wp'] = wp

ストアの内容を調べます。

In [1150]: store
Out[1150]: 
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df            frame        (shape->[8,3])  
/s             series       (shape->[5])    
/wp            wide         (shape->[2,5,4])

ストアを閉じる:

In [1151]: store.close()

質問:

  1. 上記のコードでは、データが実際にディスクに書き込まれるのはいつですか

  2. .csvファイルに存在する何千もの大きなデータフレームを単一の.h5ファイルに追加したいとします。cannotは、すべてを一度にメモリに保存する余裕があるため、それらをロードして.h5ファイルに1つずつ追加する必要があります。メモリが多すぎます。これはHDF5で可能ですか?それを行う正しい方法は何でしょうか?

  3. Pandasドキュメントには次のように書かれています:

    「これらのストアは追加できません一度書き込んだ(単に削除して書き直しただけですが)queryableでもありません;それらは完全に取得する必要があります。」

    追加もクエリもできないとはどういう意味ですか?また、writtenの代わりにclosedと言ってはいけませんか?

23
  1. ステートメントが実行されるとすぐに、たとえばstore['df'] = dfcloseは、実際のファイルを閉じるだけです(プロセスが存在する場合は閉じられますが、警告メッセージが出力されます)

  2. セクションを読む http://pandas.pydata.org/pandas-docs/dev/io.html#storing-in-table-format

    一般に、多くのノードを.h5ファイルに入れることはお勧めできません。おそらく、より少ない数のノードを追加して作成する必要があります。

    .csvstore/appendを1つずつ繰り返すことができます。何かのようなもの:

    for f in files:
      df = pd.read_csv(f)
      df.to_hdf('file.h5',f,df)
    

    一方向になります(ファイルごとに個別のノードを作成します)

  3. 追加できません-一度作成すると、一度にすべてを取得することしかできません。サブセクションは選択できません

    テーブルがある場合は、次のようなことができます。

    pd.read_hdf('my_store.h5','a_table_node',['index>100'])
    

    これはデータベースクエリのようなもので、データの一部のみを取得します

    したがって、テーブルは両方であるのに対し、ストアは追加もクエリもできません。

15
Jeff

質問2に答えると、pandas 0.18.0で、次のことができます。

store = pd.HDFStore('compiled_measurements.h5')
for filepath in file_iterator:
    raw = pd.read_csv(filepath)
    store.append('measurements', raw, index=False)

store.create_table_index('measurements', columns=['a', 'b', 'c'], optlevel=9, kind='full')
store.close()

this ドキュメントの一部に基づいています。

持っているデータの量によっては、インデックスの作成で膨大な量のメモリが消費される可能性があります。 PyTablesのドキュメントでは、 optlevel の値について説明しています。

4
Pablo