# 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
import matplotlib.pyplot as plt
import seaborn as sns
# 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()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBusqueda de valores nulls 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()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBusqueda de valores nuls 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()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBusqueda de valores nuls por columna')
print(df_orders.isnull().sum())
print('\nFormato de los datos por columna')
print(df_orders.dtypes)
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
my_df = df_orders.copy() # shallow copy o copia superficial (otro Objeto alojado en la memoria)
# Cambio el indice del df de artículos
df_articles.set_index('article_id', inplace=True)
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'])
# df_articles
# print()
my_df
for i in range(max(my_df.count())):
# SINTAXIS: df_articles.loc[indice][columna]
# [indice] va a ser el dato que obtengo de my_df.loc[i]['article_id']
# [indice] -> [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 (article_name)
# print(df_articles.loc[my_df.loc[i]['article_id']]['article_name'])
article = df_articles.loc[my_df.loc[i]['article_id']]['article_name']
# print(article)
# Asignar a cada valor id de la columna 'article_name' (my_df) el nombre del artículo
my_df.loc[i, 'article_name'] = article
# my_df
# hacemos lo mismo con total amount
my_df.loc[i, 'total_amount'] = my_df.loc[i, 'quantity']*df_articles.loc[my_df.loc[i]['article_id']]['unit_price']
# columna de seller_name
my_df.loc[i, 'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_id']]['seller_name']
# elimino las columnas que no necesito del df
my_df.drop(['order_id', 'article_id', 'seller_id'], axis='columns', inplace=True)
print(my_df)
# RESOLUCIÓN ANALÍTICA
print(my_df['article_name'].value_counts()) # cuenta valores únicos
# RESOLUCIÓN GRÁFICA
sns.displot(my_df, x='article_name')
plt.xticks(rotation=90) # 'vertical'
plt.show()
# RESOLUCIÓN ANALÍTICA
df2 = (my_df.groupby(by='article_name').sum()).sort_values('total_amount', ascending=False).head(5)
pd.options.display.float_format='$ {:,.2f}'.format
print(df2['total_amount'])
# 'article_name' es el index
# print(df2) # agrupa (y suma) sólo variables numéricas
# SINTAXIS ALTERNATIVA
# pd.options.display.float_format='$ {:,.2f}'.format
# print(my_df[['article_name'] + ['total_amount']].groupby(['article_name']).sum().sort_values('total_amount',ascending=False).head(5))
# RESOLUCIÓN GRÁFICA
plt.pie(x=df2['total_amount'],labels=df2.index, autopct='%1.2f%%')
plt.show()
# index es el 'article_name' del df2
# RESOLUCIÓN ANALÍTICA
df4 = (my_df.groupby(by='seller_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
# print(df4[['quantity'] + ['total_amount']])
print(df4[['quantity'] + ['total_amount']].head(5))
# 'seller_name' es el index
# RESOLUCIÓN GRÁFICA
plt.bar(df4.index, df4['total_amount'])
plt.xticks(rotation=60)
plt.show()
# RESOLUCIÓN ANALÍTICA
df5 = (my_df.groupby(by='week').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df5[['quantity'] + ['total_amount']])
# 'week' es el index
# RESOLUCIÓN GRÁFICA
plt.bar(df5.index, df5['total_amount'])
plt.show()
# Resolución Analítica y Gráfica
#RESOLUCION ANALITICA
#Eleccion de paises: 2 de America del Norte/Central y 2 de America del Sur
print(my_df['country_name'].value_counts())
#Comparacion
print()
print('VARIACION DE VENTAS POR SEMANA DE BRASIL')
df_Brazil = my_df.loc[(my_df['country_name'] == 'Brazil')]
print(df_Brazil.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True))
df_Brazil_Ventas = df_Brazil.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True)
print()
print('VARIACION DE VENTAS POR SEMANA DE URUGUAY')
df_Uruguay = my_df.loc[(my_df['country_name'] == 'Uruguay')]
print(df_Uruguay.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True))
df_Uruguay_Ventas = df_Uruguay.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True)
print()
print('VARIACION DE VENTAS POR SEMANA DE MEXICO')
df_Mexico = my_df.loc[(my_df['country_name'] == 'Mexico')]
print(df_Mexico.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True))
df_Mexico_Ventas = df_Mexico.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True)
print()
print('VARIACION DE VENTAS POR SEMANA DE HONDURAS')
df_Honduras = my_df.loc[(my_df['country_name'] == 'Honduras')]
print(df_Honduras.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True))
df_Honduras_Ventas = df_Honduras.groupby(by='week').agg({'total_amount':'sum'}).sort_values('week', ascending=True)
#RESOLUCIÓN GRÁFICA
sns.displot(my_df, x='country_name', color='peru')
plt.xticks(rotation=90)
plt.title("Frecuencia de Venta por País")
plt.xlabel("País")
plt.ylabel("Frecuencia")
plt.show()
print("COMPARACION DE VENTAS POR PAIS - CONO SUR")
#Plot 1
plt.subplot(1,2,1)
sns.barplot(df_Brazil_Ventas.index, df_Brazil_Ventas['total_amount'],palette='pastel')
plt.xticks(rotation=0)
plt.yticks(rotation=60)
plt.title("Brasil")
plt.xlabel("Semana")
plt.ylabel("Monto")
#Plot 2
plt.subplot(1,2,2)
sns.barplot(df_Uruguay_Ventas.index, df_Uruguay_Ventas['total_amount'],palette='pastel')
plt.xticks(rotation=0)
plt.yticks(rotation=60)
plt.title("Uruguay")
plt.xlabel("Semana")
plt.ylabel("")
plt.show()
print("COMPARACION DE VENTAS POR PAIS - CONO NORTE")
#Plot 3
plt.subplot(1,2,1)
sns.barplot(df_Mexico_Ventas.index, df_Mexico_Ventas['total_amount'],palette='pastel')
plt.xticks(rotation=0)
plt.yticks(rotation=60)
plt.title("Mexico")
plt.xlabel("Semana")
plt.ylabel("Monto")
#Plot 4
plt.subplot(1,2,2)
sns.barplot(df_Honduras_Ventas.index, df_Honduras_Ventas['total_amount'],palette='pastel')
plt.xticks(rotation=0)
plt.yticks(rotation=60)
plt.title("Honduras")
plt.xlabel("Semana")
plt.ylabel("")
plt.show()
# RESOLUCIÓN ANALITICA
df_Brazil_Top3Sup = (df_Brazil[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).head(3))
print('ARTICULOS MAS VENDIDOS EN BRASIL')
print(df_Brazil_Top3Sup['quantity'])
#otra alternativa
#print(df_Brazil[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).head(3))
print()
df_Uruguay_Top3Sup = (df_Uruguay[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).head(3))
print('ARTICULOS MAS VENDIDOS EN URUGUAY')
print(df_Uruguay_Top3Sup['quantity'])
print()
df_Mexico_Top3Sup = (df_Mexico[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).head(3))
print('ARTICULOS MAS VENDIDOS EN MEXICO')
print(df_Mexico_Top3Sup['quantity'])
print()
df_Honduras_Top3Sup = (df_Honduras[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).head(3))
print('ARTICULOS MAS VENDIDOS EN HONDURAS')
print(df_Honduras_Top3Sup['quantity'])
#RESOLUCION GRAFICA
print("TOP 3 ARTICULOS MÁS VENDIDOS POR PAIS - CONO SUR")
#Plot 1
plt.subplot(1,2,1)
plt.barh(df_Brazil_Top3Sup.index, df_Brazil_Top3Sup['quantity'], color='paleturquoise')
plt.xticks(rotation=0)
plt.yticks(rotation=90)
plt.title("Brasil")
plt.xlabel("Cantidad de Ventas")
plt.ylabel("Artículos")
#Plot 2
plt.subplot(1,2,2)
plt.barh(df_Uruguay_Top3Sup.index, df_Uruguay_Top3Sup['quantity'], color='paleturquoise')
plt.xticks(rotation=0)
plt.yticks(rotation=90)
plt.title("Uruguay")
plt.xlabel("Cantidad de Ventas")
plt.ylabel("")
plt.show()
print("TOP 3 ARTICULOS MÁS VENDIDOS POR PAIS - CONO NORTE")
#Plot 3
plt.subplot(1,2,1)
plt.barh(df_Mexico_Top3Sup.index, df_Mexico_Top3Sup['quantity'], color='mediumturquoise')
plt.xticks(rotation=0)
plt.yticks(rotation=90)
plt.title("Mexico")
plt.xlabel("Cantidad de Ventas")
plt.ylabel("Artículos")
#Plot 4
plt.subplot(1,2,2)
plt.barh(df_Honduras_Top3Sup.index, df_Honduras_Top3Sup['quantity'], color='mediumturquoise')
plt.xticks(rotation=0)
plt.yticks(rotation=90)
plt.title("Honduras")
plt.xlabel("Cantidad de Ventas")
plt.show()
# RESOLUCIÓN
# Mejor vendedor/producto. Mostrar importe/cantidad. Comparar 2 países (variable categórica)
# Resolución Analítica y Gráfica
df_Brazil_Top3Inf = (df_Brazil[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).tail(3))
print('ARTICULOS MENOS VENDIDOS EN BRASIL')
print(df_Brazil_Top3Inf['quantity'])
print()
df_Uruguay_Top3Inf = (df_Uruguay[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).tail(3))
print('ARTICULOS MENOS VENDIDOS EN URUGUAY')
print(df_Uruguay_Top3Inf['quantity'])
print()
df_Mexico_Top3Inf = (df_Mexico[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).tail(3))
print('ARTICULOS MENOS VENDIDOS EN MEXICO')
print(df_Mexico_Top3Inf['quantity'])
print()
df_Honduras_Top3Inf = (df_Honduras[['article_name'] + ['quantity']].groupby(['article_name']).sum().sort_values('quantity',ascending=False).tail(3))
print('ARTICULOS MENOS VENDIDOS EN HONDURAS')
print(df_Honduras_Top3Inf['quantity'])
#RESOLUCION GRAFICA
print("ARTICULOS MENOS VENDIDOS POR PAIS - CONO SUR")
#Plot 1
plt.subplot(1,2,1)
e=(0.05,0.05,0.05)
a=['goldenrod','gold', 'wheat']
plt.pie(df_Brazil_Top3Inf['quantity'],labels=df_Brazil_Top3Inf.index,autopct='%1.0f%%',explode=e, colors=a,pctdistance=0.65)
plt.title("Brasil")
#Plot 2
plt.subplot(1,2,2)
e=(0.05,0.05,0.05)
a=['goldenrod','gold', 'wheat']
plt.pie(df_Uruguay_Top3Inf['quantity'],labels=df_Uruguay_Top3Inf.index,autopct='%1.0f%%',explode=e, colors=a,pctdistance=0.65)
plt.title("Uruguay")
plt.show()
print("ARTICULOS MENOS VENDIDOS POR PAIS - CONO NORTE")
#Plot 3
plt.subplot(1,2,1)
e=(0.05,0.05,0.05)
a=['coral','orange', 'navajowhite']
plt.pie(df_Mexico_Top3Inf['quantity'],labels=df_Mexico_Top3Inf.index,autopct='%1.0f%%',explode=e, colors=a,pctdistance=0.65)
plt.title("Mexico")
#Plot 4
plt.subplot(1,2,2)
e=(0.05,0.05,0.05)
a=['coral','orange', 'navajowhite']
plt.pie(df_Honduras_Top3Inf['quantity'],labels=df_Honduras_Top3Inf.index,autopct='%1.0f%%',explode=e, colors=a,pctdistance=0.65)
plt.title("Honduras")
plt.show()