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
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:]
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')
où ds.name
devrait vous renvoyer une chaîne (nom de clé):
In [26]: ds.name
Out[26]: '/A1'