web-dev-qa-db-fra.com

Comment écrire un Pandas Dataframe dans un jeu de données HDF5

J'essaie d'écrire des données à partir d'un Pandas dataframe dans un fichier hdf5 imbriqué, avec plusieurs groupes et jeux de données dans chaque groupe. Je voudrais le garder comme un seul fichier qui se développera dans l'avenir sur une base quotidienne. J'ai essayé le code suivant, qui montre la structure de ce que j'aimerais réaliser

import h5py
import numpy as np
import pandas as pd

file = h5py.File('database.h5','w')

d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d) 

groups = ['A','B','C']         

for m in groups:

    group = file.create_group(m)
    dataset = ['1','2','3']

    for n in dataset:

        data = df
        ds = group.create_dataset(m + n, data.shape)
        print ("Dataset dataspace is", ds.shape)
        print ("Dataset Numpy datatype is", ds.dtype)
        print ("Dataset name is", ds.name)
        print ("Dataset is a member of the group", ds.parent)
        print ("Dataset was created in the file", ds.file)

        print ("Writing data...")
        ds[...] = data        

        print ("Reading data back...")
        data_read = ds[...]

        print ("Printing data...")
        print (data_read)

file.close(

)

De cette façon, la structure imbriquée est créée mais elle perd l'index et les colonnes. J'ai essayé le

df.to_hdf('database.h5', ds, table=True, mode='a')

mais n'a pas fonctionné, je reçois cette erreur

AttributeError: l'objet 'Dataset' n'a pas d'attribut 'split'

Quelqu'un peut-il nous éclairer s'il vous plaît? Merci beaucoup

6
AleVis

J'ai pensé essayer les pandas\pytables et la classe HDFStore au lieu de h5py. J'ai donc essayé ce qui suit

import numpy as np
import pandas as pd

db = pd.HDFStore('Database.h5')

index = pd.date_range('1/1/2000', periods=8)

df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=['Col1', 'Col2', 'Col3'])

groups = ['A','B','C']     

i = 1    

for m in groups:

    subgroups = ['d','e','f']

    for n in subgroups:

        db.put(m + '/' + n, df, format = 'table', data_columns = True)

Cela fonctionne, 9 groupes (groupes au lieu de jeux de données dans pyatbles au lieu de h5py?) Créés de A/d à C/f. Colonnes et index préservés et peuvent effectuer les opérations de trame de données dont j'ai besoin. Je me demande toujours si c'est un moyen efficace de récupérer des données d'un groupe spécifique qui deviendra énorme à l'avenir, c'est-à-dire des opérations comme

db['A/d'].Col1[4:]
2
AleVis

df.to_hdf () attend une chaîne en tant que paramètre key (deuxième paramètre):

clé : chaîne

identifiant du groupe dans le magasin

alors essayez ceci:

df.to_hdf('database.h5', ds.name, table=True, mode='a')

ds.name devrait vous renvoyer une chaîne (nom de clé):

In [26]: ds.name
Out[26]: '/A1'
2
MaxU