# 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 14.8 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.
# imports
import numpy as np
import pandas as pd
import sqlite3 as sql3
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'])
print(df_articles)
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
# VENDEDORES
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
print(df_sellers)
seller_name
seller_id
1 Aveline Swanwick
2 Jase Doy
3 Oliviero Charkham
4 Cornie Wynrehame
5 Ewell Peres
6 Milly Christoffe
7 Kati Innot
8 Tobin Roselli
9 Onida Cosely
10 Cirilo Grandham
11 Vasily Danilyuk
12 Brockie Patience
13 Arnold Kilkenny
14 Janel O'Curran
15 Daisie Slograve
# ÓRDENES
df_orders=pd.read_csv('/work/data/orders.csv')
print(df_orders)
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]
# Exploración del df de artículos
print('Muestra de los datos')
print(df_articles.head())
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBúsqueda de valores nulos')
print(df_articles.isnull().sum())
print('\nFormato de los datos por columna')
print(df_articles.dtypes)
Muestra de los 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
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 los datos')
print(df_sellers.head())
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBúsqueda de valores nulos')
print(df_sellers.isnull().sum())
print('\nFormato de los datos por columna')
print(df_sellers.dtypes)
Muestra de los 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
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 los datos')
print(df_orders.head())
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBúsqueda de valores nulos')
print(df_orders.isnull().sum())
print('\nFormato de los datos por columna')
print(df_orders.dtypes)
Muestra de los 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
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
# cambio el tipo de dato de 'unit_price' a float
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
# cambio el índice del df_articles por la columna article_id
df_articles.set_index('article_id', inplace=True)
print(df_articles.head())
article_name unit_price
article_id
20015 Smartphone 525.00
20016 Full Pc 2127.81
20017 Monitor 230.00
20018 Tablet 130.00
20019 Desk 130.10
# creo una copia del df_orders
my_df = df_orders.copy()
# agrego algunas columnas extra que necesito y las lleno con los códigos id que las vinculan con los otros df
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'])
print(my_df.head())
order_id week article_id quantity seller_id country_name article_name \
0 15024 1 20039 10 10 Peru 20039
1 15025 1 20029 15 5 Peru 20029
2 15026 1 20024 5 14 Bolivia 20024
3 15027 1 20018 9 14 Brazil 20018
4 15028 1 20035 6 15 Mexico 20035
total_amount seller_name
0 20039 10
1 20029 5
2 20024 14
3 20018 14
4 20035 15
# Reemplazo los valores en las nuevas columnas del df
for i in range(len(my_df.index)):
article = df_articles.loc[my_df.loc[i]['article_name']]['article_name']
my_df.loc[i,'article_name'] = article
my_df.loc[i,'total_amount'] = my_df.loc[i,'quantity'] * df_articles.loc[my_df.loc[i]['total_amount']]['unit_price']
my_df.loc[i,'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_name']]['seller_name']
print(my_df.head())
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
article_name total_amount seller_name
0 Water Cooling 675.0 Cirilo Grandham
1 Mouse 454.5 Ewell Peres
2 Netbook 725.0 Janel O'Curran
3 Tablet 1170.0 Janel O'Curran
4 Case 227.4 Daisie Slograve
# Borrar las columnas que no voy a utilizar
my_df.drop(['order_id','article_id','seller_id'], axis='columns', inplace=True)
print(my_df.head())
week quantity country_name article_name total_amount seller_name
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
d1=pd.DataFrame({'mes': ['ene','feb','mar','abr'], 'ventas':[10,20,30,15]})
d2=pd.DataFrame({'mes': ['ene','feb','mar','abr'], 'costos':[7,16,25,12]})
print(pd.merge(d1,d2))
mes ventas costos
0 ene 10 7
1 feb 20 16
2 mar 30 25
3 abr 15 12
print(my_df.head())
week quantity country_name article_name total_amount seller_name
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
# RESOLUCIÓN ANALÍTICA
df2 = my_df.groupby('article_name').sum()
por_cant = df2.sort_values('quantity', ascending=False)
print('Respuesta:')
print('El artículo mejor vendido es:')
print(por_cant['quantity'].head(1))
print('Los artículos más vendidos son:')
print(df2.head())
Respuesta:
El artículo mejor vendido es:
article_name
HDD 413
Name: quantity, dtype: int64
Los artículos más vendidos son:
week quantity total_amount
article_name
CPU 66 266 37138.92
Case 54 206 7807.40
Chair 56 207 69477.48
Desk 60 223 29012.30
Fan Cooler 64 205 871.25
# RESOLUCIÓN GRÁFICA
sns.barplot(x=df2.index,y=df2['quantity'],data=df2,order=df2.sort_values('quantity', ascending=False).index)
plt.xticks(rotation=90)
plt.title('Articulos mejor vendidos')
plt.show()
# RESOLUCIÓN ANALÍTICA
df3=(my_df.groupby('article_name').sum()).sort_values('total_amount', ascending=False).head(5)
print('Respuesta:')
print('Los artículos que generaron mayores ingresos:')
print(df3['total_amount'])
Respuesta:
Los artículos que generaron mayores ingresos:
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
plt.pie(x=df3['total_amount'],labels=df3.index)
plt.title('Articulos que generaron mayores ingresos')
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 =(my_df.groupby('seller_name').sum()).sort_values('total_amount', ascending=False)
print('Respuesta:')
print('El mejor vendedor del mes es')
print( df4.head(1) )
print()
print('Seguido por:')
print(df4[['quantity']+['total_amount']])
Respuesta:
El mejor vendedor del mes es
week quantity total_amount
seller_name
Janel O'Curran 174 703 192832.47
Seguido por:
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
plt.bar(df4.index, df4['total_amount'])
plt.xticks(rotation=60)
plt.title('Mejores vendedores')
plt.xlabel('Vendedores')
plt.ylabel('Total Ventas')
plt.show()
# RESOLUCIÓN ANALÍTICA
df5 = (my_df.groupby('week').sum()).sort_values('total_amount',ascending=False)
print('Respuesta:')
print('Las ventarían a lo largo del mes de la siguiente forma:')
print(df5)
Respuesta:
Las ventarían a lo largo del mes de la siguiente forma:
quantity total_amount
week
1 2449 507458.81
2 2444 415364.44
3 2114 329140.03
4 1058 223844.56
# BY Yann
plt.barh(df5.index, df5["total_amount"])
plt.title('Variaciones de Ventas Mensual')
plt.xlabel('Total Ventas')
plt.ylabel('Semanas')
plt.show()
# RESOLUCIÓN
df7=(my_df.groupby('country_name').sum()).sort_values('total_amount', ascending=False).head(5)
print('Respuesta:')
print()
print('El país que mayor ingresos generó es:')
print()
print(df7.head(1))
print()
print('Paises que generaron mayores ingresos:')
print()
print(df7['total_amount'])
Respuesta:
El país que mayor ingresos generó es:
week quantity total_amount
country_name
Brazil 717 2515 441271.85
Paises que generaron mayores ingresos:
country_name
Brazil 441271.85
Argentina 205832.78
Colombia 177514.29
Peru 161421.12
Mexico 138619.99
Name: total_amount, dtype: float64
# RESOLUCIÓN GRÁFICA
plt.pie(x=df7['total_amount'],labels=df7.index)
plt.title('Países que generaron mayores ingresos')
plt.show()
# RESOLUCIÓN
df8=(my_df.groupby('country_name').sum()).sort_values('quantity', ascending=False).head(10)
print('Respuesta:')
print()
print('El país que comercializó mayor cantidad de unidades es:')
print(df8.head(1))
print()
print('Seguido por:')
print( df8['quantity'] )
Respuesta:
El país que comercializó mayor cantidad de unidades es:
week quantity total_amount
country_name
Brazil 717 2515 441271.85
Seguido por:
country_name
Brazil 2515
Peru 1027
Argentina 947
Colombia 881
Mexico 846
Venezuela 320
Honduras 303
Chile 231
Guatemala 202
Bolivia 181
Name: quantity, dtype: int64
plt.barh(df8.index, df8["quantity"])
plt.title('Países que comercializó más unidades')
plt.xlabel('Unidades vendidas')
plt.ylabel('Países')
plt.show()
# RESOLUCIÓN ANALÍTICA
df9 =(my_df.groupby('seller_name').sum()).sort_values('quantity', ascending=False)
print('Respuesta:')
print('Los ejecutivos que vendieron mayor cantidad de unidades son:')
print(df9.head(3) )
print()
print('Seguidos por:')
print(df9[['quantity']+['total_amount']])
Respuesta:
Los ejecutivos que vendieron mayor cantidad de unidades son:
week quantity total_amount
seller_name
Janel O'Curran 174 703 192832.47
Aveline Swanwick 182 629 118874.33
Arnold Kilkenny 143 583 94552.04
Seguidos por:
quantity total_amount
seller_name
Janel O'Curran 703 192832.47
Aveline Swanwick 629 118874.33
Arnold Kilkenny 583 94552.04
Jase Doy 582 80628.31
Oliviero Charkham 555 141329.76
Daisie Slograve 554 120520.11
Onida Cosely 535 77373.37
Cornie Wynrehame 523 52253.57
Vasily Danilyuk 521 129157.55
Tobin Roselli 519 56984.42
Kati Innot 512 83704.62
Ewell Peres 496 78144.32
Cirilo Grandham 470 45009.40
Milly Christoffe 442 61733.69
Brockie Patience 441 142709.88
# RESOLUCIÓN GRÁFICA
sns.barplot(x=df9.index,y=df9['quantity'],data=df9,order=df9.sort_values('quantity', ascending=False).index)
plt.xticks(rotation=45)
plt.title('Cantidad de unidades vendidas')
plt.show()
# RESOLUCIÓN ANALÍTICA
df10 =(my_df.groupby('seller_name').sum()).sort_values('total_amount', ascending=False)
print('Respuesta:')
print('Los vendedores que generaron mayores ingresos:')
print(df10.head(3) )
print()
print('Seguidos por:')
print()
print(df10[['quantity']+['total_amount']])
Respuesta:
Los vendedores que generaron mayores ingresos:
week quantity total_amount
seller_name
Janel O'Curran 174 703 192832.47
Brockie Patience 125 441 142709.88
Oliviero Charkham 167 555 141329.76
Seguidos por:
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
sns.barplot(x=df10.index,y=df10['total_amount'],data=df10,order=df10.sort_values('total_amount', ascending=False).index)
plt.xticks(rotation=45)
plt.title('Vendores que generaron mayores ingresos')
plt.show()