-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
284 lines (209 loc) · 9.26 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
0
import pandas as pd
from numpy import random
## --- Classes & fonction --- ##
class Ingredient:
def __init__(self, nom, section, quantite):
self.nom = nom
self.section = section
self.quantite = quantite
class Recette:
def __init__(self, nom, ingredients, preference, categorie):
self.nom = nom
self.ingredients = ingredients
self.preference = preference
self.categorie = categorie
class Inventaire:
def __init__(self):
pass
recettes = []
dernieres_recettes = []
avant_dernieres_recettes = []
def add_recette(self, recette):
self.recettes.append(recette)
def add_dernieres_recettes(self, dernieres, avant_dernieres):
self.dernieres_recettes = dernieres
self.avant_dernieres_recettes = avant_dernieres
def sort_recette_preference(self):
recettes_preferences = [[], [], []]
for recette in self.recettes:
if recette.preference == 0:
recettes_preferences[0].append(recette)
elif recette.preference == 1:
recettes_preferences[1].append(recette)
elif recette.preference == 2:
recettes_preferences[2].append(recette)
return recettes_preferences
def process_ingredients(ingredient_quantite, dictionnaire_ingredients):
processed_ingredient = []
for i in range(2, ingredient_quantite.shape[0], 2):
ingredient = ingredient_quantite[i]
section = dictionnaire_ingredients[ingredient_quantite[i]]
quantite = ingredient_quantite[i + 1]
processed_ingredient.append(Ingredient(ingredient, section, quantite))
return processed_ingredient
def get_recette_aleatoire(n_recettes, pref, recettes_preference):
n = random.randint(0, n_recettes)
recette_candidate = recettes_preference[pref][n]
return recette_candidate
## --- Crée un dictionnaire pour associer les ingrédients aux sections d'épicerie --- ##
liste_ingredients = pd.read_csv("ingredients.csv", sep=";")
dictionnaire_ingredients = dict()
for ingredient, section in zip(liste_ingredients["Ingrédients"], liste_ingredients["Sections"]):
dictionnaire_ingredients[ingredient] = section
## --- Déclare & remplis l'inventaire --- ##
inventaire = Inventaire()
# Ajoute les recettes dans l'inventaire
recettes = pd.read_csv("recettes.csv", sep=";")
for recette_info in recettes:
ingredients = process_ingredients(recettes[recette_info].dropna(), dictionnaire_ingredients)
recette = Recette(recette_info, ingredients, int(recettes[recette_info][1]), recettes[recette_info][0])
inventaire.add_recette(recette)
## --- Génération du menu de la semaine --- ##
menu = []
noms_recettes = []
# Tri les recettes selon les préférences
recettes_preference = inventaire.sort_recette_preference()
# Permet de choisir des recettes dans le génétateur automatique ou un liste personnalisée
def choisir_recette(recettes):
tag_recette = {}
i = 0
print('\n-- Inventaire des recettes --')
for preference in recettes:
for recette in preference:
print(i, recette.nom)
tag_recette[str(i)] = recette
i += 1
continu = True
liste_recette = []
while continu == True:
j = input("\nChoisir une recette (numéro) : ")
liste_recette.append(tag_recette[j])
k = input("Choisir d'autres recette ? (oui/non) : ")
if k == "non":
continu = False
return liste_recette
def check(recette, menu):
reponse = "non"
while reponse == "non":
reponse = input(f"Est-ce que la recette ({recette.nom}) convient? (oui/non) : ")
if reponse == "oui":
menu.append(recette)
elif reponse == "non":
pref_aleatoire = random.randint(0, 3)
recette = get_recette_aleatoire(len(recettes_preference[pref_aleatoire]),
pref_aleatoire, recettes_preference)
# Ajoute l'historique des 2 dernières semaines (si semaine 1, crée des semaines temporaires)
historique = pd.DataFrame()
try:
historique = pd.read_csv("historique_recettes.csv", sep=";")
if historique.shape[1] == 1:
historique["Semaine -1"] = [0, 0, 0, 0, 0, 0, 0]
except:
historique["Semaine -2"] = [0, 0, 0, 0, 0, 0, 0]
historique["Semaine -1"] = [0, 0, 0, 0, 0, 0, 0]
def generateur_auto(nb):
dernieres = list(historique[historique.columns[-1]].dropna())
avant_dernieres = list(historique[historique.columns[-2]].dropna())
inventaire.add_dernieres_recettes(dernieres, avant_dernieres)
# Catégories et préférences (WIP)
#preferences = [0, 1, 2] # 0 : Souvent | 1 : Normal | 2 : Rarement
#categories = ["tofu", "lentilles", "viande", "pates", "poissons"]
## --- Nombre de recette selon la préférence et selon le nombre de recette à générer --- ##
# [nb préférence 0, nb préférence 1, nb préférence 2]
liste = []
if nb == 1:
liste = [1, 0, 0]
elif nb == 2:
liste = [1, 1, 0]
elif nb == 3:
liste = [1, 1, 1]
elif nb == 4:
liste = [1, 2, 1]
elif nb == 5:
liste = [2, 2, 1]
elif nb == 6:
liste = [2, 2, 2]
elif nb == 7:
liste = [2, 3, 2]
# Loop sur le nombre de recette par préférence
for pref, n_preference in enumerate(liste):
if n_preference > 0:
n_recettes = len(recettes_preference[pref])
while len(menu) < nb:
recette_candidate = get_recette_aleatoire(n_recettes, pref, recettes_preference)
while recette_candidate in menu: # Cherche une recette qui n'est pas déjà dans le menu de la semaine
recette_candidate = get_recette_aleatoire(n_recettes, pref, recettes_preference)
# Recherche si la recette a été fait dans la/les semaines précédantes selon la préférence
if pref == 0: # Si pref = 0, peut être choisie chaque semaine
check(recette_candidate, menu)
elif pref == 1: # Si pas dans la dernière semaine
while (recette_candidate.nom in inventaire.dernieres_recettes or
recette_candidate in menu):
recette_candidate = get_recette_aleatoire(n_recettes, pref, recettes_preference)
check(recette_candidate, menu)
elif pref == 2: # Si pas dans les deux dernières semaines
while (recette_candidate.nom in inventaire.dernieres_recettes or
recette_candidate.nom in inventaire.avant_dernieres_recettes or
recette_candidate in menu):
recette_candidate = get_recette_aleatoire(n_recettes, pref, recettes_preference)
check(recette_candidate, menu)
## --- Nombre de recette à générer --- ##
choix = input("Génétateur automatique (0) ou choisir des recettes (1) : ")
if choix == "0":
nb = input("Nombre de recettes à générer (1 à 7) : ")
nb = int(nb)
generateur_auto(nb)
else:
recettes = choisir_recette(recettes_preference)
for recette in recettes:
menu.append(recette)
## --- Exporte le menu & enregiste l'historique --- ##
liste_semaine = []
print("\n -- Menu de la semaine --")
for recette in menu:
liste_semaine.append(recette.nom)
print(recette.nom)
fichier = open("menu_semaine.txt", "w+")
fichier.write(" -- Menu de la semaine --\n")
for recette in liste_semaine:
fichier.write(recette + "\n")
# Efface des semaines provisoires
if "Semaine -2" in historique:
historique.drop(['Semaine -2'], axis=1, inplace=True)
if "Semaine -1" in historique:
historique.drop(["Semaine -1"], axis=1, inplace=True)
historique["Semaine " + str(historique.shape[1] + 1)] = pd.Series(liste_semaine)
historique.to_csv("historique_recettes.csv", index=False, sep=";", encoding='utf-8-sig')
## --- Crée la liste d'épicerie --- ##
liste_epicerie = {"Fruits & Légumes": [], "Boulangerie": [], "Rangées": [], "Réfrigéré": [], "Congelé": [],
"Autre": []}
for recette in menu:
for ingredient in recette.ingredients:
section = ingredient.section
# Verifie que l'ingrédient n'est pas déjà dans la liste
if len(liste_epicerie[section]) > 0:
qte = ingredient.quantite
nom = ingredient.nom
for val in liste_epicerie[section]:
if val[1] == ingredient.nom:
try:
int(ingredient.quantite)
qte = int(val[0]) + int(ingredient.quantite)
qte = str(qte)
except ValueError:
qte += " + " + ingredient.quantite
liste_epicerie[section].remove(val)
nom = ingredient.nom
break
liste_epicerie[section].append((qte, nom))
else:
liste_epicerie[section].append((ingredient.quantite, ingredient.nom))
## --- Export la liste d'épicerie --- ##
fichier.write("\n\n -- Liste d'épicerie --\n")
for section in liste_epicerie:
fichier.write(" - " + section + " - \n")
for qte_ingredient in liste_epicerie[section]:
fichier.write(qte_ingredient[0] + " " + qte_ingredient[1] + "\n")
fichier.write("\n")
fichier.close()