# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
# 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)
# 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)
# 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)
df_articles['unit_price']=df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
#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) )
# 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))
# 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))
# 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']])
# 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']])
# 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))
# RESOLUCIÓN
sns.boxplot( x = "Total facturado", data = df_monto_país_ord)