2017-05-07 7 views
2

Dask DataFramesのリストにロードしたいHDF5ファイルがあります。 Dask pipeline approachの短縮版に続くループを使用してこれを設定しました。Python Dask DataFramesのリストにHDFファイルをロード

import pandas as pd 
from dask import compute, delayed 
import dask.dataframe as dd 
import os, h5py 

@delayed 
def load(d,k): 
    ddf = dd.read_hdf(os.path.join(d,'Cleaned.h5'), key=k) 
    return ddf 

if __name__ == '__main__':  
    d = 'C:\Users\User\FileD' 
    loaded = [load(d,'/DF'+str(i)) for i in range(1,10)] 

    ddf_list = compute(*loaded) 
    print(ddf_list[0].head(),ddf_list[0].compute().shape) 

私は、このエラーメッセージが表示されます::

C:\Python27\lib\site-packages\tables\group.py:1187: UserWarning: problems loading leaf ``/DF1/table``:: 

    HDF5 error back trace 

    File "..\..\hdf5-1.8.18\src\H5Dio.c", line 173, in H5Dread 
    can't read data 
    File "..\..\hdf5-1.8.18\src\H5Dio.c", line 543, in H5D__read 
    can't initialize I/O info 
    File "..\..\hdf5-1.8.18\src\H5Dchunk.c", line 841, in H5D__chunk_io_init 
    unable to create file chunk selections 
    File "..\..\hdf5-1.8.18\src\H5Dchunk.c", line 1330, in H5D__create_chunk_file_map_hyper 
    can't insert chunk into skip list 
    File "..\..\hdf5-1.8.18\src\H5SL.c", line 1066, in H5SL_insert 
    can't create new skip list node 
    File "..\..\hdf5-1.8.18\src\H5SL.c", line 735, in H5SL_insert_common 
    can't insert duplicate key 

End of HDF5 error back trace 

Problems reading the array data. 

The leaf will become an ``UnImplemented`` node. 
    % (self._g_join(childname), exc)) 

メッセージが重複キーを言及してここでは、コードです。私はコードをテストするために最初の9つのファイルを繰り返し、そして私はdd.read_hdfで使用する別のキーをアセンブルするために各繰り返しを使用しています。すべての反復にわたって、私はファイル名を同じにしておきます - 鍵だけが変更されています。

ファイルの内容を垂直方向に連結するには、dd.concat(list,axis=0,...)を使用する必要があります。私のアプローチは、最初にそれらをリストにロードし、それらを連結することでした。

PyTablesh5Pyがインストールされており、Daskバージョンが0.14.3+2です。パンダ0.20.1

、私はこの作業を取得するように見える:

for i in range(1,10): 
    hdf = pd.HDFStore(os.path.join(d,'Cleaned.h5'),mode='r') 
    df = hdf.get('/DF{}' .format(i)) 
    print df.shape 
    hdf.close() 

私はDASKのデータフレームのリストにこのHDF5ファイルを読み込むことができます方法はありますか?または、それらを上下に連結する別のアプローチがありますか?

答えて

3

Dask.dataframeはすでにレイジーなので、dask.delayedを使用してレイジーにする必要はありません。 を繰り返し呼び出すことができます:

ddfs = [dd.read_hdf(os.path.join(d,'Cleaned.h5'), key=k) 
     for k in keys] 

ddf = dd.concat(ddfs) 
+0

私はそれを逃していました。ありがとう! –

+0

同じパイプラインでmixed delayedおよびnon-delayed関数を使用することはできますか? –

+1

遅延値とdask.dataframesの間の変換方法については、[これらのドキュメント](http://dask.pydata.org/en/latest/delayed-collections.html)を参照してください。遅延関数内に遅延関数をネストする理由はありません。 – MRocklin

関連する問題