# imports
import numpy as np
import pandas as pd
import sqlite3 as sql3
import openpyxl # para que levante bien el excel
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import display
from mpl_toolkits.axes_grid1 import make_axes_locatable
# Levanto los datos en 3 diferentes dataframes
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')
# Ó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.options.display.float_format ="$ {:,.2f}".format
df_merge = (df_sellers.merge(df_orders, on='seller_id', how='inner').merge(df_articles,on="article_id"))
df_merge['total_amount']=df_merge['quantity']*df_merge['unit_price']
my_df=pd.DataFrame(df_merge, columns = ['week','quantity','article_name','total_amount', 'seller_name', 'country_name'])
print(my_df)
my_df
# RESOLUCIÓN ANALÍTICA:agrupo los datos por articulo y sumo las cantidades vendidas.
df_cant_articulos = my_df.groupby('article_name').sum()
#Se ordena en forma descendente para visualizar los 10 mas vendidos
df_cant_articulos_ord = df_cant_articulos.sort_values('quantity', ascending=False).head(10)
#Imprimo con campo cantidad para que me muestre solo esa columna y los articulos
df_cant_articulos_ord[['quantity']].style.set_properties(**{'border': '1.5px solid cyan','color': 'crimson'})
# RESOLUCIÓN GRÁFICA
sns.barplot(y = df_cant_articulos_ord["quantity"], x=df_cant_articulos_ord.index)
plt.xticks(rotation=45)
plt.gcf().set_size_inches(10, 5)
plt.grid(False)
plt.title("Los 10 articulos mas vendidos")
plt.ylabel("Cantidad de ventas")
plt.xlabel("Articulos")
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_articulo_ord = my_df.groupby('article_name').sum().sort_values('total_amount', ascending=False).head(5)
df_monto_articulo_ord[['total_amount']].style.set_properties(**{'border': '1.5px solid crimson','color': 'cyan'}).format("$ {:.2f}")
# RESOLUCIÓN GRÁFICA
plt.barh(df_monto_articulo_ord.index, df_monto_articulo_ord['total_amount'] , height=0.7,color=["#0B4C5F","#045FB4","#0080FF","#58ACFA","#A9D0F5"])
plt.gcf().set_size_inches(10, 5)
plt.grid(False)
plt.title("Los 5 articulos con mayor monto de ventas")
plt.ylabel("Articulo")
plt.xlabel("Monto")
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_vendedor_ord = my_df.groupby('seller_name').sum().sort_values('total_amount', ascending=False).head(10)
df_monto_vendedor_ord[['total_amount']].style.highlight_max().format("$ {:.2f}")
# RESOLUCIÓN GRÁFICA
plt.bar(df_monto_vendedor_ord.index, df_monto_vendedor_ord['total_amount'],color=["yellow","pink","pink","pink","pink","pink","pink","pink","pink","pink"])
plt.gcf().set_size_inches(10, 5)
plt.xticks(rotation=45,ha="right")
plt.grid(False)
plt.title("Los 10 vendedores que mas recaudaron en el mes, destacando el primero",color="hotpink",fontweight="bold",pad="20.0")
plt.ylabel("Monto")
plt.xlabel("Vendedores")
plt.show()
# RESOLUCIÓN ANALÍTICA
df_monto_vtas_mes = my_df.groupby('week').sum().sort_values('total_amount', ascending=False)
df_monto_vtas_mes[['total_amount']].style.background_gradient().format("$ {:.2f}")
# RESOLUCIÓN GRÁFICA
plt.style.use('dark_background')
g=plt.bar(df_monto_vtas_mes.index,df_monto_vtas_mes['total_amount'], width=0.5,color=['#0B173B','#0040FF','#2E64FE','#5882FA'] )
plt.gcf().set_size_inches(10, 5)
plt.grid(False)
plt.title("Variacion del monto recaudado por semana",color="white",fontweight="bold",pad="20.0")
plt.ylabel("Monto")
plt.xlabel("Semanas")
plt.show()
plt.barh(df_monto_vtas_pais.index, df_monto_vtas_pais['total_amount'],color=["#FB3D01","#FB440D","#FA521E","#F76437","#F87A53","#F48564","#F49173","#F79C81","#F6A58C","#F6B19C","#F4B7A5","#F2C2B4","#EFC8BD","#F1D1C7","#F7DFD9","#F7EDE9"])
plt.gcf().set_size_inches(10, 5)
plt.title("Total de montos por ventas por cada pais",color="white",fontweight="bold",pad="20.0")
plt.grid(False)
plt.xlabel("Monto por pais")
plt.show()
# RESOLUCIÓN: Se agrupa por las dos claves, pais y vendedor y se suma el monto recaudado por vendedor y por pais.
df_monto_vendedorpais = my_df.groupby(['country_name','seller_name']).sum()
#Vuelvo a agrupar esta vez por pais y se le indica que es indice.
#despues compruebo que es un objeto index que tiene una lista, con el punto values,devuelve el objeto como un array.
paises = df_monto_vendedorpais.groupby('country_name').sum().index.values
#Creo un dataframe vacio donde se va a volcar la informacion luego de loopear la lista
#paises donde se va a obtener el maximo por pais. El valor de el df paises es el index.
df_paises=pd.DataFrame(columns=['Vendedores','Monto'], index=paises)
for pais in paises:
df = df_monto_vendedorpais.loc[pais] #asigno cada pais a un df
mt = df.max()['total_amount'] #cuando lo encuentra, se usa para buscar en el mismo df cual es el indice
v = df[(df['total_amount'] == mt)].index[0] #devuelve un objeto del cual nos traemos el primer elemento
df_paises.loc[pais]= {'Vendedores': v, 'Monto': mt }#asigno un diccionario al dataframe vacio, por cada fila para cada pais indicando vendedores y monto.
df_paises=df_paises.sort_values('Monto', ascending=False)#para mejor visualizacion y tambien para ver la mayor recaudacion de todas se ordena.
df_paises[["Vendedores"]+["Monto"]].style.set_properties(**{'border': '2px solid green','color': 'red'})
myStyle = {
'axes.edgecolor': 'black',
'axes.facecolor': 'LightCyan',
'axes.grid': True,
'grid.linestyle': '--',
'ytick.right': True,
'axes.spines.right': False,
'axes.spines.top': False
}
sns.set_style("white")
sns.set_style(myStyle)
plt.figure(figsize=(10,6))
g=sns.barplot(data=df_paises, x=df_paises.index ,y='Monto', hue='Vendedores',palette="bright",dodge=False)
g.set_xticklabels(labels=df_paises.index,rotation=70,ha="right")
g.set_title("Montos de venta por pais y por vendedor",color="blue",fontweight="bold",pad="20.0")
plt.show()
# RESOLUCIÓN: Se realiza un procedimiento similar al efectuado agrupando pais vendedor, por monto
# Aqui agrupo por articulo y semana, para conocer cantidad
df_cant_artimes = my_df.groupby(['article_name','week']).sum()
articulos = df_cant_artimes.groupby("article_name").sum().index.values
df_nuevo=pd.DataFrame(columns=['Semana', 'Ventas'], index=articulos)
#Este loop es similar al anterior solo que busco las semanas donde se realizaron menor cantidad de ventas
for a in articulos:
df1 = df_cant_artimes.loc[a]
tot = df1.min()['quantity']
w = df1[(df1['quantity'] == tot)].index[0]
df_nuevo.loc[a]= {'Semana': w, 'Ventas': tot }
df_nuevo['Semana'] = df_nuevo['Semana'].astype(int)#se realiza casteo porque semana no se trataba de un entero sino de un objeto
df_nuevo['Ventas'] = df_nuevo['Ventas'].astype(int)#se castea ventas porque se trata de cantidades, no montos.
df_nuevo=df_nuevo.sort_values('Ventas', ascending=True)#ordeno para buscar la menor cantidad de ventas por articulo y por semana
df_nuevo[["Semana"]+["Ventas"]].style.background_gradient()
This chart is empty
Chart was probably not set up properly in the notebook
g=sns.barplot(data=df_nuevo, x=df_nuevo.index ,y='Ventas', hue='Semana',palette="ch:rot=-.25,hue=1,light=.75",dodge=False)
plt.gcf().set_size_inches(12, 6)
g.set_xticklabels(labels=df_nuevo.index,rotation=55,ha="right")
g.set_title("Total venta de cada articulo, por semana",color="#0B4C5F",fontweight="bold",pad="20.0")
plt.show()