# -*- coding: utf-8 -*-
"""
Sérialization
:githublink:`%|py|7`
"""
import pickle
import pandas
[docs]def df2list(df):
"""
Converts a dataframe into a list of lists.
:param df: DataFrame
:return: list of lists
.. faqref::
:tag: pandas
:title: Convertir un DataFrame en une liste de listes ?
::
df = DataFrame( ... )
l = df.values.tolist()
.. faqref::
:tag: pandas
:title: Comment vérifier que deux DataFrame sont égaux (2) ?
Comparer deux `DataFrame <http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html>`_
avec l'opérateur ``==`` ne fonctionne pas.
On obtient un message d'erreur ::
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Il faut au préalable convertir le Dataframe en le convertissant en liste ::
df.values.tolist() == df2.values.tolist()
:githublink:`%|py|41`
"""
return df.vales.tolist()
[docs]def dump_object(obj, filename_or_stream):
"""
Sérialize un objet dans un stream ou un fichier.
:param obj: objet à sérialiser
:param filename_or_stream: nom de fichier ou stream
.. faqref::
:tag: python
:title: Comment gagner du temps lors de la lecture de données ?
.. index:: sérialisation, pickle, dill
Les languages informatiques définissent des structures de données
qui permettent une utilisation rapide et cela n'a souvent rien
à voir avec la façon dont on lit ces données.
La plupart des données apparaissent dans des fichiers
texte ou fichiers plat. Pour les utiliser, le programme les
charges en mémoires ce qui peut prendre du temps.
La première fois qu'on s'en sert, c'st inévitable.
La seconde fois, on peut stocker les données
telles qu'elles sont en mémoire.
Le second chargement est plus rapide.
::
obj = ... # n'importe quoi de sérialisable
dump_object(obj, "object_sur_disque.bin")
Pour recharger les données, on écrit :
::
obj = load_object("object_sur_disque.bin")
Le code de ces deux fonctions fait intervenir
le module `pickle <https://docs.python.org/3/library/pickle.html>`_.
Il suffit pour la plupart des usages.
Pour un usage plus exotique, il faut voir le module
`dill <https://pypi.python.org/pypi/dill>`_.
:githublink:`%|py|85`
"""
if isinstance(filename_or_stream, str):
stream = open(filename_or_stream, "wb")
close = True
else:
stream = filename_or_stream
close = False
pickle.dump(obj, stream)
if close:
stream.close()
[docs]def load_object(filename_or_stream):
"""
Charge un objet en mémoire après qu'il a été sérialisé.
:param filename_or_stream: nom de fichier ou stream
:return: objet
:githublink:`%|py|105`
"""
if isinstance(filename_or_stream, str):
stream = open(filename_or_stream, "rb")
close = True
else:
stream = filename_or_stream
close = False
obj = pickle.load(stream)
if close:
stream.close()
return obj
[docs]def dfs2excel(dfs: dict, excel_file: str):
"""
Aggrège plusieurs DataFrame dans un seul fichiers excel
:param dfs: dictionnaire ``{ feuille: dataframe }``
:param excel_file: nom du fichier Excel
:return: ExcelWriter
.. exref::
:title: Enregistrer plusieurs DataFrame dans un seul fichier Excel ?
:tag: Dataframe
Le code suivant enregistre deux DataFrame dans un seul fichier Excel.
::
import pandas
writer = pandas.ExcelWriter('example.xlsx')
df1.to_excel(writer, 'Data 0')
df2.to_excel(writer, 'Data 1')
write.save()
Ou en utilisant cette fonction :
::
dfs2excel( { 'Data 0':df1, 'Data 1':df2 }, "example.xlsx" )
.. faqref::
:tag: pandas
:title: Enregistrer plusieurs DataFrame dans un seul fichier Excel ?
Le code suivant enregistre deux DataFrame dans un seul fichier Excel.
::
import pandas
writer = pandas.ExcelWriter('example.xlsx')
df1.to_excel(writer, 'Data 0')
df2.to_excel(writer, 'Data 1')
write.save()
Ou en utilisant cette fonction :
::
dfs2excel( { 'Data 0':df1, 'Data 1':df2 }, "example.xlsx" )
:githublink:`%|py|168`
"""
writer = pandas.ExcelWriter(excel_file) # pylint: disable=E0110
for k, df in dfs.items():
df.to_excel(writer, k)
writer.save()
return writer