Pour sauvegarder dans un fichier, des données stockées dans une matrice il existe plusieurs approches. Dans le cas d'un simple tableau de données avec quelques colonnes et/ou lignes on peut utiliser un simple fichier ascii ou un fichier csv. Cependant, si les données sont stockées dans des matrices à plusieurs dimensions ou si le volume de données est important il est préférable par exemple d'utiliser le format de données hdf5. Exemple avec python de comment créer un fichier hdf5, stocker les données et lire un fichier hdf5:
Créer des tableaux de données
Considérons les matrices suivantes avec des nombres entiers (dtype='i'):
>>> import numpy as np
>>> A = np.random.randint(100, size=(4,4))
>>> A
array([[ 1, 99, 79, 46],
[69, 4, 29, 60],
[56, 94, 16, 16],
[52, 13, 37, 86]])
et une matrice B de dimensions (5,3,3)
>>> B = np.random.randint(100, size=(5,3,3))
>>> B
array([[[60, 89, 24],
[ 4, 98, 48],
[19, 39, 69]],
[[72, 8, 80],
[70, 96, 81],
[50, 78, 85]],
[[21, 91, 5],
[43, 18, 58],
[93, 48, 72]],
[[25, 0, 45],
[ 0, 21, 4],
[ 5, 60, 39]],
[[73, 28, 87],
[97, 89, 87],
[ 4, 76, 62]]])
Créer un fichier hdf5
Maintenant on va voir comment sauvegarder ces matrices dans un fichier hdf5. Première étape il faut importer le module h5py (hdf5 est installer par défaut avec anaconda)
>>> import h5py
Note: Si hdf5py n'est pas installer voir Quick Start Guide.
Créer un fichier hdf5 nomme par exemple data.hdf5:
>>> f1 = h5py.File("data.hdf5", "w")
Sauvegarder des données
Sauvegarder la matrice A dans le fichier hdf5:
>>> dset1 = f1.create_dataset("dataset_01", (4,4), dtype='i', data=A)
Sauvegarder la matrice B dans le fichier hdf5:
>>> dset2 = f1.create_dataset("dataset_02", (5,3,3), dtype='i', data=B)
Ajouter des metadata
L'avantage du format hdf est de pouvoir facilement attacher des metadata à une dataset par exemple on peut faire:
>>> dset1.attrs['scale'] = 0.01
>>> dset1.attrs['offset'] = 15
Fermer le fichier:
>>> f1.close()
Lire un fichier hdf5
Maintenant on va voir comment récupérer nos données. Lire le fichier hdf5:
>>> f2 = h5py.File('data.hdf5', 'r')
Afficher les noms des datasets dans le fichier hdf5:
>>> list(f2.keys())
['dataset_01', 'dataset_02']
ici on a bien deux datasets.
Récupérer les données:
>>> dset1 = f2['dataset_01']
>>> data = dset1[:]
>>> data
array([[ 1, 99, 79, 46],
[69, 4, 29, 60],
[56, 94, 16, 16],
[52, 13, 37, 86]], dtype=int32)
>>> list(dset1.attrs.keys())
['scale', 'offset']
>>> dset1.attrs['scale']
0.01
Exemple avec dataset 2 contenant la matrice B:
>>> dset2 = f2['dataset_02']
>>> dset2
<HDF5 dataset "dataset_02": shape (5, 3, 3), type "<i4">
>>> data = dset2[:]
>>> data
array([[[60, 89, 24],
[ 4, 98, 48],
[19, 39, 69]],
[[72, 8, 80],
[70, 96, 81],
[50, 78, 85]],
[[21, 91, 5],
[43, 18, 58],
[93, 48, 72]],
[[25, 0, 45],
[ 0, 21, 4],
[ 5, 60, 39]],
[[73, 28, 87],
[97, 89, 87],
[ 4, 76, 62]]], dtype=int32)
>>> type(data)
<class 'numpy.ndarray'>
Exemple avec une pandas data frame
Creer une data frame
import pandas as pd
import numpy as np
data = np.arange(1,13)
data = data.reshape(3,4)
columns = ['Home','Car','Sport','Food']
index = ['Alice','Bob','Emma']
df = pd.DataFrame(data=data,index=index,columns=columns)
et la sauvegarder dans un fichier hdf5 avec HDFStore
(voir Save additional attributes in Pandas Dataframe)
store = pd.HDFStore('data.hdf5')
store.put('dataset_01', df)
metadata = {'scale':0.1,'offset':15}
store.get_storer('dataset_01').attrs.metadata = metadata
store.close()
Lire le fichier:
import pandas as pd
with pd.HDFStore('data.hdf5') as store:
data = store['dataset_01']
metadata = store.get_storer('dataset_01').attrs.metadata
print(data)
print(metadata)
donne
Home Car Sport Food
Alice 1 2 3 4
Bob 5 6 7 8
Emma 9 10 11 12
{'scale': 0.1, 'offset': 15}
Références
Liens | Site |
---|---|
Quick Start Guide | docs.h5py.org |
How to store a dataframe using Pandas | stackoverflow |
Attributes | docs.h5py |
How to use HDF5 files in Python | pythonforthela |
How to list dataset in h5py file? | stackoverflow |
How to add meta_data to Pandas dataframe? | stackoverflow |
Adding meta-information/metadata to pandas DataFrame | stackoverflow |
Using HDFStore | riptutorial |
Save additional attributes in Pandas Dataframe | stackoverflow |
pandas.read_hdf | pandas.pydata.org |
How to: Get the DataFrame metadata | kite.com |