web-dev-qa-db-ja.com

Pandasを使用してHDF5ファイルにデータを追加する、Python

財務データを含む大きなpandas DataFramesがあります。h5ファイルに追加の列とDataFramesを追加して連結しても問題ありません。

財務データは毎分更新されています。毎分.h5ファイル内のすべての既存のテーブルにデータ行を追加する必要があります。

これが私がこれまでに試したことですが、何をしても、.h5ファイルを上書きし、データを追加するだけではありません。

HDFStoreの方法:

#we open the hdf5 file
save_hdf = HDFStore('test.h5') 

ohlcv_candle.to_hdf('test.h5')

#we give the dataframe a key value
#format=table so we can append data
save_hdf.put('name_of_frame',ohlcv_candle, format='table',  data_columns=True)

#we print our dataframe by calling the hdf file with the key
#just doing this as a test
print(save_hdf['name_of_frame'])    

私が試したもう一つの方法、to_hdf:

#format=t so we can append data , mode=r+ to specify the file exists and
#we want to append to it
tohlcv_candle.to_hdf('test.h5',key='this_is_a_key', mode='r+', format='t')

#again just printing to check if it worked 
print(pd.read_hdf('test.h5', key='this_is_a_key'))

次に、read_hdfを実行した後のデータフレームの1つを示します。

           time     open     high      low    close     volume           PP  
0    1505305260  3137.89  3147.15  3121.17  3146.94   6.205397  3138.420000   
1    1505305320  3146.86  3159.99  3130.00  3159.88   8.935962  3149.956667   
2    1505305380  3159.96  3160.00  3159.37  3159.66   4.524017  3159.676667   
3    1505305440  3159.66  3175.51  3151.08  3175.51   8.717610  3167.366667   
4    1505305500  3175.25  3175.53  3170.44  3175.53   3.187453  3173.833333  

次にデータを取得するとき(毎分)に、すべての列のインデックス5にその行を追加します。その後、ファイル全体を読み取って操作する必要なく、6と7と続きます。これを行うことのポイントを無効にするメモリ。これを解決するより良い方法がある場合は、恥ずかしがらずにお勧めします。

追伸ここでそのテーブルのフォーマットを申し訳ありません

8
Karl

pandas.HDFStore.put() にはパラメータappendがあります(デフォルトはFalse)-Pandasの代わりに上書きするように指示します追加。

だからこれを試してください:

_store = pd.HDFStore('test.h5')

store.append('name_of_frame', ohlcv_candle, format='t',  data_columns=True)
_

store.put(..., append=True)も使用できますが、このファイルもテーブル形式で作成する必要があります。

_store.put('name_of_frame', ohlcv_candle, format='t', append=True, data_columns=True)
_

注:追加はtable(_format='t'_-は_format='table'_のエイリアス)形式でのみ機能します。

10
MaxU
tohlcv_candle.to_hdf('test.h5',key='this_is_a_key', append=True, mode='r+', format='t')

別の引数append=Trueを渡して、既存のデータに追加するのではなく、そのキーの下にデータを追加することを指定する必要があります。 -それを書きます。

これがない場合、デフォルトはFalseであり、'this_is_a_key'の下にある既存のテーブルが検出されると、上書きされます。

mode=引数はファイルレベルでのみ存在し、ファイル全体を上書きするか追加するかを示します。

1つのファイルには任意の数のキーを含めることができるため、mode='a', append=False設定は、1つのキーのみが上書きされ、他のキーは保持されることを意味します。

私はあなたと同じような経験があり、リファレンスドキュメントに追加の引数があることを発見しました。設定した後は、適切に追加されます。

参照: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_hdf.html

注:hdf5は、データフレームのインデックスで何もしません。データを入れる前に、または取り出すときに、それらを取り除く必要があります。

2
Nikhil VJ