-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodel.py
251 lines (204 loc) · 8.61 KB
/
model.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
from typing import List, Tuple
import pandas as pd
class Produto:
"""Uma classe que representa cada objeto"""
def __init__(self, descricao, mercado, unit_value, index=None) -> None:
"""Objeto que representa um produto"""
self.descricao = descricao # Descrição do produto
self.mercado = mercado # Nome do mercado onde
self.unit_value = unit_value# Valor unitário
self.index = index
def __repr__(self) -> str:
"""Método que retorna uma string do que é o objeto"""
return f"descrição: {self.descricao}, mercado: {self.mercado}, preço: {self.unit_value}"
class Mercado:
"""Uma classe que representa cada objeto"""
def __init__(self, nome, local) -> None:
"""Objeto que representa um Supermercado"""
self.local = local
self.nome = nome
def localizacao(self) -> Tuple[float, float]:
"""Método que pega as coordenadas"""
if not self.local.empty:
return self.local['x'].values[0], self.local['y'].values[0]
else:
raise ValueError("O DataFrame self.local está vazio, não é possível obter a localização.")
def __repr__(self) -> str:
"""Método que retorna uma string do que é o objeto"""
return f'Mercado: {self.nome}, Localização: {(self.localizacao())}'
class BD(Exception):
"""Erro personalizado"""
class Database:
"""Classe responsável por abrir os DB's"""
def __init__(self, database) -> None:
"""Objeto que representa um Database"""
self.database = database
try:
self.__data = pd.read_csv(self.database)
print(f"Lendo o banco de dados: {self.database}")
except BD as erro:
print(f"Foi encontrado uma exceção: {erro}")
@property
def data(self) -> pd:
"""Retorna o banco de dados"""
return self.__data
def __repr__(self) -> str:
"""Método que retorna uma string do que é o objeto"""
return f'Banco de Dados, no caminho {self.database}'
class Model:
"""
@brief
Classe responsável por gerenciar os acessos aos itens no DataBase (DB).
"""
database = './DataBase/data.csv'
location='./Database/location.csv'
def __init__(self) -> None:
"""
Construtor da classe Model.
"""
print("\n")
self.db = Database(Model.database).data
self.lc = Database(Model.location).data
print("\nIniciando o módulo Model")
def encontra_produto(self, produto: str) -> List[Produto]:
"""
Método abstrato responsável por procurar os produtos no DB.
@brief:
Recebe um produto como entrada e retorna um dicionário contendo as informações dos produtos encontrados.
@param produto:
Uma string contendo o nome do produto a ser procurado no banco de dados.
@return:
Uma lista de objetos
"""
try:
resultado = self.db[self.db['description'].str.contains(produto)]
produtos_encontrados = []
mercados_exibidos = set()
for index, row in resultado.iterrows():
produto = Produto(row["description"], row["razao"], row["unit_value"], index=index)
if produto.mercado not in mercados_exibidos:
mercados_exibidos.add(produto.mercado)
produtos_encontrados.append(produto)
return produtos_encontrados
except Exception as err:
raise f"Erro ao encontrar o item: {str(err)}"
def encontra_marca(self, marca: str) -> List[Produto]:
"""
Implementação do método encontra_marca da classe Model.
Realiza a busca por marcas no banco de dados específico da Model.
@brief:
Realiza a busca por marcas no banco de dados da Model.
@param marca:
Uma string contendo o nome da marca a ser procurada no banco de dados da Model.
@return:
Uma lista de objetos
"""
try:
produtos_encontrados = []
mercados_exibidos = set()
for index, row in self.db.iterrows():
if marca in row['description']:
produto = Produto(row["description"], row["razao"], row["unit_value"], index)
if produto.mercado not in mercados_exibidos:
mercados_exibidos.add(produto.mercado)
produtos_encontrados.append(produto)
return produtos_encontrados
except Exception as err:
raise f"Erro ao encontrar o item: {str(err)}"
def encontra_mercado(self, mercado: str) -> Mercado:
"""
Método responsável por pesquisar o mercado no db.
@param mercado:
Uma string contendo o nome do mercado a ser pesquisado no banco de dados.
@return:
Um objeto que representa um mercado
"""
try:
return Mercado(mercado, self.lc[self.lc['name'] == mercado])
except Exception as err:
raise f"Erro ao encontrar o item: {str(err)}"
def adiciona_item_db(self, item: List[str]) -> None:
"""
Método responsável por adicionar um item ao DataFrame.
@param item:
Uma lista contendo os valores do item a ser adicionado.
Exemplo:
item -> ['valor1', 'valor2', 'valor3', 'valor4', 'valor5', 'valor6']
"""
try:
self.db.loc[len(self.db)] = item
self.db.to_csv(Model.database, index=False)
except Exception as err:
raise f"Erro ao adicionar o item: {str(err)}"
def remove_item_db(self, item: List[str]) -> None:
"""
Método responsável por remover um item do DataFrame.
@param item:
Uma lista contendo os valores do item a ser removido.
Exemplo:
item -> ['valor1', 'valor2', 'valor3', 'valor4', 'valor5', 'valor6']
"""
try:
linhas_remover = self.db[self.db.apply(lambda row: row.tolist() == item, axis=1)]
self.db.drop(linhas_remover.index, inplace=True)
self.db.to_csv(Model.database, index=False)
except Exception as err:
raise f"Erro ao remover o item: {str(err)}"
def adiciona_item_lc(self, item: List[str]) -> None:
"""
Método responsável por adicionar um item ao DataFrame.
@param item:
Uma lista contendo os valores do item a ser adicionado.
Exemplo:
item -> ['valor1', 'valor2', 'valor3', 'valor4']
"""
try:
self.lc.loc[len(self.lc)] = item
self.lc.to_csv(Model.location, index=False)
except Exception as err:
raise f"Erro ao adicionar o item: {str(err)}"
def remove_item_lc(self, item: List[str]) -> None:
"""
Método responsável por remover um item do DataFrame.
@param item:
Uma lista contendo os valores do item a ser removido.
Exemplo:
item -> ['valor1', 'valor2', 'valor3', 'valor4']
"""
try:
linhas_remover = self.lc[self.lc.apply(lambda row: row.tolist() == item, axis=1)]
self.lc.drop(linhas_remover.index, inplace=True)
self.lc.to_csv(Model.location, index=False)
except Exception as err:
raise f"Erro ao remover o item: {str(err)}"
def lista_mercados(self) -> List[Mercado]:
"""
Método abstrato responsável por listar os mercados no DB.
@brief:
Lista os mercados no banco de dados.
@return:
Retorna uma lista de mercardos
"""
mercados = []
try:
for mercado in self.lc['name'].unique().tolist():
mercados.append(self.encontra_mercado(mercado))
return mercados
except Exception as err:
raise f"Erro ao listar os items: {str(err)}"
def lista_produtos(self) -> List[Produto]:
"""
Método abstrato responsável por listar os Produtos no DB.
@brief:
Lista os Produtos no banco de dados.
@return:
Lista de objetos Produto.
"""
produtos = []
try:
for index, row in self.db.iterrows():
produto = Produto(row["description"], row["razao"], row["unit_value"], index=index)
produtos.append(produto)
return produtos
except Exception as err:
raise f"Erro ao listar os items: {str(err)}"