Coverage for src/ensae_teaching_cs/td_2a/serialization.py: 97%

30 statements  

« prev     ^ index     » next       coverage.py v7.1.0, created at 2023-01-27 05:44 +0100

1# -*- coding: utf-8 -*- 

2""" 

3@file 

4@brief Sérialization 

5 

6""" 

7 

8import pickle 

9import pandas 

10 

11 

12def df2list(df): 

13 """ 

14 Converts a dataframe into a list of lists. 

15 

16 @param df DataFrame 

17 @return list of lists 

18 

19 .. faqref:: 

20 :tag: pandas 

21 :title: Convertir un DataFrame en une liste de listes ? 

22 

23 :: 

24 

25 df = DataFrame( ... ) 

26 l = df.values.tolist() 

27 

28 .. faqref:: 

29 :tag: pandas 

30 :title: Comment vérifier que deux DataFrame sont égaux (2) ? 

31 

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 :: 

35 

36 ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

37 

38 Il faut au préalable convertir le Dataframe en le convertissant en liste :: 

39 

40 df.values.tolist() == df2.values.tolist() 

41 """ 

42 return df.vales.tolist() 

43 

44 

45def dump_object(obj, filename_or_stream): 

46 """ 

47 Sérialize un objet dans un stream ou un fichier. 

48 

49 @param obj objet à sérialiser 

50 @param filename_or_stream nom de fichier ou stream 

51 

52 .. faqref:: 

53 :tag: python 

54 :title: Comment gagner du temps lors de la lecture de données ? 

55 

56 .. index:: sérialisation, pickle, dill 

57 

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. 

68 

69 :: 

70 

71 obj = ... # n'importe quoi de sérialisable 

72 dump_object(obj, "object_sur_disque.bin") 

73 

74 Pour recharger les données, on écrit : 

75 

76 :: 

77 

78 obj = load_object("object_sur_disque.bin") 

79 

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 

92 

93 pickle.dump(obj, stream) 

94 

95 if close: 

96 stream.close() 

97 

98 

99def load_object(filename_or_stream): 

100 """ 

101 Charge un objet en mémoire après qu'il a été sérialisé. 

102 

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 

112 

113 obj = pickle.load(stream) 

114 

115 if close: 

116 stream.close() 

117 

118 return obj 

119 

120 

121def dfs2excel(dfs: dict, excel_file: str): 

122 """ 

123 Aggrège plusieurs DataFrame dans un seul fichiers excel 

124 

125 @param dfs dictionnaire ``{ feuille: dataframe }`` 

126 @param excel_file nom du fichier Excel 

127 @return ExcelWriter 

128 

129 .. exref:: 

130 :title: Enregistrer plusieurs DataFrame dans un seul fichier Excel ? 

131 :tag: Dataframe 

132 

133 Le code suivant enregistre deux DataFrame dans un seul fichier Excel. 

134 

135 :: 

136 

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() 

142 

143 Ou en utilisant cette fonction : 

144 

145 :: 

146 

147 dfs2excel( { 'Data 0':df1, 'Data 1':df2 }, "example.xlsx" ) 

148 

149 .. faqref:: 

150 :tag: pandas 

151 :title: Enregistrer plusieurs DataFrame dans un seul fichier Excel ? 

152 

153 Le code suivant enregistre deux DataFrame dans un seul fichier Excel. 

154 

155 :: 

156 

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() 

162 

163 Ou en utilisant cette fonction : 

164 

165 :: 

166 

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