# 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 # levantar excel
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)
# 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('\nBúsqueda 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('\nBúsqueda 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('\nBúsqueda 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 = df_orders.copy() # shallow copy o copia superficial (otro Objeto alojado en la memoria)
# Cambio el índice 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())):
# print(i)
# SINTAXIS: df_articles.loc[indice][columna]
# [indice]: va a ser el dato que obtengo de [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) de df_articles
# 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']
# elimimo 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
df1 = my_df.groupby(by='article_name').sum().sort_values(by='quantity',ascending=False)
print(df1['quantity'])
# RESOLUCIÓN GRÁFICA
colores = sns.color_palette('autumn')
plt.bar(df1.index,df1['quantity'],color=colores)
plt.xticks(rotation=90)
plt.title('Articulos por cantidades vendidos')
plt.xlabel('Articulo')
plt.ylabel('Cantidad')
plt.show()
# RESOLUCIÓN ANALÍTICA
df2=(my_df.groupby(by='article_name').sum()).sort_values('total_amount', ascending=False).head(5)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df2['total_amount'])
# RESOLUCIÓN GRÁFICA
colores = sns.color_palette('rocket_r')[0:5]
plt.pie(x=df2['total_amount'], labels=df2.index, colors=colores)
plt.title('Mejores 5 articulos por ingresos')
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(df4[['quantity'] + ['total_amount']])
print(df4[['quantity'] + ['total_amount']].head(5))
# RESOLUCIÓN GRÁFICA
colores = sns.color_palette('gist_earth')
plt.bar(df4.index, df4['total_amount'], color=colores)
plt.xticks(rotation=60)
plt.title('Vendedores por monto total vendido')
plt.xlabel('Vendedor')
plt.ylabel('Monto')
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']])
# RESOLUCIÓN GRÁFICA
colores = sns.color_palette('copper_r')
plt.bar(df5.index, df5['total_amount'], color=colores)
plt.title('Variacion semanal en ventas')
plt.xlabel('Semana')
plt.ylabel('Monto')
plt.show()
# Resolución Analítica
# --------------------
# Genero un nuevo data frame agrupando por vendedor.
df6 = my_df.groupby(['seller_name']).sum()
# Elimino la columna 'week' del nuevo data frame por ser irrelevante para el mismo
df6 = df6.drop(columns='week')
# Calculo el monto promedio de ventas para cada vendedor y lo guardo en una lista.
lista_de_promedios = []
for i in range (len(df6.index)):
promedio_vendedor = df6.iloc[i]['total_amount'] / df6.iloc[i]['quantity']
lista_de_promedios.append(promedio_vendedor)
# Agrego la lista de montos promedio de cada vendedor como una columna.
df6 = df6.assign(average_amount=lista_de_promedios)
# Ordeno los vendedores según su monto promedio de ventas.
df6 = df6.sort_values('average_amount',ascending=False)
# Formateo de datos.
pd.options.display.float_format= '$ {:,.0f}'.format
# Muestro el data frame resultante.
print('VENDEDORES SEGÚN EL MONTO PROMEDIO DE SUS VENTAS\n'+'-'*48)
print(df6)
# Resolución gráfica
# ------------------
sns.barplot(data=df6, x='average_amount',y=df6.index, palette="winter_r")
plt.title('Vendedores por monto promedio de ventas')
plt.xlabel('Monto promedio')
plt.ylabel('Vendedor')
plt.show()
# Resolución analítica
# --------------------
# Determino cantidad de países a analizar.
CANT_PAISES = 3
# Genero un array con el nombre de los primeros 'n' países por cantidad de ventas.
LISTA_PAISES = (my_df.groupby(by='country_name').sum()).sort_values('quantity', ascending=False).head(CANT_PAISES).index
# Genero una serie para mostrar los países con mas ventas
SERIE_PAISES = pd.Series(LISTA_PAISES, index=[np.arange(1, CANT_PAISES+1)])
print("TOP 3 PAÍSES CON MÁS VENTAS\n"+"-"*27)
print(SERIE_PAISES,"\n\n")
# Genero un nuevo data frame, que solo contendrá datos de los países seleccionados.
# (Agregar o quitar código según cantidad de países seleccionados).
df7 = my_df[(my_df['country_name'] == LISTA_PAISES[0]) | (my_df['country_name'] == LISTA_PAISES[1]) | (my_df['country_name'] == LISTA_PAISES[2])]
# Genero otro data frame, agrupando los datos según país y semana.
df8 = df7.groupby(['country_name'] + ['week']).sum()
# Formateo de datos.
pd.options.display.float_format= '$ {:,.0f}'.format
# Muestro el data frame resultante.
print("EVOLUCIÓN SEMANAL DE VENTAS Y MONTOS POR PAÍS\n"+"-"*45)
print(df8)
# Resolución gráfica
# ------------------
sns.catplot(data=df7, kind="bar", ci=None, x='country_name',y='total_amount',hue='week', order=LISTA_PAISES)
sns.set_palette("CMRmap_r")
plt.title('Evolucion semanal de ventas y montos por país')
sns.set_context('notebook')
plt.xlabel("País")
plt.ylabel("Monto")
plt.show()
# Resolución analítica
# Genero un nuevo data frame agrupando por país.
df9 = my_df.groupby(by='country_name').sum().sort_values(by='total_amount', ascending=False)
# Elimino la columna 'week' del nuevo data frame por ser irrelevante para el mismo.
df9 = df9.drop(columns='week')
# Calculo el monto total de las ventas sumados todos los países.
ingresos_totales = 0
for i in range (len(df9.index)):
ingresos_totales += df9.iloc[i]['total_amount']
# Calculo el porcentaje del monto total correspondiente a cada país, dividiendo
# el monto de cada país por el monto total, y lo guardo en una lista.
porcentaje_ingresos_pais = []
for i in range (len(df9.index)):
porcentaje = (df9.iloc[i]['total_amount'] / ingresos_totales * 100)
porcentaje = ("%.2f" % porcentaje)
porcentaje_ingresos_pais.append(porcentaje)
# Agrego la lista de porcentajes de país como una columna.
df9 = df9.assign(total_amount_percentage=porcentaje_ingresos_pais)
# Formateo de datos.
pd.options.display.float_format= '$ {:,.0f}'.format
df9.astype({'total_amount_percentage': 'float'})
# Muestro el data frame resultante.
print(df9)
# Resolución gráfica
colores = sns.color_palette('plasma')
plt.pie(x=df9['total_amount_percentage'], labels=df9.index, labeldistance=1.05, autopct='%1.1f%%', colors=colores)
plt.title('Porcentaje de monto de ventas por país sobre total')
plt.show()