# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
# imports
import numpy as np
import pandas as pd
import sqlite3 as sql3
import openpyxl # para que levante bien el excel
import matplotlib.pyplot as plt
import seaborn as sns
# Configuracion de graficos
sns.set(style="darkgrid")
# Levanto los datos en 3 diferentes dataframes
#Articulos
conn = sql3.connect("/work/data/articles.db")
sql_query = pd.read_sql_query("SELECT * FROM articles", conn)
df_articles = pd.DataFrame(sql_query, columns = ["article_id", "article_name", "unit_price"])
# Vendedores
df_sellers = pd.read_excel("/work/data/sellers.xlsx", index_col= 0)
# Ordenes
df_orders = pd.read_csv("/work/data/orders.csv")
# Exploración del df de artículos
print('Muestra de datos')
print(df_articles.head())
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBúsqueda de valores nulos por columna')
print(df_articles.isnull().sum())
print('\nFormato de los datos por columna')
print(df_articles.dtypes) #unit_price es un objet, hay que cambiarlo a float
# Exploración del df de vendedores
print('Muestra de datos')
print(df_sellers.head())
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBúsqueda de valores nulos por columna')
print(df_sellers.isnull().sum())
print('\nFormato de los datos por columna')
print(df_sellers.dtypes)
# Exploración del df de órdenes
# Exploración del df de órdenes
print('Muestra de datos')
print(df_orders.head())
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBúsqueda de valores nulos por columna')
print(df_orders.isnull().sum())
print('\nFormato de los datos por columna')
print(df_orders.dtypes)
# Encuentro un inconveniente en la columna de precios de los artículos.
# Necesito cambiar el formato cadena a float.
df_articles["unit_price"] = df_articles["unit_price"].astype(float)
print(df_articles.dtypes)
# Creo una copia del df_orders
my_df = df_orders.copy()
# Cambio el índice del df de artículos
df_artic = df_articles.set_index('article_id',inplace = False)
# Agrego algunas columnas y pongo el campo que me va a servir de "ancla" para acordarme
my_df = my_df.assign(article_name = my_df['article_id'])
my_df = my_df.assign(total_amount = my_df['article_id'])
my_df = my_df.assign(seller_name = my_df['seller_id'])
# reemplazo los valores en el nuevo df
# 1. busco el nombre del artículo y lo asigno a una variable
# como df_articles está indexado por article_id, lo uso para ubicarme en
# el registro que busco
# SINTAXIS: df_articles.loc[indice][columna]
# [indice] va a ser el dato que obtengo de my_df.loc[i]['article_id']
# -> o sea, tomo registro a registro el article_id y lo uso para extraer
# el nombre del artículo
for i in range(len(my_df.index)): # len(my_df.index) devuelve la cantidad de registros
id_articulo = my_df.loc[i]['article_id']
nombreArticulo = df_artic.loc[id_articulo]['article_name']
# se lo asigno a la columna correspondiente
my_df.loc[i,'article_name'] = nombreArticulo
# Obtenemos total_amount
precioArticulo = df_artic.loc[id_articulo]['unit_price']
my_df.loc[i, "total_amount"] = my_df.loc[i, "quantity"] * precioArticulo
# Obtenemos seller_name
id_vendedor = my_df.loc[i]['seller_id']
nombreVendedor = df_sellers.loc[id_vendedor]['seller_name']
my_df.loc[i, "seller_name"] = nombreVendedor
# elimino las columnas que no necesito
my_df.drop(['order_id', 'article_id', 'seller_id'], axis = 'columns', inplace=True)
my_df.head
# RESOLUCIÓN
# 1)
df_art_semana = my_df.groupby(['article_name', 'week']).sum()
#print(df_art_semana)
# 2) Obtener la lista de articulos
articulos = my_df.groupby('article_name').sum().index.values
#print(paises)
# 3) Creo el DF final
df_final = pd.DataFrame(columns=['Semana', 'Cantidad'], index=articulos)
#print(df_final)
# 4) Procesar el DF df_art_semana y obtener las ventas maximas (en unidades) x semana
# y guardarlas en df_final
for a in articulos:
df = df_art_semana.loc[a]
c = df.max()['quantity']
s = df[(df['quantity'] == c)].index[0]
df_final.loc[a] = {'Semana': s, 'Cantidad': c}
df_final['Semana'] = df_final['Semana'].astype(int)
df_final['Cantidad'] = df_final['Cantidad'].astype(int)
print(df_final)
g = sns.barplot(data = df_final, x = df_final.index, y = 'Cantidad', hue = 'Semana')
g.set_xticklabels(labels=df_final.index, rotation=90)
plt.xlabel("Articulos")
plt.title("Pico de ventas por articulo durante el mes")
plt.show()