# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install xlrd
!pip install openpyxl==3.0.10
# imports
import pandas as pd
import numpy as np
import sqlite3
import matplotlib.pyplot as plt
import seaborn as sns
import openpyxl
# Levanto los datos en 3 diferentes dataframes
df_orders = pd.read_csv('/work/data/orders.csv')
#print(dforders)
con = sqlite3.connect('/work/data/articles.db')
# Usa read_sql_query de pandas para extraer el resultado
# de la consulta a un DataFrame
df_articulos = pd.read_sql_query("SELECT * from articles", con)
#print (dfarticulos)
#leer excel
df_sellers = pd.read_excel(io = "/work/data/sellers.xlsx")
#print(df_sellers)
# EXPLORO LAS COLUMNAS DEL DF
print('\nDatos del Dataframe')
print (df_articulos.head())
print('\nColumnas del Dataframe')
print (df_articulos.columns)
# cuantos registros tiene el dataframe?
print('\nTotal de registros: ')
print(df_articulos['article_id'].count())
print('\nTipos de Datos:')
print (df_articulos.dtypes)
print('\nForma del dataframe:')
print (df_articulos.shape)
print('\nCantidad de Registros Nulos:')
print (df_articulos.isnull().sum())
Datos del Dataframe
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
Columnas del Dataframe
Index(['article_id', 'article_name', 'unit_price'], dtype='object')
Total de registros:
31
Tipos de Datos:
article_id int64
article_name object
unit_price object
dtype: object
Forma del dataframe:
(31, 3)
Cantidad de Registros Nulos:
article_id 0
article_name 0
unit_price 0
dtype: int64
# Exploración del df de vendedores
print('\nDatos del Dataframe')
print (df_orders.head)
# cuantos registros tiene el dataframe?
print('\nTotal de registros: ')
print(df_orders['order_id'].count())
print('\nForma del dataframe:')
print(df_orders.shape)
print('\nCantidad de Registros Nulos:')
print (df_orders.isnull().sum())
print('\nTipos de Datos:')
print (df_orders.dtypes)
# unir DF
#dftodo = pd.merge(dfarticulos, dforders, on='article_id')
Datos del Dataframe
<bound method NDFrame.head of 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
.. ... ... ... ... ... ...
995 16019 4 20021 1 7 Brazil
996 16020 4 20040 15 15 Brazil
997 16021 4 20040 2 11 Colombia
998 16022 4 20018 14 11 Brazil
999 16023 4 20026 12 9 Brazil
[1000 rows x 6 columns]>
Total de registros:
1000
Forma del dataframe:
(1000, 6)
Cantidad de Registros Nulos:
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Tipos de Datos:
order_id int64
week int64
article_id int64
quantity int64
seller_id int64
country_name object
dtype: object
# Exploración del df de órdenes
print('\nDatos del Dataframe')
print (df_sellers.head())
print('\nColumnas del Dataframe')
print (df_sellers.columns)
# cuantos registros tiene el dataframe?
print('\nTotal de registros: ')
print(df_sellers['seller_id'].count())
print('\nTipos de Datos:')
print (df_sellers.dtypes)
print('\nForma del dataframe:')
print (df_sellers.shape)
print('\nCantidad de Registros Nulos:')
print (df_sellers.isnull().sum())
Datos del Dataframe
seller_id seller_name
0 1 Aveline Swanwick
1 2 Jase Doy
2 3 Oliviero Charkham
3 4 Cornie Wynrehame
4 5 Ewell Peres
Columnas del Dataframe
Index(['seller_id', 'seller_name'], dtype='object')
Total de registros:
15
Tipos de Datos:
seller_id int64
seller_name object
dtype: object
Forma del dataframe:
(15, 2)
Cantidad de Registros Nulos:
seller_id 0
seller_name 0
dtype: int64
# cambiar el tipo de datos de la columa unit_price
df_articulos['unit_price'] = df_articulos['unit_price'].astype(float)
print(df_articulos)
print (df_articulos.dtypes)
#Darle formato con decimales
pd.options.display.float_format = '{:,.2f}'.format
print(df_articulos['unit_price'])
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
5 20020 Chair 335.64
6 20021 Modem 67.50
7 20022 Range Extender 20.45
8 20023 Notebook 1000.00
9 20024 Netbook 145.00
10 20025 HDD 54.62
11 20026 SDD 22.00
12 20027 Ram Memory 35.95
13 20028 Motherboard 138.38
14 20029 Mouse 30.30
15 20030 Fan Cooler 4.25
16 20031 Webcam 20.07
17 20032 Keyboard 22.60
18 20033 Headphones 23.30
19 20034 Scanner 185.00
20 20035 Case 37.90
21 20036 Video Card 131.50
22 20037 CPU 139.62
23 20038 Power Supply 43.95
24 20039 Water Cooling 67.50
25 20040 Heatsink 10.00
26 20041 Usb Cable 2.95
27 20042 Sata Cable 2.14
28 20043 Pci Express Port 10.12
29 20044 Wi-Fi Card 59.61
30 20045 Mesh Wi-Fi X 2 32.50
article_id int64
article_name object
unit_price float64
dtype: object
0 525.00
1 2,127.81
2 230.00
3 130.00
4 130.10
5 335.64
6 67.50
7 20.45
8 1,000.00
9 145.00
10 54.62
11 22.00
12 35.95
13 138.38
14 30.30
15 4.25
16 20.07
17 22.60
18 23.30
19 185.00
20 37.90
21 131.50
22 139.62
23 43.95
24 67.50
25 10.00
26 2.95
27 2.14
28 10.12
29 59.61
30 32.50
Name: unit_price, dtype: float64
# Armar un df haciendo joins con los dataframes originales
my_df1 = pd.merge(df_articulos, pd.merge(df_sellers, df_orders, on='seller_id'), on='article_id')
# Crear una nueva columna para obtener el monto total
my_df1['total_amount'] = my_df1['quantity'] * my_df1['unit_price']
# Dejar en my_df solamente las columnas que voy a necesitar
my_df = my_df1[['week'] + ['article_name']+ ['quantity'] + ['seller_name'] + ['country_name'] + ['total_amount']]
print (my_df)
week article_name quantity seller_name country_name \
0 3 Smartphone 8 Aveline Swanwick Colombia
1 1 Smartphone 1 Jase Doy Brazil
2 2 Smartphone 10 Oliviero Charkham Ecuador
3 3 Smartphone 12 Oliviero Charkham Venezuela
4 3 Smartphone 3 Oliviero Charkham Brazil
.. ... ... ... ... ...
995 2 Mesh Wi-Fi X 2 12 Arnold Kilkenny Argentina
996 3 Mesh Wi-Fi X 2 6 Arnold Kilkenny Mexico
997 4 Mesh Wi-Fi X 2 7 Arnold Kilkenny Argentina
998 3 Mesh Wi-Fi X 2 13 Janel O'Curran Honduras
999 3 Mesh Wi-Fi X 2 2 Daisie Slograve Honduras
total_amount
0 4,200.00
1 525.00
2 5,250.00
3 6,300.00
4 1,575.00
.. ...
995 390.00
996 195.00
997 227.50
998 422.50
999 65.00
[1000 rows x 6 columns]
# RESOLUCIÓN ANALÍTICA
# Armar un df con los datos agrupados por nombre de artículo
df_ventaarticulos = my_df.groupby(['article_name'], as_index= False)['quantity'].sum()
# Obtener el top 10 de art mas vendidos ordenado por cantidad
df_top10articulos = df_ventaarticulos.sort_values('quantity', ascending= False).head(10)
print (df_top10articulos)
df_articulomasvendido = df_ventaarticulos.sort_values('quantity', ascending= False).head(1)
print('\nArtículo mas Vendido:')
print(df_articulomasvendido)
article_name quantity
6 HDD 413
25 Tablet 374
21 SDD 372
14 Mouse 322
15 Netbook 320
19 Ram Memory 293
13 Motherboard 291
17 Pci Express Port 291
24 Smartphone 290
20 Range Extender 281
Artículo mas Vendido:
article_name quantity
6 HDD 413
# RESOLUCIÓN GRÁFICA
sns.barplot(x='quantity', y='article_name', data=df_top10articulos, orient='h')
plt.title('Top 10 de Artículos mas Vendidos', size = 20)
plt.ylabel('Artículo', size=1)
plt.xlabel('Unidades Vendidas', size=10)
plt.show()
# RESOLUCIÓN ANALÍTICA
# Armar un df con los datos de ventas agrupados por nombre de artículo
df_ingresosarticulos = my_df.groupby(['article_name'], as_index= False)['total_amount'].sum()
# obtener el top 10 de articulos con mas monto de ventas
df_top10ventasart =df_ingresosarticulos.sort_values('total_amount', ascending= False).head(10)
print(df_top10ventasart)
df_top1ventasart = df_top10ventasart.sort_values('total_amount', ascending= False).head(1)
print('\nArtículo mas Vendido:')
print(df_top1ventasart)
article_name total_amount
5 Full Pc 538,335.93
16 Notebook 251,000.00
24 Smartphone 152,250.00
2 Chair 69,477.48
25 Tablet 48,620.00
12 Monitor 47,840.00
15 Netbook 46,400.00
23 Scanner 40,885.00
13 Motherboard 40,268.58
0 CPU 37,138.92
Artículo mas Vendido:
article_name total_amount
5 Full Pc 538,335.93
# RESOLUCIÓN GRÁFICA
#sns.barplot(x="total_amount", y="article_name", data=df_arting10, orient='h')
sns.barplot(y="total_amount", x="article_name", data=df_top10ventasart)
plt.title('Top 10 de Venta de Artículos', size = 20)
plt.ylabel('Monto', size=10)
plt.xlabel('Artículos', size=10)
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
df_porvendedor = my_df.groupby(['seller_name'], as_index= False)['total_amount'].sum()
df_top10vendedor = df_porvendedor.sort_values('total_amount', ascending= False).head(10)
print (df_top10vendedor)
df_top1vendedor = df_porvendedor.sort_values('total_amount', ascending= False).head(1)
print('\nVendedor al que corresponde el Bono:')
print(df_top1vendedor)
seller_name total_amount
7 Janel O'Curran 192,832.47
2 Brockie Patience 142,709.88
11 Oliviero Charkham 141,329.76
14 Vasily Danilyuk 129,157.55
5 Daisie Slograve 120,520.11
1 Aveline Swanwick 118,874.33
0 Arnold Kilkenny 94,552.04
9 Kati Innot 83,704.62
8 Jase Doy 80,628.31
6 Ewell Peres 78,144.32
Vendedor al que corresponde el Bono:
seller_name total_amount
7 Janel O'Curran 192,832.47
# RESOLUCIÓN GRÁFICA
sns.barplot(y='seller_name', x='total_amount', data=df_top10vendedor, )
plt.title('Top 10 de Vendedores', size = 20)
plt.ylabel('Vendedor', size=10)
plt.xlabel('Total de Ventas', size=10)
# RESOLUCIÓN ANALÍTICA
# Obtener en un DF las ventas agrupadas por semana
df_porsemana = my_df.groupby(['week'], as_index= False)['total_amount'].sum()
print (df_porsemana)
# Agregar columna con el % de ventas por semana en función al total
df_porsemana['Porcentaje (%)'] = df_porsemana['total_amount'] / df_porsemana['total_amount'].sum() * 100
#df_porsemana['%'] = df_porsemana['%'].astype(float)
print (df_porsemana)
print ('\nLa campaña se debe lanzar en la última semana porque es la que tiene el % menor de ventas del mes')
week total_amount
0 1 507,458.81
1 2 415,364.44
2 3 329,140.03
3 4 223,844.56
week total_amount Porcentaje (%)
0 1 507,458.81 34.39
1 2 415,364.44 28.14
2 3 329,140.03 22.30
3 4 223,844.56 15.17
La campaña se debe lanzar en la última semana porque es la que tiene el % menor de ventas del mes
# RESOLUCIÓN GRÁFICA
sns.barplot(y='total_amount', x='week', data=df_porsemana,)
plt.xlabel('Semanas', size=16)
plt.ylabel('Monto', size=1)
#'$ {:,.2f}'.format
#yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
#plt.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
plt.title('Ventas del Mes Agrupada por Semana', size = 20)
plt.show()
destacar = (0, 0, 0, 0.2)
plt.pie(df_porsemana['total_amount'], labels=df_porsemana['week'], autopct="%0.1f %%", explode=destacar)
plt.title('Ventas del Mes Agrupadas por Semana', size = 20)
plt.show()
# RESOLUCIÓN ANALÍTICA
# Agrupar ventas por país
df_porpais = my_df.groupby(['country_name'], as_index= False)['total_amount'].sum()
# Agregar columna de % al df
df_porpais['%'] = df_porpais['total_amount'] / df_porpais['total_amount'].sum() * 100
df_top5paisesmenosventas = df_porpais.sort_values('total_amount', ascending= False).tail(5)
print (df_top5paisesmenosventas.sort_values('total_amount'))
# RESOLUCIÓN GRÁFICA
sns.barplot(y='country_name', x='total_amount', data=df_top5paisesmenosventas, )
plt.title('5 Paises con Menos Ventas', size = 20)
plt.ylabel('País', size=10)
plt.xlabel('Total de Ventas', size=10)
country_name total_amount %
13 Puerto Rico 1,265.43 0.09
11 Paraguay 8,195.12 0.56
6 Ecuador 17,475.30 1.18
14 Uruguay 17,843.09 1.21
1 Bolivia 22,682.80 1.54
# RESOLUCIÓN
df_ventasnotebookargentina = my_df.query('article_name== "HDD" and country_name == "Argentina"')
#print(df_ventasnotebookargentina)
df_evolucion = df_ventasnotebookargentina.groupby(['week'], as_index= False)['quantity'].sum()
print (df_evolucion)
#df_evolucion2 = my_df.groupby(['week'], as_index= False)['quantity'].sum().query('article_name== "Notebook" and country_name == "Argentina"')
#print (df_evolucion)
#df_evolucion.drop(['article_name', 'country_name'], axis= 'columns', inplace=True)
#print(df_evolucion)
#print(df_evolucion2)
# RESOLUCIÓN GRÁFICA
sns.barplot(y='quantity', x='week', data=df_evolucion, )
plt.title('Cantidad de "HDD" Vendidas por Semana en Argentina', size = 20)
plt.ylabel('Cantidad', size=10)
plt.xlabel('Semana', size=10)
plt.show()
week quantity
0 2 43
1 3 24
2 4 1
# RESOLUCIÓN
# Crear DF agrupando por semana y vendedor
#df_porsemana = my_df.groupby(['seller_name','week'])['total_amount'].sum()
df_porsemana = df_ventasnotebookargentina.groupby(['week','seller_name'], as_index= False)['quantity'].sum()
print (df_porsemana.sort_values('week'))
df_pivot = df_porsemana.pivot(index='week', columns='seller_name', values='quantity')
#print (df_pivot)
df_pivot.plot.bar(stacked=True)
plt.title('Cantidad de "HDD"" Vendidas por Semana y Vendedor en Argentina', size = 20)
plt.ylabel('Cantidad', size=10)
plt.xlabel('Semana', size=10)
plt.legend(title='Vendedor')
plt.xticks(rotation=0)
plt.show()
week seller_name quantity
0 2 Janel O'Curran 12
1 2 Tobin Roselli 19
2 2 Vasily Danilyuk 12
3 3 Aveline Swanwick 9
4 3 Jase Doy 15
5 4 Vasily Danilyuk 1