# 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
# Levanto los datos en 3 diferentes dataframes
# Artículos
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)
# Órdenes
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)
df_articles
# 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)
df_sellers
# 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)
df_orders
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 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
idArticulo = my_df.loc[i]['article_id']
nombreArticulo = df_articles.loc[idArticulo]['article_name']
# se lo asigno a la columna correspondiente
my_df.loc[i,'article_name'] = nombreArticulo
# hago lo mismo para la columna de total_amount
precioArticulo = df_articles.loc[idArticulo]['unit_price']
cantArticulo = my_df.loc[i]['quantity']
my_df.loc[i,'total_amount'] = precioArticulo * cantArticulo
# columna de seller_name
idVendedor = my_df.loc[i]['seller_id']
nombreVendedor = df_sellers.loc[idVendedor]['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
# RESOLUCIÓN ANALÍTICA
my_df1=my_df.groupby('article_name').sum().sort_values('quantity', ascending=False).head(5)
print(my_df1['quantity'].head(1))
# RESOLUCIÓN GRÁFICA
plot = sns.barplot(y=my_df1.index, x=my_df1['quantity'], palette='mako')
plt.suptitle('Los 5 productos más vendidos (en unidades)', fontsize='xx-large')
for pos in ['right', 'top', 'bottom', 'left']:
plt.gca().spines[pos].set_visible(False)
for i in plot.containers:
plot.bar_label(i, padding=5)
plt.xlabel('')
plt.xticks([])
plt.ylabel(ylabel='')
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df2 = (my_df.groupby(by='article_name').sum()).sort_values('total_amount',ascending=False).head(5)
print(my_df2['total_amount'])
# RESOLUCIÓN GRÁFICA:
sns.barplot(y=my_df2['total_amount'], x=my_df2.index, palette='mako')
plt.suptitle('Los 5 productos más rentables',fontsize='xx-large')
for pos in ['right', 'top', 'bottom', 'left']:
plt.gca().spines[pos].set_visible(False)
ingresos = my_df2['total_amount'].values
for i, ingreso in enumerate(ingresos):
v = '$ ' + str(int(ingreso))
plt.text(s=v, x=i, y=my_df2['total_amount'][i] + 15000, ha='center')
plt.xlabel('')
plt.yticks([])
plt.ylabel(ylabel='')
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df3 = (my_df.groupby(by='seller_name').sum()).sort_values('total_amount',ascending=False)
print(my_df3[['quantity']+['total_amount']])
# RESOLUCIÓN GRÁFICA
e = [0.2]
exp = [e.append(0) for x in range(len(my_df3)-1)]
c = sns.color_palette('mako', n_colors=len(my_df3))
plt.suptitle(t='Representación de ventas por vendedor', y=1.2, fontsize='xx-large')
_, _, autotexts = plt.pie(my_df3['total_amount'], explode=e,labels=my_df3.index, colors=c,radius=1.7,
autopct='%1.1f%%')
for ins in autotexts:
ins.set_color('white')
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df4 = (my_df.groupby(by='week').sum()).sort_values('total_amount',ascending=False)
print(my_df4['total_amount'])
# RESOLUCIÓN GRÁFICA
sns.barplot(y=my_df4['total_amount'], x=my_df4.index, palette='mako')
plt.suptitle('Variación de ventas', fontsize='xx-large')
for pos in ['right', 'top', 'bottom', 'left']:
plt.gca().spines[pos].set_visible(False)
ingresos = my_df4['total_amount'].values
for i, ingreso in enumerate(ingresos):
v = '$ ' + str(int(ingreso))
plt.text(s=v, x=i, y=my_df4['total_amount'][i+1] + 15000, ha='center')
plt.xlabel('Semanas')
plt.yticks([])
plt.ylabel(ylabel='')
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df5 = (my_df.groupby(by='country_name').sum()).sort_values('total_amount',ascending=False).head(5)
print(my_df5['total_amount'])
# RESOLUCIÓN GRÁFICA
sns.barplot(y=my_df5['total_amount'], x=my_df5.index, palette='mako')
plt.suptitle('Los 5 principales compradores',fontsize='xx-large')
for pos in ['right', 'top', 'bottom', 'left']:
plt.gca().spines[pos].set_visible(False)
ingresos = my_df5['total_amount'].values
for i, ingreso in enumerate(ingresos):
v = '$ ' + str(int(ingreso))
plt.text(s=v, x=i, y=my_df5['total_amount'][i] + 15000, ha='center')
plt.xlabel('')
plt.yticks([])
plt.ylabel(ylabel='')
plt.show()
# RESOLUCIÓN ANALÍTICA
# Previsualizar el DF final
# -------------------------
# "País" "Artículo" "Ventas"
# Pais1 art monto
# Pais2 art monto
# 1) Obtener total x artículo x pais
df_pais_articulo = my_df.groupby(['country_name', 'article_name']).sum()
# 2) Obtener la lista de paises
paises = my_df.groupby('country_name').sum().index.values
# 3) Creo el DF final, pero aún sin datos
my_df6 = pd.DataFrame(columns=['Artículo', 'Ventas'], index=paises)
# 4) Procesar el DF df_pais_articulo y obtener las ventas maximas x artículo y guardarlas en my_df5
for p in paises:
df = df_pais_articulo.loc[p]
v = df.max()['total_amount']
a = df[(df['total_amount'] == v)].index[0]
my_df6.loc[p] = {'Artículo': a, 'Ventas': v}
my_df6 = my_df6.sort_values(['Artículo', 'Ventas'])
my_df6.reset_index(inplace=True, drop=False)
my_df6.columns = ['País','Artículo', 'Ventas']
print(my_df6)
# RESOLUCIÓN GRÁFICA
c = sns.color_palette('mako', n_colors=my_df6.nunique(0)[1])
df_pivot = pd.pivot_table(my_df6, index='País', columns='Artículo', values='Ventas', aggfunc='sum')
df_pivot = df_pivot.sort_values(['CPU','Full Pc', 'Monitor', 'Notebook','Smartphone'], ascending=False)
df_pivot.plot.barh(stacked=True, color=c, width=0.9)
plt.suptitle(t='Producto más vendido por país', y=1.2, fontsize='xx-large')
for pos in ['right', 'top', 'bottom', 'left']:
plt.gca().spines[pos].set_visible(False)
ingresos = my_df6.values
for ingreso in ingresos:
v = '$ ' + str(int(ingreso[2]))
i = df_pivot.index.values
plt.text(s=v, x=ingreso[2] + 2000, y=np.where(i==ingreso[0])[0][0], va='center')
plt.xlabel('')
plt.xticks([])
plt.ylabel(ylabel='')
plt.show()
# RESOLUCIÓN ANALÍTICA
# Previsualizar el DF final
# -------------------------------------------------
# índices columnas
# "week" "article_name" "quantity " "total_amount"
# 1 Full Pc unidades monto
# 2 Full Pc unidades monto
# 3 Full Pc unidades monto
# 4 Full Pc unidades monto
# 1) Obtener total x semana x producto
df_semana_articulo = my_df.groupby(['week', 'article_name']).sum()
# 2) Reduzco el DF df_semana_articulo a sólo el artículo Full Pc (el más vendido)
indices = []
for i in range(len(df_semana_articulo)):
if df_semana_articulo.index[i][1] != 'Full Pc':
indices.append(i)
my_df7 = df_semana_articulo.drop(df_semana_articulo.index[indices])
print(my_df7)
# RESOLUCIÓN GRÁFICA
label = ['Semana '+ str(x) for x in range(1,len(my_df7)+1)]
c = sns.color_palette('mako', n_colors=len(my_df7))
plt.suptitle(t='Variación de ventas de Full PC a lo largo del mes', y=1.2, fontsize='xx-large')
_, _, autotexts = plt.pie(my_df7['total_amount'], labels=label, colors=c,radius=1.7,
autopct='%1.1f%%')
for ins in autotexts:
ins.set_color('white')
plt.show()