# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
Requirement already satisfied: openpyxl==3.0.10 in /root/venv/lib/python3.9/site-packages (3.0.10)
Requirement already satisfied: et-xmlfile in /root/venv/lib/python3.9/site-packages (from openpyxl==3.0.10) (1.1.0)
WARNING: You are using pip version 22.0.4; however, version 22.1.2 is available.
You should consider upgrading via the '/root/venv/bin/python -m pip install --upgrade pip' command.
# imports
import numpy as np
import pandas as pd
import sqlite3 as sql3
import openpyxl
import matplotlib.pyplot as plt
import seaborn as sns
# 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')
# Ó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)
Muestra de datos
article_id article_name unit_price
0 20015 Smartphone 525.00
1 20016 Full Pc 2127.81
2 20017 Monitor 230.00
3 20018 Tablet 130.00
4 20019 Desk 130.10
Formato del dataframe
(31, 3)
Búsqueda de valores nulos por columna
article_id 0
article_name 0
unit_price 0
dtype: int64
Formato de los datos por columna
article_id int64
article_name object
unit_price object
dtype: object
# 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)
Muestra de datos
seller_id seller_name
0 1 Aveline Swanwick
1 2 Jase Doy
2 3 Oliviero Charkham
3 4 Cornie Wynrehame
4 5 Ewell Peres
Formato del dataframe
(15, 2)
Búsqueda de valores nulos por columna
seller_id 0
seller_name 0
dtype: int64
Formato de los datos por columna
seller_id int64
seller_name object
dtype: object
# 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)
Muestra de datos
order_id week article_id quantity seller_id country_name
0 15024 1 20039 10 10 Peru
1 15025 1 20029 15 5 Peru
2 15026 1 20024 5 14 Bolivia
3 15027 1 20018 9 14 Brazil
4 15028 1 20035 6 15 Mexico
Formato del dataframe
(1000, 6)
Búsqueda de valores nulos por columna
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Formato de los datos por columna
order_id int64
week int64
article_id int64
quantity int64
seller_id int64
country_name object
dtype: object
# Inconveniente del df Artículos
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
# Inconveniente del df Vendedores
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
article_id int64
article_name object
unit_price float64
dtype: object
my_df = df_orders.copy()
df_articulos = df_articles.set_index('article_id',inplace = False)
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'])
for i in range(len(my_df.index)):
id_articulo = my_df.loc[i]['article_id']
nombre_articulo = df_articulos.loc[id_articulo]['article_name']
my_df.loc[i,'article_name'] = nombre_articulo
precio_articulo = df_articulos.loc[id_articulo]['unit_price']
my_df.loc[i,'total_amount'] = my_df.loc[i,'quantity'] * precio_articulo
id_vendedor = my_df.loc[i]['seller_id']
nombre_vendedor = df_sellers.loc[id_vendedor]['seller_name']
my_df.loc[i,'seller_name'] = nombre_vendedor
my_df.drop(['order_id', 'article_id', 'seller_id'], axis = 'columns', inplace=True)
# RESOLUCIÓN ANALÍTICA
df_q_articulos = my_df.groupby('article_name').sum()
df_q_articulos_orden = df_q_articulos.sort_values('quantity',ascending=False)
print(df_q_articulos_orden['quantity'].head(1))
article_name
HDD 413
Name: quantity, dtype: int64
# RESOLUCIÓN GRÁFICA
df_q_articulos_orden['quantity'].head(5).plot(kind='bar',title='Top 5: Artículos más vendidos',color=['b','r','g','c','m'],edgecolor='black')
plt.xlabel('Artículos')
plt.ylabel('Ventas')
plt.xticks(rotation=0)
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_articulo = my_df.groupby('article_name').sum()
df_monto_articulo_orden = df_monto_articulo.sort_values('total_amount',ascending=False)
print(df_monto_articulo_orden['total_amount'].head(5))
article_name
Full Pc 538335.93
Notebook 251000.00
Smartphone 152250.00
Chair 69477.48
Tablet 48620.00
Name: total_amount, dtype: float64
# RESOLUCIÓN GRÁFICA
df_monto_articulo_orden['total_amount'].head(5).sort_values(ascending=True).plot(kind='barh',title='Top 5: Artículos que más ingresos generaron',color=['b','r','g','c','m'],edgecolor='black')
plt.xlabel('Monto vendido')
plt.ylabel('')
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_vendedor = my_df.groupby('seller_name').sum()
df_monto_vendedor_orden = df_monto_vendedor.sort_values('total_amount',ascending=False)
print(df_monto_vendedor_orden[['quantity']+['total_amount']])
quantity total_amount
seller_name
Janel O'Curran 703 192832.47
Brockie Patience 441 142709.88
Oliviero Charkham 555 141329.76
Vasily Danilyuk 521 129157.55
Daisie Slograve 554 120520.11
Aveline Swanwick 629 118874.33
Arnold Kilkenny 583 94552.04
Kati Innot 512 83704.62
Jase Doy 582 80628.31
Ewell Peres 496 78144.32
Onida Cosely 535 77373.37
Milly Christoffe 442 61733.69
Tobin Roselli 519 56984.42
Cornie Wynrehame 523 52253.57
Cirilo Grandham 470 45009.40
# RESOLUCIÓN GRÁFICA
df_monto_vendedor_orden['total_amount'].head(5).plot(kind='bar',title='Top 5: Ranking de ventas por vendedor',color=['b','r','g','c','m'],edgecolor='black')
plt.ylabel('Monto vendido ($)')
plt.xlabel('')
plt.xticks(rotation=15,ha='right')
plt.show()
# RESOLUCIÓN ANALÍTICA
df_venta_semanal = my_df.groupby('week').sum()
df_venta_semanal_orden = df_venta_semanal.sort_values('total_amount',ascending=False)
print(df_venta_semanal_orden['total_amount'])
week
1 507458.81
2 415364.44
3 329140.03
4 223844.56
Name: total_amount, dtype: float64
# RESOLUCIÓN GRÁFICA
df_venta_semanal_orden['total_amount'].plot(kind='bar',title='Ventas por semana',color=['b','r','g','c'],edgecolor='black')
plt.ylabel('Monto vendido ($)')
plt.xlabel('Semanas')
plt.xticks(rotation=0)
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_pais = my_df.groupby('country_name').sum()
df_monto_pais_orden = df_monto_pais.sort_values('total_amount',ascending=False)
print(df_monto_pais_orden['total_amount'].head(5))
# RESOLUCIÓN GRÁFICA
df_monto_pais_orden['total_amount'].head(5).plot(kind='bar',title='Top 5: Países con la mayor cantidad de ventas en dinero',color=['g','deepskyblue','yellow','r','w'],edgecolor='black')
plt.ylabel('Monto vendido ($)')
plt.xlabel('')
plt.xticks(rotation=0)
plt.show()
country_name
Brazil 441271.85
Argentina 205832.78
Colombia 177514.29
Peru 161421.12
Mexico 138619.99
Name: total_amount, dtype: float64
# RESOLUCIÓN ANALÍTICA
df_vendedor_semana = my_df.groupby(['seller_name', 'week']).sum()
vendedores = my_df.groupby('seller_name').sum().index.values
df_final = pd.DataFrame(columns=['Semana', 'Ventas'], index=vendedores)
for v in vendedores:
df = df_vendedor_semana.loc[v]
t = df.max()['total_amount']
s = df[(df['total_amount'] == t)].index[0]
df_final.loc[v] = {'Semana': s, 'Ventas': t}
df_final['Semana'] = df_final['Semana'].astype(int)
print(df_final)
# RESOLUCIÓN GRÁFICA
g = sns.barplot(data = df_final, x = df_final.index, y = 'Ventas', hue = 'Semana')
g.set_xticklabels(labels=df_final.index, rotation=60, ha='right')
plt.title('Semana con más ventas de cada vendedor')
plt.show()
Semana Ventas
Arnold Kilkenny 1 39536.3
Aveline Swanwick 2 54701.55
Brockie Patience 2 78999.56
Cirilo Grandham 1 14263.63
Cornie Wynrehame 1 23674.66
Daisie Slograve 1 46744.06
Ewell Peres 3 25367.85
Janel O'Curran 1 68273.51
Jase Doy 1 55769.68
Kati Innot 1 35201.04
Milly Christoffe 1 24499.05
Oliviero Charkham 1 74581.19
Onida Cosely 1 30035.93
Tobin Roselli 2 17668.87
Vasily Danilyuk 4 55479.87
# RESOLUCIÓN ANALÍTICA
df_articulo_pais = my_df.groupby(['country_name', 'article_name']).sum()
paises = my_df.groupby('country_name').sum().index.values
df_ultpregu = pd.DataFrame(columns=['Artículo', 'Ventas'], index=paises)
for p in paises:
df_ulti = df_articulo_pais.loc[p]
tot = df_ulti.max()['total_amount']
arti = df_ulti[(df_ulti['total_amount'] == tot)].index[0]
df_ultpregu.loc[p] = {'Artículo': arti, 'Ventas': tot}
print(df_ultpregu)
# RESOLUCIÓN GRÁFICA
gra = sns.barplot(data = df_ultpregu, x = df_ultpregu.index, y = 'Ventas', hue = 'Artículo')
gra.set_xticklabels(labels=df_ultpregu.index, rotation=60, ha='right')
plt.title('Artículo más vendido (en monto) a cada pais')
plt.show()
Artículo Ventas
Argentina Full Pc 95751.45
Bolivia Full Pc 10639.05
Brazil Full Pc 134052.03
Chile Smartphone 6300.0
Colombia Full Pc 72345.54
Costa Rica Full Pc 23405.91
Ecuador Smartphone 7875.0
El Salvador Full Pc 40428.39
Guatemala Full Pc 27661.53
Honduras Notebook 14000.0
Mexico Notebook 44000.0
Paraguay Monitor 4370.0
Peru Full Pc 51067.44
Puerto Rico CPU 1256.58
Uruguay Full Pc 8511.24
Venezuela Full Pc 44684.01