# 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
# Articulos
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)
# Ordenes
df_orders = pd.read_csv('/work/data/orders.csv')
# Exploración del df de artículos
print("Muestra de datos")
print(df_articles.head()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBusqueda de valores nulls 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()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBusqueda de valores nulls 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()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBusqueda de valores nulls 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)
my_df = pd.merge(df_orders, df_articles, on = 'article_id', how = 'left').merge(df_sellers, on = 'seller_id', how = 'left')
my_df['total_amount'] = my_df['quantity']*my_df['unit_price']
my_df.drop(['order_id', 'article_id', 'seller_id','unit_price'], axis='columns', inplace=True)
my_df = my_df.reindex(columns=['week', 'quantity', 'article_name', 'total_amount','seller_name','country_name'])
print(my_df.head())
# RESOLUCIÓN ANALÍTICA
df7 = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False).rename(columns={'quantity':'Cantidad', 'total_amount' : 'Cantidad Total'})
#pd.options.display.float_format= '$ {:,.2f}'.format
# print(df7[['quantity']].head())
print(df7[['Cantidad','Cantidad Total']].head())
df7graf = df7[['Cantidad','Cantidad Total']].head()
sns.barplot(data=df7graf, x=df7graf.index, y='Cantidad', palette='Paired_r')
plt.suptitle('Articulos mas vendidos por cantidad')
# RESOLUCIÓN ANALÍTICA
df2 = my_df[['article_name','total_amount','quantity']].groupby(by='article_name').sum().sort_values('total_amount', ascending=False).head()
pd.options.display.float_format= '$ {:,.2f}'.format
print(df2)
# RESOLUCIÓN GRÁFICA
exp = [0.05, 0, 0, 0, 0]
plt.pie(x=df2['total_amount'], labels=df2.index, autopct='%1.1f%%', startangle=280, explode = exp, pctdistance = 0.75)
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 = my_df.groupby(by='seller_name').sum().sort_values('total_amount', ascending=False)
#pd.options.display.float_format= '$ {:,.2f}'.format
print(f"El bono para el mejor vendedor del mes con un total de ${df4.iloc[0,2]:.2f} en ventas es para {df4.index[0]} \n")
print(df4[['quantity'] + ['total_amount']].head())
# RESOLUCIÓN GRÁFICA
plt.gca().xaxis.grid(True)
plt.barh(df4.index, df4['total_amount'],color = ['gold' if x in df4.index[0] else 'red' for x in df4.index])
plt.gca().invert_yaxis()
plt.xticks(rotation=0)
plt.show()
# RESOLUCIÓN ANALÍTICA
df5 = my_df.groupby(by='week').sum().sort_values('total_amount', ascending=False)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df5[['total_amount'] +['quantity'] ])
# RESOLUCIÓN GRÁFICA
def show_values(axs, orient="v", space=.01):
def _single(ax):
if orient == "v":
for p in ax.patches:
_x = p.get_x() + p.get_width() / 2
_y = p.get_y() + p.get_height() + (p.get_height()*0.01)
value = '{:.2f}'.format(p.get_height())
ax.text(_x, _y, value, ha="center")
if isinstance(axs, np.ndarray):
for idx, ax in np.ndenumerate(axs):
_single(ax)
else:
_single(axs)
g= sns.barplot(x=df5.index, y=df5['total_amount'], palette='Paired')
show_values(g)
plt.show()
# RESOLUCIÓN ANALÍTICA
dfventasxpais = my_df.groupby(by='country_name').sum().sort_values('total_amount', ascending=False).rename(columns={'total_amount' : 'Cantidad Total','quantity':'Unidades Vendidas'})
dfventasxpais_v2 = my_df.groupby(by='country_name')['quantity'].agg(['count'])
dfventasxpais['Cantidad de ventas'] = dfventasxpais_v2
print(dfventasxpais[['Cantidad Total'] + ['Cantidad de ventas'] + ['Unidades Vendidas']])
# RESOLUCIÓN GRÁFICA
fig, ax1 = plt.subplots(figsize=(10,5))
dfventasxpais = dfventasxpais.head()
add_value_label=(dfventasxpais.index,dfventasxpais[['Cantidad Total']])
sns.barplot(data = dfventasxpais, x = dfventasxpais.index, y='Cantidad Total', ax=ax1, palette ='coolwarm')
plt.xticks(rotation=30)
ax2 = ax1.twinx()
sns.lineplot(data = dfventasxpais, x=dfventasxpais.index, y='Cantidad de ventas', ax=ax2, color='C2',linewidth = 3, marker="o")
plt.xticks(rotation=30)
plt.suptitle("Top 5 Paises" ,
fontsize = 'x-large' ,
fontweight = 'bold' )
ax1.set_ylabel("Ventas Totales")
ax2.set_ylabel("Cantidad de ventas (linea)")
plt.show()
# RESOLUCIÓN ANALÍTICA
df2paises = my_df[my_df['country_name'] == 'Brazil']
df_arg = my_df[my_df['country_name'] == 'Argentina']
df2paises = df2paises.append(df_arg)
df2paises = df2paises.groupby(['article_name','country_name'],as_index=False)['quantity'].sum().sort_values('quantity', ascending=False)
dftopar = df2paises[df2paises['country_name'] == 'Argentina'].head()
dftopbr = df2paises[df2paises['country_name'] == 'Brazil'].head()
print(df2paises[df2paises['country_name'] == 'Brazil'].head())
print(df2paises[df2paises['country_name'] == 'Argentina'].head())
# RESOLUCIÓN GRÁFICA
plt.figure(figsize=(14, 6))
sns.set_style('darkgrid')
plt.subplot(1,2,2)
sns.barplot(data = dftopar,x='article_name', y='quantity', palette={'CPU':'m', 'HDD':'g', 'SDD':'r','Range Extender':'c', 'Fan Cooler':'y',})
plt.title("Argentina", fontsize=15)
plt.xlabel("Articulos", fontsize=12)
plt.ylabel("Cantidad de ventas")
plt.subplot(1,2,1)
sns.barplot(data = dftopbr,x='article_name', y='quantity', palette={'Tablet':'b', 'HDD':'g', 'SDD':'r','Chair':'crimson', 'Pci Express Port':'yellow', 'CPU':'k'})
plt.title("Brazil", fontsize=15)
plt.xlabel("Articulos", fontsize=12)
plt.ylabel("Cantidad de ventas")
plt.suptitle("Articulos mas vendidos de los paises con mas ventas", fontsize=20)
# RESOLUCIÓN
dfventasxprod = my_df[my_df.article_name.isin(['Full Pc','Notebook', 'Smartphone', 'Chair', 'Tablet'])]
dfventasxprod = dfventasxprod.groupby(['article_name','week'],as_index=False).sum().sort_values(['article_name', 'week'], ascending=True).head(20)
#print(dfventasxprod[['article_name']+ ['week']+['quantity']].sort_values(by = 'article_name'))
print()
print(dfventasxprod)
plt.figure(figsize=(14, 6))
sns.barplot(data=dfventasxprod, x='week',y='quantity', hue='article_name',errorbar=None, palette ='Spectral_r')
plt.xlabel('Semana', size = 18)
plt.ylabel('Unidades vendidas', size = 15)