-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathemack.py
220 lines (175 loc) · 9.61 KB
/
emack.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
import operator
def carregarDados():
dados = []
with open('emack.csv', 'r', encoding='utf-8') as file:
linhas = file.readlines()
#Remover da lista de dados a primeira linha que contém o nome das colunas
linhas.pop(0)
for linha in linhas:
valores = linha.strip().split(',')
#Adicionar os valores a um dicionário com chaves correspondentes às categorias apresentadas na primeira linha do CSV
valores = {'id':valores[0],
'title':valores[1],
'price':float(valores[2]),
'listPrice':valores[3],
'categoryName':valores[4],
'isBestSeller':valores[5],
'boughtInLastMonth':int(valores[6])
}
dados.append(valores)
return dados
def qtdPorCategoria(dados):
#Dicionário de contadores para cada categoria
quantidades = {'Livros' : 0, 'Esportes' : 0, 'Moda' : 0, 'Casa' : 0, 'Eletrônicos' : 0}
for produto in dados:
quantidades[produto['categoryName']] += 1
return quantidades
def percentualPorCategoria(dados):
#Executa a função que retorna dicionário contendo o número de itens em cada quantidade
qtdCategoria = qtdPorCategoria(dados)
qtdTotal = len(dados)
percentuais = {}
#Loop que preenche o dicionário "percentuais" com as chaves representando as categorias
#Os valores recebem a porcentagem que cada categoria representa dentro do número total (1000) de produtos
for categoria in qtdCategoria.keys():
percentuais.update({categoria: 100 * qtdCategoria[categoria] / qtdTotal})
return percentuais
def proporcaoBestSellers(dados):
bestSellersPorCategoria = {'Livros':0, 'Esportes':0, 'Moda':0, 'Eletrônicos':0, 'Casa':0}
for produto in dados:
categoria = produto['categoryName']
if produto['isBestSeller'] == 'true':
#Passa produto por produto, caso seja um Best-Seller o respectivo valor da categoria no dicionário "BestSellersPorCategoria" é adicionado em 1
bestSellersPorCategoria[categoria] += 1
#Executa a função que retorna dicionário contendo o número de itens em cada quantidade
qtdCategoria = qtdPorCategoria(dados)
proporcoes = {}
#Loop que preenche o dicionário "proporcoes" com as chaves representando as categorias
#Cada valor representa a porcentagem referente ao número de Best-Sellers em comparação com o número de itens da categoria em questão
for categoria in bestSellersPorCategoria.keys():
proporcaoBestSeller = 100 * bestSellersPorCategoria[categoria] / qtdCategoria[categoria]
proporcoes.update({categoria: proporcaoBestSeller })
return proporcoes
def dezMaisCarosEMaisBaratos(dados):
#A variável produtosOrdenadosPorPreco recebe o retorno da função sorted(), que ordena valores
#O primeiro parâmetro recebe o conjunto de valores que será iterado para a ordenação
#O parâmetro "key" recebe uma função, onde o valor de seu retorno será utilizado como valor para ordenação
#Nesse caso, o "key" recebe a função itemgetter() da biblioteca padrão "operator"
#Recebendo o parâmetro "price",a cada iteração de sorted() a função retornará o valor relativo à chave "price" no dicionário "dados"
#Dessa forma, os produtos serão ordenados pelo preço de forma crescente
produtosOrdenadosPorPreco = sorted(dados, key=operator.itemgetter('price') )
#maisBaratos recebe os 10 primeiros itens de produtosOrdenadosPorPreco, que são os 10 produtos mais baratos
maisBaratos= produtosOrdenadosPorPreco[:10]
#maisCaros recebe os 10 últimos itens de produtosOrdenadosPorPreco, que são os 10 produtos mais caros
maisCaros = produtosOrdenadosPorPreco[-10:]
return maisBaratos, maisCaros
def relatorioPorCategoria(dados, opcao):
listaOpcoes = ['Livros', 'Esportes', 'Moda', 'Casa', 'Eletrônicos']
arquivoSaida = f'relatorio_{listaOpcoes[opcao-1]}.html'
relatorio = f'<html><head><meta charset = "UTF-8"><title>Relatório - {listaOpcoes[opcao-1]} </title></head><body>'
relatorio += f'<h2>Produtos da categoria {listaOpcoes[opcao-1]}</h2><ul>'
#Loop que registra no texto HTML os produtos que tenham a mesma categoria escolhida pela entrada do usuário
for produto in dados:
if produto['categoryName'] == listaOpcoes[opcao-1]:
relatorio += f'<li>Nome: {produto['title']}, ID: {produto['id']}</li>'
relatorio += '</ul></body></html>'
with open(arquivoSaida, 'w', encoding='utf-8') as arquivo:
arquivo.write(relatorio)
def relatorioTopDezBestSellers(dados):
bestSellersPorCategoria = {'Livros':[], 'Esportes':[], 'Moda':[], 'Eletrônicos':[], 'Casa':[]}
topDezBestSellersPorCategoria = {'Livros':[], 'Esportes':[], 'Moda':[], 'Eletrônicos':[], 'Casa':[]}
#Loop que insere todos os produtos classificados como best-seller em uma dicionário que os separa por categoria
for produto in dados:
if produto['isBestSeller'] == 'true':
bestSellersPorCategoria[produto['categoryName']].append(produto)
#Loop que ordena cada lista de produtos por categoria com base nas vendas do último mês e salva os 10 primeiros valores em uma chave
#de mesmo nome no dicionário "topDezBestSellersPorCategoria";
for categoria, produtos in bestSellersPorCategoria.items():
#Função de ordenação "sorted()"" com parâmetro "operator.itemgetter()" utilizada da mesma forma como na função dezMaisCarosEMaisBaratos
#Agora, utilizando os valores da chave "boughtInLastMonth" como referências para a ordenação
ordenados = sorted(produtos, key=operator.itemgetter('boughtInLastMonth'), reverse=True)
topDezBestSellersPorCategoria[categoria] = ordenados[:10]
arquivoSaida = 'bestsellers.html'
relatorio = '<html><head><meta charset = "UTF-8"><title>Best-Sellers</title></head><body>'
#Loop que acessa cada categoria e registra todos os seus produtos em listas não ordenadas HTML
for categoria, produtos in topDezBestSellersPorCategoria.items():
relatorio += f'<h2>Top 10 Best-Sellers em {categoria}</h2><ul>'
for i in range(len(produtos)):
relatorio += f'<li>Nome: {produtos[i]['title']}, ID: {produtos[i]['id']}, Vendas no último mês: {produtos[i]['boughtInLastMonth']}</li>'
relatorio += '</ul>'
relatorio += '</body></html>'
with open(arquivoSaida, 'w', encoding='utf-8') as arquivo:
arquivo.write(relatorio)
#Principal
#Guarda os dados obtidos do arquivo CSV na variável dadosProdutos
dadosProdutos = carregarDados()
end = False
while not end:
print("""
------------------------------------------------------------------
[1] - Quantidade de Produtos por Categoria
[2] - Percentual de Produtos por Categoria
[3] - Proporção de Best Sellers por Categoria
[4] - Os 10 produtos mais caros e mais baratos
[5] - Gerar relatório HTML de produtos por categoria
[6] - Gerar relatório HTML com os top 10 Best Sellers
[7] - Sair
------------------------------------------------------------------
""")
option = int(input('Opção >>> '))
if option == 1:
qtdCategoria = qtdPorCategoria(dadosProdutos)
print("\nQUANTIDADE DE PRODUTOS POR CATEGORIA\n")
for categoria, quantidade in qtdCategoria.items():
print(f'{categoria}: {quantidade}')
print('\n')
print('Pressione ENTER para retornar ao menu')
input()
elif option == 2:
percentuais = percentualPorCategoria(dadosProdutos)
print('\nPERCENTUAL DE PRODUTOS POR CATEGORIA\n')
for categoria, percentual in percentuais.items():
print(f'{categoria}: {percentual:.2f}%')
print('\n')
print('Pressione ENTER para retornar ao menu')
input()
elif option == 3:
proporcoes = proporcaoBestSellers(dadosProdutos)
print('\nPROPORÇÃO DE BEST-SELLERS POR CATEGORIA\n')
for categoria, proporcao in proporcoes.items():
print(f'{categoria}: {proporcao:.2f}% ')
print('\n')
print("Pressione ENTER para retornar ao menu")
input()
elif option == 4:
maisBaratos, maisCaros = dezMaisCarosEMaisBaratos(dadosProdutos)
print('\n10 PRODUTOS MAIS BARATOS\n')
for produto in maisBaratos:
print(f'ID: {produto['id']}, Nome: {produto['title']}, Categoria: {produto['categoryName']}, Preço: R$ {produto['price']:.2f}')
print('\n10 PRODUTOS MAIS CAROS\n')
for produto in maisCaros:
print(f'ID: {produto['id']}, Nome: {produto['title']}, Categoria: {produto['categoryName']}, Preço: R$ {produto['price']:.2f}')
print('\nPressione ENTER para retornar ao menu')
input()
elif option == 5:
print("""
Escolha uma categoria para gerar relatório HTML:
[1] - Livros
[2] - Esportes
[3] - Moda
[4] - Casa
[5] - Eletrônicos
""")
categoriaEscolhida = int(input('Opção >>> '))
if categoriaEscolhida not in range(1, 6):
input('\nOpção inválida. Pressione ENTER para retornar ao MENU\n')
else:
relatorioPorCategoria(dadosProdutos, categoriaEscolhida)
input('\nRelatório gerado. Pressione ENTER para retornar ao MENU\n')
elif option == 6:
relatorioTopDezBestSellers(dadosProdutos)
input('\nRelatório gerado. Pressione ENTER para retornar ao MENU\n')
elif option == 7:
end = True
else:
print('Opção Inválida')