# 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
# 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)
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
#pd.set_option('precision',2)
# 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 aservir 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
for i in range(len(my_df.index)):
# Obtenemos article_name
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,'Articulo'] = nombreArticulo
# Obtenemos total_amount
precioArticulo = df_artic.loc[id_articulo]['unit_price']
my_df.loc[i, 'Total facturado'] = 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, 'Vendedor'] = nombreVendedor
# elimino las columnas que no necesito
my_df.drop(['order_id', 'article_id', 'seller_id'], axis = 'columns', inplace=True)
my_df.dtypes
pd.options.display.float_format = '$ {:,.2f}'.format
# RESOLUCIÓN ANALÍTICA
df_cant_articulos = my_df.groupby('Articulo').sum()
df_cant_articulos_ord = df_cant_articulos.sort_values('quantity', ascending=False)
print('El artículo más vendido fue:')
print(df_cant_articulos_ord['quantity'].head(1) )
El artículo más vendido fue:
Articulo
HDD 413
Name: quantity, dtype: int64
# RESOLUCIÓN GRÁFICA
sns.barplot(y = df_cant_articulos_ord["quantity"], x=df_cant_articulos_ord.index).set(title='Cantidad de artículos vendidos',ylabel='cantidad')
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_articulo_ord = my_df.groupby('Articulo').sum().sort_values('Total facturado', ascending=False)
print(df_monto_articulo_ord.head(1))
week quantity article_name total_amount seller_name \
Articulo
Full Pc 70 253 680544 680544 288
Total facturado
Articulo
Full Pc $ 538,335.93
# RESOLUCIÓN GRÁFICA
plt.barh(df_monto_articulo_ord.index, df_monto_articulo_ord['Total facturado'], height=0.6)
plt.xlabel('Total facturado')
plt.ylabel('Artículo')
plt.title('Monto facturado de los artículos vendidos', fontsize=15)
plt.tick_params(axis="y", labelsize=7)
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_vendedor_ord = my_df.groupby('Vendedor').sum().sort_values('Total facturado', ascending=False)
print('El mejor vendedor del mes fue:', df_monto_vendedor_ord[['quantity']+['Total facturado']].head(1))
El mejor vendedor del mes fue: quantity Total facturado
Vendedor
Janel O'Curran 703 $ 192,832.47
# RESOLUCIÓN GRÁFICA
plt.bar(df_monto_vendedor_ord.index, df_monto_vendedor_ord['Total facturado'])
plt.xticks(rotation=45, ha="right")
plt.xlabel('Vendedores')
plt.ylabel('Monto facturado (en $)')
plt.title('Monto facturado según vendedor', fontsize=15)
plt.show()
# RESOLUCIÓN ANALÍTICA
df_venta_semanal = my_df.groupby(by='week').sum().sort_values('Total facturado',ascending=False)
print(df_venta_semanal[['quantity'] + ['Total facturado']])
quantity Total facturado
week
1 2449 $ 507,458.81
2 2444 $ 415,364.44
3 2114 $ 329,140.03
4 1058 $ 223,844.56
# RESOLUCIÓN GRÁFICA
plt.bar(df_venta_semanal.index,df_venta_semanal['Total facturado'], width=0.8)
semana=[1,2,3,4]
plt.xlabel('semana')
plt.ylabel('Monto facturado (en $)')
plt.title('Monto facturado según semana', fontsize=15)
plt.xticks(semana)
plt.show()
En la información disponible, tanto en los valores como en el gráfico, se observa que el monto facturado decrece a medida que avanza el mes. En la última semana se vende menos de la mitad que en la primera. Parece importante nivelar el ingreso a través de las semanas, por eso entiendo que sería aconsejable pensar en promociones en la tercera y cuarta semana del mes
# RESOLUCIÓN
df_mejorVendedor = my_df[(my_df['Vendedor'] == "Janel O'Curran") ]
df_Venta_por_semana= df_mejorVendedor.groupby('week').sum()
print(df_Venta_por_semana[['quantity']+['Total facturado']])
quantity Total facturado
week
1 211 $ 68,273.51
2 185 $ 45,775.99
3 236 $ 46,716.37
4 71 $ 32,066.60
# RESOLUCIÓN
df_monto_país_ord = my_df.groupby('country_name').sum().sort_values('Total facturado', ascending=False)
print('El país que más compró es:')
print( df_monto_país_ord[['quantity']+['Total facturado']].head(1))
El país que más compró es:
quantity Total facturado
country_name
Brazil 2515 $ 441,271.85
# RESOLUCIÓN
sns.boxplot( x = "Total facturado", data = df_monto_país_ord)