# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
Collecting openpyxl==3.0.10
Downloading openpyxl-3.0.10-py2.py3-none-any.whl (242 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 242.1/242.1 KB 34.7 MB/s eta 0:00:00
Collecting et-xmlfile
Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)
Installing collected packages: et-xmlfile, openpyxl
Successfully installed et-xmlfile-1.1.0 openpyxl-3.0.10
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.
# Se instalan las librerías que van a utilizarse
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
sns.set_theme(style="whitegrid")
# 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)
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_name
seller_id
1 Aveline Swanwick
2 Jase Doy
3 Oliviero Charkham
4 Cornie Wynrehame
5 Ewell Peres
Formato del dataframe
(15, 1)
Búsqueda de valores nulos por columna
seller_name 0
dtype: int64
Formato de los datos por columna
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
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
article_id int64
article_name object
unit_price float64
dtype: object
# 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.columns
my_df2 = my_df.rename(columns={'week': 'Semana', 'quantity':'Cantidad',
'country_name':'País', 'article_name': 'Artículo', 'total_amount': 'Ventas', 'seller_name': 'Vendedor'})
my_df2.columns
# RESOLUCIÓN ANALÍTICA
df_cant_articulos = my_df2.groupby('Artículo').sum()
df_cant_articulos_ord = df_cant_articulos.sort_values('Cantidad', ascending=False)
df_reducido = df_cant_articulos_ord.head(6)
print(df_reducido)
Semana Cantidad Ventas
Artículo
HDD 113 413 22558.06
Tablet 90 374 48620.00
SDD 86 372 8184.00
Mouse 71 322 9756.60
Netbook 95 320 46400.00
Ram Memory 66 293 10533.35
# RESOLUCIÓN GRÁFICA
sns.barplot(y=df_reducido.index, x = df_reducido["Cantidad"], palette='Blues_d')
plt.xticks()
plt.title ('Artículos mas vendidos en unidades')
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_articulo_ord = my_df2.groupby('Artículo').sum().sort_values('Ventas', ascending=False).head(5)
print (df_monto_articulo_ord)
Semana Cantidad Ventas
Artículo
Full Pc 70 253 538335.93
Notebook 69 251 251000.00
Smartphone 74 290 152250.00
Chair 56 207 69477.48
Tablet 90 374 48620.00
sns.barplot(y=df_monto_articulo_ord['Ventas'], x = df_monto_articulo_ord.index, palette='Greens_d')
plt.xticks()
plt.title ('Artículos mas vendidos en dólares')
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_vendedor_ord = my_df2.groupby('Vendedor').sum().sort_values('Ventas', ascending=False)
print(df_monto_vendedor_ord[['Cantidad']+['Ventas']])
Cantidad Ventas
Vendedor
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
sns.barplot(y=df_monto_vendedor_ord.index, x = df_monto_vendedor_ord['Ventas'], palette='Greens_d')
plt.xticks()
plt.title ('Total ventas por vendedor')
plt.show()
# RESOLUCIÓN ANALÍTICA
df_venta_semanal = my_df2.groupby(by='Semana').sum()
print(df_venta_semanal)
Cantidad Ventas
Semana
1 2449 507458.81
2 2444 415364.44
3 2114 329140.03
4 1058 223844.56
#RESOLUCIÓN GRÁFICA
plt.bar(df_venta_semanal.index,df_venta_semanal['Ventas'], width=0.8)
plt.title ('Total ventas por semana')
plt.show()
print (my_df2.head())
Semana Cantidad País Artículo Ventas Vendedor
0 1 10 Peru Water Cooling 675.0 Cirilo Grandham
1 1 15 Peru Mouse 454.5 Ewell Peres
2 1 5 Bolivia Netbook 725.0 Janel O'Curran
3 1 9 Brazil Tablet 1170.0 Janel O'Curran
4 1 6 Mexico Case 227.4 Daisie Slograve
print (my_df2['País'].unique())
['Peru' 'Bolivia' 'Brazil' 'Mexico' 'Colombia' 'Honduras' 'Argentina'
'Venezuela' 'Costa Rica' 'El Salvador' 'Chile' 'Paraguay' 'Uruguay'
'Guatemala' 'Puerto Rico' 'Ecuador']
# RESOLUCIÓN
df_ventas_pais = my_df2.groupby(['País'])['Ventas'].sum()
df_ventas_pais
df_ventas_pais.sort_values(ascending=False)
plt.figure(figsize=(16,6))
sns.lineplot(data=df_ventas_pais, color='Red')
plt.title("Ventas por países en pesos")
df_pais_prod= my_df2.groupby(['País', 'Artículo'])['Ventas'].sum()
print(df_pais_prod)
País Artículo
Argentina CPU 14520.48
Case 758.00
Chair 2013.84
Desk 1170.90
Fan Cooler 199.75
...
Venezuela Smartphone 16800.00
Tablet 1950.00
Usb Cable 35.40
Water Cooling 202.50
Webcam 642.24
Name: Ventas, Length: 306, dtype: float64
df_pais_mas_vende= my_df2[(my_df2['País'] == 'Brazil')]
print(df_pais_mas_vende)
Semana Cantidad País Artículo Ventas Vendedor
3 1 9 Brazil Tablet 1170.00 Janel O'Curran
10 1 1 Brazil Sata Cable 2.14 Cirilo Grandham
14 1 15 Brazil Usb Cable 44.25 Milly Christoffe
15 1 11 Brazil Ram Memory 395.45 Cornie Wynrehame
16 1 6 Brazil Full Pc 12766.86 Arnold Kilkenny
.. ... ... ... ... ... ...
993 4 8 Brazil Chair 2685.12 Oliviero Charkham
995 4 1 Brazil Modem 67.50 Kati Innot
996 4 15 Brazil Heatsink 150.00 Daisie Slograve
998 4 14 Brazil Tablet 1820.00 Vasily Danilyuk
999 4 12 Brazil SDD 264.00 Onida Cosely
[315 rows x 6 columns]
df_producto= df_pais_mas_vende.groupby( ['Artículo'] ).sum().sort_values('Ventas', ascending=False)
df_grafico = df_producto.head(10)
print (df_grafico)
Semana Cantidad Ventas
Artículo
Full Pc 17 63 134052.03
Notebook 20 83 83000.00
Smartphone 19 79 41475.00
Chair 32 112 37591.68
Tablet 41 156 20280.00
Scanner 21 78 14430.00
Motherboard 34 101 13976.38
Desk 23 97 12619.70
Netbook 28 81 11745.00
CPU 16 82 11448.84
sns.barplot(x=df_grafico['Ventas'], y= df_grafico.index, palette='Reds_d')
plt.xticks()
plt.title ('Mayores ingresos por producto')
plt.show()
df_vendedor= df_pais_mas_vende.groupby( ['Vendedor'] ).sum().sort_values('Ventas', ascending=False)
df_vendedor_grafico = df_vendedor.head(10)
print (df_vendedor_grafico)
Semana Cantidad Ventas
Vendedor
Daisie Slograve 60 226 65283.28
Aveline Swanwick 66 227 58771.48
Arnold Kilkenny 47 184 47243.54
Kati Innot 52 151 32087.32
Tobin Roselli 54 211 31997.93
Janel O'Curran 49 182 31562.86
Onida Cosely 55 206 29354.31
Jase Doy 53 149 28493.25
Vasily Danilyuk 37 124 27495.77
Milly Christoffe 37 161 21247.38
sns.barplot(x=df_vendedor_grafico['Ventas'], y= df_vendedor_grafico.index, palette="mako")
plt.xticks()
plt.title ('Ventas por vendedor en Brasil')
plt.show()