# 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'])
#df_articles
#Vendedores
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
#df_sellers
#Órdenes
df_orders = pd.read_csv('/work/data/orders.csv')
#df_orders
# Exploración del df de artículos
print('Muestra de datos')
print(df_articles.head()) #Muestra las primeras 5 filas
print('\nForma del dataframe')
print(df_articles.shape)
print('\nBuscar valores nulos')
print(df_articles.isnull().sum())
print('\nFormato de los datos del dataframe')
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
Forma del dataframe
(31, 3)
Buscar valores nulos
article_id 0
article_name 0
unit_price 0
dtype: int64
Formato de los datos del dataframe
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()) #Muestra las primeras 5 filas
print('\nForma del dataframe')
print(df_sellers.shape)
print('\nBuscar valores nulos')
print(df_sellers.isnull().sum())
print('\nFormato de los datos del dataframe')
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
Forma del dataframe
(15, 1)
Buscar valores nulos
seller_name 0
dtype: int64
Formato de los datos del dataframe
seller_name object
dtype: object
# Exploración del df de órdenes
print('Muestra de datos')
print(df_orders.head()) #Muestra las primeras 5 filas
print('\nForma del dataframe')
print(df_orders.shape)
print('\nBuscar valores nulos')
print(df_orders.isnull().sum())
print('\nFormato de los datos del dataframe')
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
Forma del dataframe
(1000, 6)
Buscar valores nulos
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Formato de los datos del dataframe
order_id int64
week int64
article_id int64
quantity int64
seller_id int64
country_name object
dtype: object
# Cambiar a float los precios unitarios
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 indice del df_articles
df_articles.set_index('article_id', inplace=True)
# Agrego 3 columnas y pongo el campo que me va a servir de "ancla" para buscar la información real.
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(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
#Reemplazar los valores reales en el df
for i in range (len(my_df.index)): #len(my_df.index) devuelva la cantidad de filas (registros)
#reemplazo el nombre del articulo usando el id guardado en my_df
article = df_articles.loc[my_df.loc[i]['article_id']]['article_name']
my_df.loc[i, 'article_name'] = article
#reemplazo el nombre del vendedor usando el id guardado en my_df
my_df.loc[i, 'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_id']]['seller_name']
#busco el pecio unitario y lo multiplico por la cantidad de unidades vendidas.
my_df.loc[i, 'total_amount'] = df_articles.loc[my_df.loc[i]['article_id']]['unit_price'] * my_df.loc[i, 'quantity']
#elimino las columnas que no utilizo
my_df.drop(['article_id', 'seller_id', 'order_id'], axis='columns', inplace=True)
my_df
weekint64
1 - 4
quantityint64
1 - 15
0
1
10
1
1
15
2
1
5
3
1
9
4
1
6
5
1
6
6
1
13
7
1
14
8
1
7
9
1
4
# RESOLUCIÓN ANALÍTICA
my_df1 = my_df.groupby('article_name').sum()
por_cantidad = my_df1.sort_values('quantity',ascending=False)
print('El artículo más vendido es el',por_cantidad['quantity'].head(1).index[0], 'con',por_cantidad['quantity'].head(1)[0],'unidades vendidas.')
El artículo más vendido es el HDD con 413 unidades vendidas.
# RESOLUCIÓN GRÁFICA
sns.barplot(x=my_df1.index, y=my_df1['quantity'], data = my_df1, order = my_df1.sort_values('quantity', ascending=False).index).set(title='Ventas por Artículo')
plt.xticks(rotation = 90)
plt.xlabel('Artículo')
plt.ylabel('Unidades vendidas')
plt.show()
plt.figure(figsize=(5,15))
plt.barh(por_cantidad.index,por_cantidad['quantity'], color='darkblue', alpha = 0.8)
plt.xlabel('Unidades vendidas')
plt.ylabel('Artículo')
plt.title('Ventas por Artículo')
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
mas_ingresos = my_df2.sort_values('total_amount',ascending=False).head()
print('El artículo que más ingresos proporcionó fue el',mas_ingresos['total_amount'].head(1).index[0],'con un monto de $',round(mas_ingresos['total_amount'].head(1)[0]),'.')
#print(mas_ingresos)
El artículo que más ingresos proporcionó fue el Full Pc con un monto de $ 538336 .
# RESOLUCIÓN GRÁFICA
#Sólo graficamos los 5 primeros productos. Si ponemos el porcentaje de cada uno en el gráfico no sería el número real.
plt.pie(x=mas_ingresos['total_amount'], labels = mas_ingresos.index)
plt.title('Ingresos por Producto - Top 5 Productos')
plt.show()
# RESOLUCIÓN ANALÍTICA
#groupby por vendedor
df3 = my_df.groupby('seller_name').sum().sort_values('total_amount', ascending=False)
print('Debe otorgarse el bono por Mejor Vendedor del Mes a',df3[['quantity']+['total_amount']].head(1).index[0], 'por haber logrado un monto total de ventas de $',round(df3['total_amount'].head(1)[0]))
Debe otorgarse el bono por Mejor Vendedor del Mes a Janel O'Curran por haber logrado un monto total de ventas de $ 192832
# RESOLUCIÓN GRÁFICA
plt.bar(df3.index,df3['total_amount'])
plt.xticks(rotation=75)
plt.title('Montos de Venta por Vendedor')
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 = my_df.groupby('week').sum().sort_values('total_amount', ascending=False)
print(df4)
print('La campaña de promociones debería lanzarse en la semana',df4.index[0],'del mes.')
quantity total_amount
week
1 2449 507458.81
2 2444 415364.44
3 2114 329140.03
4 1058 223844.56
La campaña de promociones debería lanzarse en la semana 1 del mes.
# RESOLUCIÓN GRÁFICA
plt.bar(df4.index,df4['total_amount'])
plt.title('Montos de Venta por Semana')
plt.xlabel('Semana')
plt.ylabel('Monto de Venta')
plt.show()
# RESOLUCIÓN
df5 = my_df.groupby('country_name').sum().sort_values('total_amount', ascending=False)
#print(df5)
print('El país que obtuvo el mayor monto total por ventas fue',df5.index[0],'con un monto total de $',round(df5['total_amount'].head(1)[0]))
plt.bar(df5.index,df5['total_amount'])
plt.xticks(rotation=90)
plt.title('Montos de Venta por País')
plt.show()
El país que obtuvo el mayor monto total por ventas fue Brazil con un monto total de $ 441272
# RESOLUCIÓN
df6 = my_df.groupby('seller_name').sum().sort_values('week', ascending=False)
print(df6.head())
print(df6.index[0], 'trabajó como vendedor durante',df6['week'].head(1)[0],'semanas.')
week quantity total_amount
seller_name
Aveline Swanwick 182 629 118874.33
Janel O'Curran 174 703 192832.47
Oliviero Charkham 167 555 141329.76
Daisie Slograve 162 554 120520.11
Jase Doy 160 582 80628.31
Aveline Swanwick trabajó como vendedor durante 182 semanas.
# RESOLUCIÓN
df7 = my_df.groupby('seller_name').sum().sort_values('quantity', ascending=False)
#print(df7.head())
print(df7.index[0],'vendió la mayor cantidad de artículos. Vendió',df7['quantity'].head(1)[0],'artículos.')
Janel O'Curran vendió la mayor cantidad de artículos. Vendió 703 artículos.