2017-05-07 4 views
2

Ich habe eine HDF5-Datei, die ich in eine Liste von Dask DataFrames laden möchte. Ich habe dies eingerichtet mit einer Schleife nach einer abgekürzten Version des Dask pipeline approach. Hier ist der Code:HDF-Datei in Liste von Python Dask DataFrames laden

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) 

ich diese Fehlermeldung:

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)) 

Die Meldung erwähnt einen doppelten Schlüssel. Ich habe über die ersten 9 Dateien iteriert, um den Code zu testen, und in der Schleife verwende ich jede Iteration, um einen anderen Schlüssel zusammenzustellen, den ich mit dd.read_hdf verwende. Bei allen Iterationen behalte ich den Dateinamen gleich - nur der Schlüssel wird geändert.

Ich muss dd.concat(list,axis=0,...) verwenden, um den Inhalt der Datei vertikal zu verketten. Mein Ansatz war, sie zuerst in eine Liste zu laden und dann zu verketten.

Ich habe PyTables und h5Py installiert und habe die Dies-Version 0.14.3+2.

Mit Pandas 0.20.1, scheine ich diese Arbeit zu bekommen:

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() 

Gibt es eine Weise, die ich diese HDF5 Datei in eine Liste von Dask Datenrahmen laden? Oder gibt es einen anderen Ansatz, sie vertikal zu verketten?

Antwort

3

Dask.dataframe ist bereits faul, es ist also nicht nötig, dask.delayed zu verwenden, um es fauler zu machen. Sie können einfach dd.read_hdf immer wieder anrufen:

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

ddf = dd.concat(ddfs) 
+0

Ich hatte das verpasst. Vielen Dank! –

+0

Ist es möglich, gemischte "verzögerte" und "nicht verzögerte" Funktionen in derselben Pipeline zu verwenden? –

+1

Siehe [diese Dokumente] (http://dask.pydata.org/en/latest/delayed-collections.html) für die Konvertierung zwischen verzögerten Werten und dask.dataframes. Es gibt keinen Grund, Lazy-Funktionen in Lazy-Funktionen zu verschachteln. – MRocklin

Verwandte Themen