# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
# 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 nuls 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 nuls 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 = df_orders.copy() # shallow copy o copia superficial (otro Objeto alojado en la memoria)
# Cambio el indice del df de artículos
df_articles.set_index('article_id', inplace=True)
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'])
# df_articles
# print()
my_df
for i in range(max(my_df.count())):
# SINTAXIS: df_articles.loc[indice][columna]
# [indice] va a ser el dato que obtengo de my_df.loc[i]['article_id']
# [indice] -> [my_df.loc[i]['article_id']]
# o sea, tomo registro a registro el article_id y lo uso para extraer el nombre del artículo (article_name)
# print(df_articles.loc[my_df.loc[i]['article_id']]['article_name'])
article = df_articles.loc[my_df.loc[i]['article_id']]['article_name']
# print(article)
# Asignar a cada valor id de la columna 'article_name' (my_df) el nombre del artículo
my_df.loc[i, 'article_name'] = article
# my_df
# hacemos lo mismo con total amount
my_df.loc[i, 'total_amount'] = my_df.loc[i, 'quantity']*df_articles.loc[my_df.loc[i]['article_id']]['unit_price']
# columna de seller_name
my_df.loc[i, 'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_id']]['seller_name']
# elimino las columnas que no necesito del df
my_df.drop(['order_id', 'article_id', 'seller_id'], axis='columns', inplace=True)
print(my_df)
# RESOLUCIÓN ANALÍTICA
print(my_df['article_name'].value_counts()) # cuenta valores únicos
# RESOLUCIÓN GRÁFICA
sns.set(style='dark', palette='bright')
sns.displot(my_df, x='article_name')
plt.xticks(rotation=90) # 'vertical'
plt.xlabel("ARTICULOS")
plt.ylabel("CANTIDAD DE VENTAS DE CADA ARTICULO")
plt.show()
# RESOLUCIÓN ANALÍTICA
df2 = (my_df.groupby(by='article_name').sum()).sort_values('total_amount', ascending=False).head(10)
pd.options.display.float_format='$ {:,.2f}'.format
print(df2[['quantity'] + ['total_amount']])
# 'article_name' es el index
# print(df2) # agrupa (y suma) sólo variables numéricas
# SINTAXIS ALTERNATIVA
# pd.options.display.float_format='$ {:,.2f}'.format
# print(my_df[['article_name'] + ['total_amount']].groupby(['article_name']).sum().sort_values('total_amount',ascending=False).head(5))
# RESOLUCIÓN GRÁFICA
e=(0.1,0,0,0,0,0,0,0,0,0)
c=['gold', 'yellowgreen', 'coral', 'lightskyblue','plum']
plt.pie(x=df2['total_amount'], pctdistance=0.80, explode=e, colors= c, shadow=True, labels=df2.index,startangle=90,autopct='%1.2f%%', textprops={'fontsize': 7})
plt.show()
# index es el 'article_name' del df2
# 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(df4[['quantity'] + ['total_amount']])
print(df4[['quantity'] + ['total_amount']].head(5))
# 'seller_name' es el index
# RESOLUCIÓN GRÁFICA
plt.bar(df4.index, df4['total_amount'], color='forestgreen')
plt.xticks(rotation=90)
plt.xlabel("VENDEDORES")
plt.ylabel("MONTO DE VENTAS")
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[['quantity'] + ['total_amount']])
# 'week' es el index
# RESOLUCIÓN GRÁFICA
plt.barh(df5.index, df5['total_amount'],color=['yellow','aqua','blue','purple'])
plt.yticks([1,2,3,4], ['semana 1', 'semana 2', 'semana 3', 'semana 4'], rotation=0, fontsize=10, fontweight='bold', color='black')
plt.ylabel("Semana")
plt.xlabel("Monto acumulado")
plt.show()
# RESOLUCIÓN ANALITICA
print("RANKING DE VENTAS POR PAIS")
df6 = (my_df.groupby(by='country_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df6[['quantity'] + ['total_amount']])
print()
print("TOP2 PAISES: ARTICULOS MAS VENDIDOS")
mejor_pais = my_df.loc[(my_df['country_name'] == 'Brazil') | (my_df['country_name'] == 'Argentina')]
df7 = (mejor_pais.groupby(by='article_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df7[['quantity'] + ['total_amount']])
print ()
print("TOP2 PAISES: ARTICULOS MAS VECES VENDIDOS")
print(mejor_pais['article_name'].value_counts()) # cuenta valores únicos
print("TOP2 PAISES: MEJORES VENDEDORES EN MONTO")
df8 = (mejor_pais.groupby(by='seller_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df8[['quantity'] + ['total_amount']])
print()
print("TOP2 PAISES: MEJORES VENDEDORES EN CANTIDAD")
df16 = (mejor_pais.groupby(by='seller_name').sum()).sort_values('quantity', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df16[['quantity'] + ['total_amount']])
print()
# RESOLUCION GRAFICA
#PLOT
fig, ax1 = plt.subplots(figsize=(9, 9))
plt.pie(x=df6['total_amount'], shadow=True, wedgeprops = { 'linewidth' : 0.8, 'edgecolor' : 'white' },autopct='%1.2f%%', pctdistance=1.2, textprops={'color':"k", 'fontsize': 8})
plt.title("RANKING DE VENTAS POR PAIS (%)")
plt.legend(labels=df6.index, loc='upper center',
bbox_to_anchor=(0.5, -0.04), ncol=2)
plt.show()
#PLOT
sns.set(style='darkgrid', palette='Set2')
sns.displot(mejor_pais, x='article_name')
plt.xticks(rotation=90) # 'vertical'
plt.xlabel("ARTICULOS")
plt.ylabel("CANTIDAD DE VENTAS DE CADA ARTICULO")
plt.show()
#PLOT
fig, ax1 = plt.subplots(figsize=(10, 10))
ax2 = ax1.twinx()
df7head=df7[['quantity']].head(20)
ax1.bar(df7head.index, df7head['quantity'], color='g')
df25head=df7[['total_amount']].head(20)
ax2.plot(df7head.index, df25head['total_amount'], color='y')
plt.xticks(rotation=90,fontsize=12, fontweight='bold', color='c')
plt.yticks(fontsize=12)
plt.style.use('ggplot')
ax1.set_xlabel('Articulos', fontsize=16)
ax1.set_ylabel('Cantidad de articulos vendidos', color='g',fontsize=16)
ax2.set_ylabel('Monto total por articulo', color='y',fontsize=16)
fig.autofmt_xdate()
plt.title("TOP2 PAISES: MEJORES ARTICULOS EN INGRESOS Y EN CANTIDADES VENDIDAS")
plt.show()
#PLOT
plt.bar(df8.index, df8['total_amount'], color='r')
plt.xticks(rotation=90,fontsize=12, fontweight='bold', color='r')
plt.yticks(fontsize=12)
plt.ylabel("Monto de ventas")
plt.xlabel("Vendedores")
plt.style.use('ggplot')
plt.title("TOP2 PAISES: RANKING DE VENDEDORES EN MONTO")
plt.show()
#PLOT
plt.bar(df16.index, df16['quantity'], color='c')
plt.xticks(rotation=90,fontsize=12, fontweight='bold', color='c')
plt.yticks(fontsize=12)
plt.ylabel("Numero de ventas")
plt.xlabel("Vendedores")
plt.style.use('ggplot')
plt.title("TOP2 PAISES: RANKING DE VENDEDORES EN CANTIDAD")
plt.show()
# RESOLUCIÓN ANALITICA
#EVOLUCION DE VENTAS EN EL TOP2 paises
print ("EVOLUCION VENTAS EN EL TOP2 PAISES")
df13 = (mejor_pais.groupby(by='week').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df13[['quantity'] + ['total_amount']])
#DATO DE ventas en el top 3 mejores vendedores de los 2 paises
print ("VENTAS DEL TOP3 VENDEDORES")
df9 = mejor_pais.loc[(mejor_pais['seller_name'] == 'Janel O\'Curran') | (mejor_pais['seller_name'] == 'Daisie Slograve') | (mejor_pais['seller_name'] == 'Aveline Swanwick')]
print(df9)
#DATO de ventas de los 3 peores vendedores de los 2 paises
print ("EVOLUCION VENTAS DEL BOTTOM3 VENDEDORES")
df14= mejor_pais.loc[(mejor_pais['seller_name'] == 'Milly Christoffe') | (mejor_pais['seller_name'] == 'Ewell Peres') | (mejor_pais['seller_name'] == 'Cornie Wynrehame')]
print (df14)
# RESOLUCION GRAFICA
fig, ax1 = plt.subplots(figsize=(8, 8))
#PLOT
plt.barh(df13.index, df13['total_amount'],color=['silver', 'salmon','skyblue','black'])
plt.yticks([1,2,3,4], ['semana 1', 'semana 2', 'semana 3', 'semana 4'], rotation=0, fontsize=10, fontweight='bold', color='black')
plt.ylabel("Semana")
plt.xlabel("Monto acumulado")
plt.title("EVOLUCION DE VENTAS EN EL TOP2 PAISES")
plt.show()
#PLOT
sns.boxplot(data=df9, x='week', y='total_amount', hue='seller_name', dodge=True, palette="hls")
plt.xlabel("Semanas")
plt.ylabel("Monto de Ventas $")
plt.legend(title="TOP3 Vendedores", loc='upper right')
plt.title("EVOLUCION VENTAS DEL TOP3 VENDEDORES")
plt.show()
#PLOT
sns.boxplot(data=df14, x='week', y='total_amount', hue='seller_name', dodge=True, palette="Greens")
plt.xlabel("Semanas")
plt.ylabel("Monto de Ventas $")
plt.legend(title="Peores Vendedores", loc='upper right')
plt.title("EVOLUCION VENTAS DEL BOTTOM3 VENDEDORES")
plt.show()
# RESOLUCIÓN ANALITICA
#DATO DE ventas de los 3 mejores PRODUCTOS EN MONTO de los 2 paises
print ("VENTAS DEL TOP 3 PRODUCTOS")
df10 = mejor_pais.loc[(mejor_pais['article_name'] == 'Full Pc') | (mejor_pais['article_name'] == 'Notebook') | (mejor_pais['article_name'] == 'Smartphone')]
print (df10)
#Vendedores de la Full Pc que es el item que genera mas ingresos
print ("VENDEDORES DE LA FULL PC")
df11 = mejor_pais.loc[(mejor_pais['article_name'] == 'Full Pc')]
df12 = (df11.groupby(by='seller_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df12[['quantity'] + ['total_amount']])
print()
#Vendedores de Notebook que es el segundo item que genera mas ingresos
print ("VENDEDORES DE NOTEBOOK")
df23 = mejor_pais.loc[(mejor_pais['article_name'] == 'Notebook')]
df30 = (df23.groupby(by='seller_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df30[['quantity'] + ['total_amount']])
print()
#Vendedores del Smartphone que es el tercer item que genera mas ingresos
print ("VENDEDORES DE SMARTPHONE")
df28 = mejor_pais.loc[(mejor_pais['article_name'] == 'Smartphone')]
df31 = (df28.groupby(by='seller_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format='$ {:,.2f}'.format
print(df31[['quantity'] + ['total_amount']])
print()
# RESOLUCION GRAFICA
#PLOT
sns.boxplot(data=df10, x='week', y='total_amount', hue='article_name', dodge=True, palette="tab10")
plt.xlabel("Semanas")
plt.ylabel("Monto de Ventas $")
plt.legend(title="TOP3 Productos", loc='upper right')
plt.title("EVOLUCION DE VENTAS DEL TOP3 PRODUCTOS")
plt.show()
#PLOT
plt.bar(df12.index, df12['quantity'], color='forestgreen')
plt.xticks(rotation=90, fontsize=11, fontweight='bold', color='c')
plt.xlabel("Vendedor")
plt.title("VENTAS DE FULL PC SEGUN VENDEDOR")
plt.ylabel("Cantidad de Full PC vendidas")
plt.show()
#PLOT
plt.bar(df30.index, df30['quantity'], color='springgreen')
plt.xticks(rotation=90, fontsize=11, fontweight='bold', color='m')
plt.xlabel("Vendedor")
plt.title("VENTAS DE NOTEBOOKS SEGUN VENDEDOR")
plt.ylabel("Cantidad de Notebooks vendidas")
plt.show()
#PLOT
plt.bar(df31.index, df31['quantity'], color='lime')
plt.xticks(rotation=90, fontsize=11, fontweight='bold', color='y')
plt.xlabel("Vendedor")
plt.title("VENTAS DE SMARTPHONES SEGUN VENDEDOR")
plt.ylabel("Cantidad de Smartphones vendidos")
plt.show()