Coverage for src/ensae_teaching_cs/td_2a/serialization.py: 97%
30 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
1# -*- coding: utf-8 -*-
2"""
3@file
4@brief Sérialization
6"""
8import pickle
9import pandas
12def df2list(df):
13 """
14 Converts a dataframe into a list of lists.
16 @param df DataFrame
17 @return list of lists
19 .. faqref::
20 :tag: pandas
21 :title: Convertir un DataFrame en une liste de listes ?
23 ::
25 df = DataFrame( ... )
26 l = df.values.tolist()
28 .. faqref::
29 :tag: pandas
30 :title: Comment vérifier que deux DataFrame sont égaux (2) ?
32 Comparer deux `DataFrame <http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html>`_
33 avec l'opérateur ``==`` ne fonctionne pas.
34 On obtient un message d'erreur ::
36 ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
38 Il faut au préalable convertir le Dataframe en le convertissant en liste ::
40 df.values.tolist() == df2.values.tolist()
41 """
42 return df.vales.tolist()
45def dump_object(obj, filename_or_stream):
46 """
47 Sérialize un objet dans un stream ou un fichier.
49 @param obj objet à sérialiser
50 @param filename_or_stream nom de fichier ou stream
52 .. faqref::
53 :tag: python
54 :title: Comment gagner du temps lors de la lecture de données ?
56 .. index:: sérialisation, pickle, dill
58 Les languages informatiques définissent des structures de données
59 qui permettent une utilisation rapide et cela n'a souvent rien
60 à voir avec la façon dont on lit ces données.
61 La plupart des données apparaissent dans des fichiers
62 texte ou fichiers plat. Pour les utiliser, le programme les
63 charges en mémoires ce qui peut prendre du temps.
64 La première fois qu'on s'en sert, c'st inévitable.
65 La seconde fois, on peut stocker les données
66 telles qu'elles sont en mémoire.
67 Le second chargement est plus rapide.
69 ::
71 obj = ... # n'importe quoi de sérialisable
72 dump_object(obj, "object_sur_disque.bin")
74 Pour recharger les données, on écrit :
76 ::
78 obj = load_object("object_sur_disque.bin")
80 Le code de ces deux fonctions fait intervenir
81 le module `pickle <https://docs.python.org/3/library/pickle.html>`_.
82 Il suffit pour la plupart des usages.
83 Pour un usage plus exotique, il faut voir le module
84 `dill <https://pypi.python.org/pypi/dill>`_.
85 """
86 if isinstance(filename_or_stream, str):
87 stream = open(filename_or_stream, "wb")
88 close = True
89 else:
90 stream = filename_or_stream
91 close = False
93 pickle.dump(obj, stream)
95 if close:
96 stream.close()
99def load_object(filename_or_stream):
100 """
101 Charge un objet en mémoire après qu'il a été sérialisé.
103 @param filename_or_stream nom de fichier ou stream
104 @return objet
105 """
106 if isinstance(filename_or_stream, str):
107 stream = open(filename_or_stream, "rb")
108 close = True
109 else:
110 stream = filename_or_stream
111 close = False
113 obj = pickle.load(stream)
115 if close:
116 stream.close()
118 return obj
121def dfs2excel(dfs: dict, excel_file: str):
122 """
123 Aggrège plusieurs DataFrame dans un seul fichiers excel
125 @param dfs dictionnaire ``{ feuille: dataframe }``
126 @param excel_file nom du fichier Excel
127 @return ExcelWriter
129 .. exref::
130 :title: Enregistrer plusieurs DataFrame dans un seul fichier Excel ?
131 :tag: Dataframe
133 Le code suivant enregistre deux DataFrame dans un seul fichier Excel.
135 ::
137 import pandas
138 writer = pandas.ExcelWriter('example.xlsx')
139 df1.to_excel(writer, 'Data 0')
140 df2.to_excel(writer, 'Data 1')
141 write.save()
143 Ou en utilisant cette fonction :
145 ::
147 dfs2excel( { 'Data 0':df1, 'Data 1':df2 }, "example.xlsx" )
149 .. faqref::
150 :tag: pandas
151 :title: Enregistrer plusieurs DataFrame dans un seul fichier Excel ?
153 Le code suivant enregistre deux DataFrame dans un seul fichier Excel.
155 ::
157 import pandas
158 writer = pandas.ExcelWriter('example.xlsx')
159 df1.to_excel(writer, 'Data 0')
160 df2.to_excel(writer, 'Data 1')
161 write.save()
163 Ou en utilisant cette fonction :
165 ::
167 dfs2excel( { 'Data 0':df1, 'Data 1':df2 }, "example.xlsx" )
168 """
169 writer = pandas.ExcelWriter(excel_file) # pylint: disable=E0110
170 for k, df in dfs.items():
171 df.to_excel(writer, k)
172 writer.save()
173 return writer