From 37d366bab7e2aec3252ab06fe9c04b32f87402db Mon Sep 17 00:00:00 2001 From: Pedro Sadarc Date: Fri, 12 Jun 2026 12:19:05 -0400 Subject: [PATCH] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20do=20desafio=20LooqBox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 ++ code/case1.py | 99 +++++++++++++++++++++++++++++++++++++++++++ code/case2.py | 52 +++++++++++++++++++++++ code/case3.py | 69 ++++++++++++++++++++++++++++++ code/sql_queries.py | 93 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 317 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 code/case1.py create mode 100644 code/case2.py create mode 100644 code/case3.py create mode 100644 code/sql_queries.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4b5a294 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:conda", + "python-envs.defaultPackageManager": "ms-python.python:conda" +} \ No newline at end of file diff --git a/code/case1.py b/code/case1.py new file mode 100644 index 0000000..860fec2 --- /dev/null +++ b/code/case1.py @@ -0,0 +1,99 @@ +# %% +import pandas as pd +import mysql.connector +from mysql.connector import Error +from datetime import datetime +# %% +#função para receber a entrada via teclado do codigo do produto e fazer com que ele seja inteiro +def insert_prod_cod(): + try: + prod_code = int(input("Digite o codigo do produto que voce irá procurar (apenas numero sem virgulas ou caracteres):")) + except ValueError as err: + print("Você precisa inserir um numero inteiro ") + else: + if(prod_code > 0): + return(prod_code) + print("Não Existe codigo de produto negativo") + return(insert_prod_cod()) + + +# %% + +#função para receber codigo da loja via teclado e garantir que seja inteiro +def insert_store_cod(): + try: + store_code = int(input("Digite o codigo do Loja que voce irá procurar (apenas numero sem virgulas ou caracteres):")) + except ValueError as err: + print("Você precisa inserir um numero inteiro ") + else: + if(store_code > 0): + return(store_code) + print("Não Existe codigo de produto negativo") + return(insert_store_cod()) + +# %% + +#função para receber as datas e garantir que estejam no padrao, estejam dentro do range e tambem que +#os valores de inicio seja menor que a de fim +def insert_date(): + try: + date_init = datetime.strptime(input("Digite a data Inicial de pesquisa (YYYY-MM-DD) a data precisa ser entre '2019-01-01', '2019-01-31':"), "%Y-%m-%d") + date_end = datetime.strptime(input("Digite a data Final de pesquisa (YYYY-MM-DD) a data precisa ser entre '2019-01-01', '2019-01-31':"), "%Y-%m-%d") + date_range_init = datetime.strptime("2019-01-01","%Y-%m-%d") + date_range_end = datetime.strptime("2019-12-31","%Y-%m-%d") + + except ValueError as err: + print("A data esta em formato errado ") + else: + if(date_init >= date_end): + print("Data inicial maior que data final!") + else: + if(date_range_init <= date_init <= date_range_end and date_range_init <= date_end <= date_range_end ): + return([date_init, date_end]) + print(" A data nao esta entre os periodos de '2019-01-01', '2019-12-31'") + return(insert_date()) +# %% +def connect(): + try: + connection = mysql.connector.connect( + host="35.199.115.174", + user="looqbox-challenge", + password="looq-challenge", + database="looqbox-challenge" + ) + return connection + + except Error as e: + return print(f"Erro ao conectar com o banco: {e}") + +# %% + +def sql_table(prod_code, store_code, date): + connection = connect() + if connection.is_connected(): + print("Conectado ao banco") + cursor = connection.cursor() + cursor.execute("SELECT * " \ + "FROM data_product_sales ;") + colunas = [coluna[0] for coluna in cursor.description] + dados = cursor.fetchall() + data_products_sale = pd.DataFrame(dados, columns=colunas) + + #Conversão do tipo das colunas para fazer os filtros + data_products_sale['DATE'] = pd.to_datetime(data_products_sale['DATE']) + data_products_sale['STORE_CODE'] = data_products_sale['STORE_CODE'].astype(int) + data_products_sale['PRODUCT_CODE'] = data_products_sale['PRODUCT_CODE'].astype(int) + + #aplicação de filtros nos DFs baseados na entrada + data_products_sale = data_products_sale[data_products_sale['DATE'].between(*date)] + data_products_sale = data_products_sale[data_products_sale['STORE_CODE'] == store_code] + data_products_sale = data_products_sale[data_products_sale['PRODUCT_CODE'] == prod_code] + cursor.close() + return(data_products_sale) +# %% +df1 = sql_table(insert_prod_cod(), insert_store_cod(), insert_date()) +# %% +print(df1) + + +# %% diff --git a/code/case2.py b/code/case2.py new file mode 100644 index 0000000..8594a3c --- /dev/null +++ b/code/case2.py @@ -0,0 +1,52 @@ +# %% +import pandas as pd +import mysql.connector +from mysql.connector import Error +from datetime import datetime +# %% + +def connect(): + try: + connection = mysql.connector.connect( + host="35.199.115.174", + user="looqbox-challenge", + password="looq-challenge", + database="looqbox-challenge" + ) + return connection + + except Error as e: + return print(f"Erro ao conectar com o banco: {e}") +# %% +def sales_bytime(): + connection = connect() + if connection.is_connected(): + print("Conectado ao banco") + cursor = connection.cursor() + cursor.execute("SELECT STORE_CODE, STORE_NAME, START_DATE, END_DATE, BUSINESS_NAME, BUSINESS_CODE " \ + "FROM data_store_cad;") + colunas = [coluna[0] for coluna in cursor.description] + dados = cursor.fetchall() + df_data_store = pd.DataFrame(dados, columns=colunas) + + cursor.execute("SELECT STORE_CODE, DATE, SALES_VALUE, SALES_QTY " \ + "FROM data_store_sales WHERE DATE BETWEEN '2019-01-01' AND '2019-12-31';") + colunas = [coluna[0] for coluna in cursor.description] + dados = cursor.fetchall() + data_store_sales = pd.DataFrame(dados, columns=colunas) + cursor.close() + + #junção das tabelas com informações de vendas por loja e nome da loja para criar a tabela agrupada + df_sales = df_data_store.merge(data_store_sales, on='STORE_CODE') + #conversão de tipo das colunas + df_sales['DATE'] = pd.to_datetime(df_sales['DATE']) + #Filtros + df_sales = df_sales[df_sales['DATE'].between('2019-10-01','2019-12-31')] + #Agrupamento e soma dos valores baseados no nome da loja e no nome do negocio + df_sales = df_sales[['STORE_NAME','BUSINESS_NAME','SALES_VALUE']].groupby(["STORE_NAME","BUSINESS_NAME"]).sum().sort_values('STORE_NAME') + return(df_sales) + +# %% + +print(sales_bytime()) +# %% diff --git a/code/case3.py b/code/case3.py new file mode 100644 index 0000000..4e2ce78 --- /dev/null +++ b/code/case3.py @@ -0,0 +1,69 @@ +# %% +import pandas as pd +import mysql.connector +from mysql.connector import Error +from datetime import datetime +import matplotlib.pyplot as plt +import numpy as np +# %% + +def connect(): + try: + connection = mysql.connector.connect( + host="35.199.115.174", + user="looqbox-challenge", + password="looq-challenge", + database="looqbox-challenge" + ) + return connection + + except Error as e: + return print(f"Erro ao conectar com o banco: {e}") +# %% + +connection = connect() +if connection.is_connected(): + print("Conectado ao banco") + cursor = connection.cursor() + cursor.execute("SELECT * FROM IMDB_movies;") + colunas = [coluna[0] for coluna in cursor.description] + dados = cursor.fetchall() + df1 = pd.DataFrame(dados, columns=colunas) + cursor.close() + +# %% + +#Fazendo Grafico de quantidade de filmes por ano +df_movies_year = df1.groupby("Year").size().sort_index() +plt.bar(df_movies_year.index, df_movies_year.values ) +plt.title ("Número de Filmes por ano") +plt.xlabel("Ano") +plt.ylabel("Num de Filmes") +plt.show() +# %% + +#Fazendo grafico de quantidade de filmes por rating com range + +#criação de uma coluna separando os ranges por grupos de 0 ate 4, 5 a 8 e 9 a 10 +intervalos = [0, 4.9, 8.9, 10.1] +nomes_faixas = ["0 a 4", "5 a 8", "9 e 10 (Ótimo)"] +df1["faixa_rating"] = pd.cut(df1["Rating"], bins=intervalos, labels=nomes_faixas, right=False) + +movies_rating = df1.groupby("faixa_rating").size().sort_index() + +plt.bar(movies_rating.index, movies_rating.values ) +plt.title ("Número de Filmes por faixa de Rating") +plt.xlabel("Faixa de Rating") +plt.ylabel("Num de Filmes") +plt.show() +# %% + +##Fazendo grafico de dispersão para verificar o retorno do filme baseado no rating +valores_y = np.arange(0, int(df1['RevenueMillions'].max()) + 100, 100) +plt.yticks(valores_y) +plt.grid(axis="y", linestyle="--", alpha=0.7, color="gray") +plt.scatter(df1['Rating'], df1['RevenueMillions']) +plt.title ("Relação de Rating e Bilheteria") +plt.xlabel("Rating") +plt.ylabel("Retorno Bilheteria") +plt.show() diff --git a/code/sql_queries.py b/code/sql_queries.py new file mode 100644 index 0000000..7dc8ac6 --- /dev/null +++ b/code/sql_queries.py @@ -0,0 +1,93 @@ +# %% + +import pandas as pd +import mysql.connector +from mysql.connector import Error +from datetime import datetime + +# %% +#Conexão com banco de dados +def connect(): + try: + connection = mysql.connector.connect( + host="35.199.115.174", + user="looqbox-challenge", + password="looq-challenge", + database="looqbox-challenge" + ) + return connection + + except Error as e: + return print(f"Erro ao conectar com o banco: {e}") + +# %% + +# Desafio 1 +def top_10_expensive(): + connection = connect() + if connection.is_connected(): + print("Conectado ao banco") + cursor = connection.cursor() + #Query para pegar os 10 produtos mais caros + cursor.execute("SELECT PRODUCT_NAME, PRODUCT_VAL " \ + "FROM data_product ORDER BY PRODUCT_VAL DESC LIMIT 10;") + colunas = [coluna[0] for coluna in cursor.description] + dados = cursor.fetchall() + df_produtos_mais_caros = pd.DataFrame(dados, columns=colunas) + print(df_produtos_mais_caros) + cursor.close() + + if 'connection' in locals() and connection.is_connected(): + connection.close() + print("\nConexão encerrada!") +# %% +top_10_expensive() + +# %% +# Desafio 2 +def sections_departaments(): + connection = connect() + if connection.is_connected(): + print("Conectado ao banco") + cursor = connection.cursor() + #Query para mostrar quais seções tem nos departamentos de BEBIDAS E PADARIA + cursor.execute("SELECT DISTINCT SECTION_NAME,DEP_NAME FROM data_product " \ + "WHERE DEP_NAME IN ('BEBIDAS','PADARIA') ORDER BY DEP_NAME;") + colunas = [coluna[0] for coluna in cursor.description] + dados = cursor.fetchall() + df_section_name = pd.DataFrame(dados, columns=colunas) + print(df_section_name) + cursor.close() + + if 'connection' in locals() and connection.is_connected(): + connection.close() + print("\nConexão encerrada!") + + +# %% +sections_departaments() +#%% +#Desafio 3 +def total_sales_BA_quarter(): + connection = connect() + if connection.is_connected(): + print("Conectado ao banco") + cursor = connection.cursor() + #Query para mostrar o total de vendas por area de negocio no primeiro quarter de 2019 + cursor.execute("SELECT a.BUSINESS_NAME, SUM(b.SALES_VALUE) AS total_sales, SUM(b.SALES_QTY) AS total_qtd " \ + "FROM data_store_cad AS a " \ + "JOIN data_store_sales AS b " \ + "ON a.STORE_CODE = b.STORE_CODE " \ + "WHERE b.DATE BETWEEN '2019-01-31' AND '2019-04-30' " \ + "GROUP BY a.BUSINESS_NAME " \ + "ORDER BY total_sales DESC;") + colunas = [coluna[0] for coluna in cursor.description] + dados = cursor.fetchall() + df_total_vendas = pd.DataFrame(dados, columns=colunas) + print(df_total_vendas) + cursor.close() + + if 'connection' in locals() and connection.is_connected(): + connection.close() + print("\nConexão encerrada!") +total_sales_BA_quarter() \ No newline at end of file