# 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 matplotlib.pyplot as plt
import seaborn as sns
import openpyxl #para levantar excel de otros paqueter no office
# 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'])
#df_articles
#Vendedores
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
#df_sellers
#Ordenes
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())
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)
# Exploración del df de vendedores
print('Muestra de datos')
print(df_sellers.head())
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)
# Exploración del df de órdenes
print('Muestra de datos')
print(df_orders.head())
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)
#Cambiar a float los precios untitarios
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
#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())
#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)
print(my_df.head())
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
por_cantidad = my_df2.sort_values('quantity', ascending=False)
print('***** Artículo que más se vendió *****\n')
print(por_cantidad['quantity'].head(1))
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
por_ingresos = my_df2.sort_values('total_amount', ascending=False).head()
print('***** Artículo que más ingresos generó *****\n')
print(por_ingresos['total_amount'].head(1))
por_ingresos2 = my_df2.sort_values('total_amount', ascending=False)
otros_acum= por_ingresos2.iloc[5:]['total_amount'].sum()
#otros_acum guarda el total de ingresos generados por los otros productos
#que no sean los primeros 5 que aparecen en por_ingresos
#Comprobando
print('Total de ingresos que generan los 5 primeros productos: ',por_ingresos['total_amount'].sum())
print('Total de ingresos que generan el resto de productors: ',otros_acum)
print('Sumando los dos valores anteriores: ',por_ingresos['total_amount'].sum()+otros_acum)
print('\nTotal de ingresos de todos los productos calculado \n desde el dataframe agrupado por productos: ',my_df2['total_amount'].sum())
por_ingresos.loc['otros']=[ 0, 0, otros_acum ]
#Añado como fila a Otros con los ingresos que generaron el resto de los productos
#Solo para que los porcentajes de la grafica pie sean reales
print(por_ingresos['total_amount'])
# RESOLUCIÓN ANALÍTICA
print('***** Mejor vendedor del mes *****\n')
df3 =my_df.groupby('seller_name').sum().sort_values('total_amount',ascending=False)
print(df3[['quantity']+['total_amount']].head(1))
# RESOLUCIÓN ANALÍTICA
print('***** Variación en las ventas a lo largo del mes *****\n')
df4 = my_df.groupby('week').sum()
print(df4)
df4.index = df4.index.astype(str)
#Cambiamos el tipo de dato en index para graficar mejor
# RESOLUCIÓN ANALITICA
print('***** País al que se vende menos *****\n')
df5 =my_df.groupby('country_name').sum().sort_values('quantity',ascending=True)
print(df5[['quantity'] + ['total_amount']].head(1))
# RESOLUCIÓN ANALÍTICA
#creo el DF mart que contiene los 3 articulos que generaron más ingresos
mart = my_df2.sort_values('total_amount', ascending=False).head(3)
mart = mart.rename_axis('article_name').reset_index()
#creo el DF mvend que contiene los 5 vendedores que generaron mas ingresos
mvend = df3.head(5)
mvend = mvend.rename_axis('seller_name').reset_index()
#Creo el DF dmm extrayendo de my_df la información en donde se cumpla la condicione que el vendedor
#sea alguno de los TOP 5 y que ademmás haya vendido uno de los TOP 3 articulos
dfmm = pd.DataFrame(columns= ['seller_name', 'article_name','quantity'])
c=0
for i in range (len(my_df.index)): #len(my_df.index) devuelva la cantidad de filas (registros)
for j in range (len(mart.index)):
for k in range (len(mvend.index)):
if (my_df.loc[i]['seller_name'] == mvend.iloc[k]['seller_name']) & (my_df.loc[i]['article_name'] == mart.loc[j]['article_name']):
dfmm.loc[c] = [mvend.iloc[k]['seller_name'], mart.iloc[j]['article_name'], my_df.loc[i]['quantity']]
c= c+1
print(dfmm.head())
#RESOLUCIÓN ANALÍTICA
print('\n***** Top 3 de articulos que generan más ingresos *****\n')
print(mart[['article_name']+['quantity']+['total_amount']])
print('\n***** Top 5 de mejores vendedores *****\n')
print(mvend[['seller_name']+['quantity']+['total_amount']])
print('\n***** Unidades vendidas de los Top3 articulos por los top 3 vendedores*****\n')
df6 =dfmm.groupby(['seller_name','article_name']).sum()
print(df6)
# RESOLUCIÓN ANALITICA
print('***** Mejor vendedor a Brasil *****\n')
#Agrupamos los datos por país y en cada país por vendedor
df7 =my_df.groupby(['country_name','seller_name',]).sum()
#Seleccionamos solo los datos de Brazil para encontrar al mejor vendedor de ese país
de_brasil = df7.loc['Brazil'].sort_values('total_amount',ascending=False)
print(de_brasil[['total_amount']+['quantity']].head(1))