# Instalación de librerías complementarias
!pip install openpyxl==3.0.10
# Importación de módulos
import numpy as np
import pandas as pd
import sqlite3 as sql3
import openpyxl #se emplea para levantar correctamente el excel
import matplotlib.pyplot as plt
import seaborn as sns
# Levantamiento de los datos en 3 diferentes dataframes
conn = sql3.connect('/work/data/articles.db')
df_articles = pd.read_sql('SELECT * FROM articles',conn)
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
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)
# 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
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)
# Se encuentra un inconveniente en la columna de precios de los artículos.
# Es neccesario 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_articles.set_index('article_id', inplace=True)
# Agrego columnas e indico el campo que va a servir de ancla para recordar
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'])
# Se reemplazan los valores en el nuevo df
for i in range(len(my_df.index)):
article = df_articles.loc[my_df.loc[i]['article_id']]['article_name']
my_df.loc[i,'article_name'] = article
my_df.loc[i,'total_amount'] = my_df.loc[i,'quantity'] * df_articles.loc[my_df.loc[i]['article_id']]['unit_price']
my_df.loc[i,'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_id']]['seller_name']
# Se eliminan las columnas no necesarias
my_df.drop(['order_id', 'article_id', 'seller_id'], axis = 'columns', inplace=True)
print(my_df)
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
my_df2_por_cant = my_df2.sort_values('quantity', ascending=False)
print(my_df2_por_cant['quantity'].head(1))
# RESOLUCIÓN GRÁFICA
sns.set_theme(style="whitegrid")
sns.set_context("notebook", font_scale=1.2)
sns.barplot(x=my_df2_por_cant.index, y='quantity', data=my_df2_por_cant, palette="Blues_d")
plt.title("Cantidad de ventas por artículo")
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df2_por_amount = my_df2.sort_values('total_amount', ascending=False)
print(my_df2_por_amount['total_amount'].head(1))
# RESOLUCIÓN GRÁFICA
sns.set_theme(style="whitegrid")
sns.set_context("notebook", font_scale=1.2)
sns.barplot(x='total_amount', y=my_df2_por_amount.index, data=my_df2_por_amount, palette="Blues_d")
plt.title("Monto de ventas por artículo")
plt.xticks(np.arange(0, max(my_df2_por_amount['total_amount']), 50000))
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df3 = my_df.groupby('seller_name').sum()
my_df3_por_vendedor = my_df3.sort_values('total_amount', ascending=False)
print(my_df3_por_vendedor['total_amount'].head(1))
# RESOLUCIÓN GRÁFICA
sns.set_theme(style="whitegrid")
sns.set_context("notebook", font_scale=1.2)
sns.barplot(x='total_amount', y=my_df3_por_vendedor.index, data=my_df3_por_vendedor, palette="Blues_d")
plt.title("Monto de ventas por vendedor")
plt.show()
# Se propone realizar la promoción en la semana de menor monto de ventas
# RESOLUCIÓN ANALÍTICA
my_df4 = my_df.groupby('week').sum()
my_df4_por_semana = my_df4.sort_values('total_amount', ascending=False)
print(my_df4_por_semana)
diferencia = (my_df4_por_semana.loc[1,'total_amount']-my_df4_por_semana.loc[4,'total_amount'])/my_df4_por_semana.loc[4,'total_amount']
print(f'''Existe una gran diferencia en las ventas a los largo del mes.
Entre la semana de mayor monto de ventas y la de menor la diferencia asciende a un {100*diferencia} %
Se recomienda lanzar una camapaña de promociones en la semana de menores ventas, de manera de incrementar
las ventas en la misma y aprovechar la infraestructura que se encuentra ociosa del negocio.
Esto permitiría, además, mantener un flujo de ventas más estable a lo largo del tiempo''' )
# RESOLUCIÓN GRÁFICA
plt.pie(x=my_df4_por_semana['total_amount'], labels = my_df4_por_semana.index, shadow = True, autopct='%1.1f%%')
plt.legend(title = "Week n°")
plt.title("% de monto de ventas por semana")
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df5 = my_df.groupby('country_name').sum()
my_df5_por_amount = my_df5.sort_values('total_amount', ascending=False)
print('Los 5 países con más montos de ventas son')
print(my_df5_por_amount.head(5))
print('Los 5 países con menos montos de ventas son')
print(my_df5_por_amount.tail(5))
# RESOLUCIÓN GRÁFICA
sns.set_theme(style="whitegrid")
sns.set_context("notebook", font_scale=1.2)
sns.barplot(x=my_df5_por_amount.index, y='total_amount', data=my_df5_por_amount, palette="Blues_d")
plt.yticks(np.arange(0, max(my_df5_por_amount['total_amount']), 50000))
plt.title("Monto de ventas por país")
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df6 = my_df.groupby('country_name')['seller_name'].nunique()
print(my_df6)
# RESOLUCIÓN GRÁFICA
my_df6 = my_df6.reset_index()
my_df6.rename(columns = {'seller_name':'seller_quantity'}, inplace = True)
sns.set_theme(style="whitegrid")
sns.set_context("notebook", font_scale=1.2)
sns.barplot(x='country_name', y='seller_quantity', data=my_df6, palette="Blues_d")
plt.title("Cantidad de vendedores por pais")
plt.xticks(rotation=90)
plt.show()
# responder a la consulta y despues hacer un grafico por país donde se muestre la cantidad de articulos vendidos
# RESOLUCIÓN
my_df7 = my_df.groupby(['country_name','article_name']).sum()
my_df7 = my_df7.reset_index()
my_df7.drop(['week', 'quantity'], axis = 'columns', inplace=True)
indice = my_df7.groupby('country_name').idxmax()
maximos = my_df7.iloc[indice['total_amount']]
print(maximos)
# Otra forma de calcularlo
# idx = my_df7.groupby('country_name')['total_amount'].transform(max) == my_df7['total_amount']
# maximos = my_df7[idx]
# print(maximos)
print('''
''')
# RESOLUCIÓN GRÁFICA
sns.set(rc = {'figure.figsize':(15,8)})
paises = my_df7.country_name.unique()
my_df8 = my_df7.groupby('country_name')
for pais in paises:
df_pais = my_df8.get_group(pais)
sns.set_theme(style="whitegrid")
sns.set_context("notebook", font_scale=1.2)
sns.barplot(x='article_name', y='total_amount', data=df_pais, palette="Blues_d")
plt.title(f"Monto de ventas por artículo en {pais} ")
plt.xticks(rotation=90)
plt.show()