# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install xlrd
!pip install openpyxl==3.0.10
# imports
import pandas as pd
import numpy as np
import sqlite3
import matplotlib.pyplot as plt
import seaborn as sns
import openpyxl
# Levanto los datos en 3 diferentes dataframes
df_orders = pd.read_csv('/work/data/orders.csv')
#print(dforders)
con = sqlite3.connect('/work/data/articles.db')
# Usa read_sql_query de pandas para extraer el resultado
# de la consulta a un DataFrame
df_articulos = pd.read_sql_query("SELECT * from articles", con)
#print (dfarticulos)
#leer excel
df_sellers = pd.read_excel(io = "/work/data/sellers.xlsx")
#print(df_sellers)
# EXPLORO LAS COLUMNAS DEL DF
print('\nDatos del Dataframe')
print (df_articulos.head())
print('\nColumnas del Dataframe')
print (df_articulos.columns)
# cuantos registros tiene el dataframe?
print('\nTotal de registros: ')
print(df_articulos['article_id'].count())
print('\nTipos de Datos:')
print (df_articulos.dtypes)
print('\nForma del dataframe:')
print (df_articulos.shape)
print('\nCantidad de Registros Nulos:')
print (df_articulos.isnull().sum())
# Exploración del df de vendedores
print('\nDatos del Dataframe')
print (df_orders.head)
# cuantos registros tiene el dataframe?
print('\nTotal de registros: ')
print(df_orders['order_id'].count())
print('\nForma del dataframe:')
print(df_orders.shape)
print('\nCantidad de Registros Nulos:')
print (df_orders.isnull().sum())
print('\nTipos de Datos:')
print (df_orders.dtypes)
# unir DF
#dftodo = pd.merge(dfarticulos, dforders, on='article_id')
# Exploración del df de órdenes
print('\nDatos del Dataframe')
print (df_sellers.head())
print('\nColumnas del Dataframe')
print (df_sellers.columns)
# cuantos registros tiene el dataframe?
print('\nTotal de registros: ')
print(df_sellers['seller_id'].count())
print('\nTipos de Datos:')
print (df_sellers.dtypes)
print('\nForma del dataframe:')
print (df_sellers.shape)
print('\nCantidad de Registros Nulos:')
print (df_sellers.isnull().sum())
# cambiar el tipo de datos de la columa unit_price
df_articulos['unit_price'] = df_articulos['unit_price'].astype(float)
print(df_articulos)
print (df_articulos.dtypes)
#Darle formato con decimales
pd.options.display.float_format = '{:,.2f}'.format
print(df_articulos['unit_price'])
# Armar un df haciendo joins con los dataframes originales
my_df1 = pd.merge(df_articulos, pd.merge(df_sellers, df_orders, on='seller_id'), on='article_id')
# Crear una nueva columna para obtener el monto total
my_df1['total_amount'] = my_df1['quantity'] * my_df1['unit_price']
# Dejar en my_df solamente las columnas que voy a necesitar
my_df = my_df1[['week'] + ['article_name']+ ['quantity'] + ['seller_name'] + ['country_name'] + ['total_amount']]
print (my_df)
# RESOLUCIÓN ANALÍTICA
# Armar un df con los datos agrupados por nombre de artículo
df_ventaarticulos = my_df.groupby(['article_name'], as_index= False)['quantity'].sum()
# Obtener el top 10 de art mas vendidos ordenado por cantidad
df_top10articulos = df_ventaarticulos.sort_values('quantity', ascending= False).head(10)
print (df_top10articulos)
df_articulomasvendido = df_ventaarticulos.sort_values('quantity', ascending= False).head(1)
print('\nArtículo mas Vendido:')
print(df_articulomasvendido)
# RESOLUCIÓN GRÁFICA
sns.barplot(x='quantity', y='article_name', data=df_top10articulos, orient='h')
plt.title('Top 10 de Artículos mas Vendidos', size = 20)
plt.ylabel('Artículo', size=1)
plt.xlabel('Unidades Vendidas', size=10)
plt.show()
# RESOLUCIÓN ANALÍTICA
# Armar un df con los datos de ventas agrupados por nombre de artículo
df_ingresosarticulos = my_df.groupby(['article_name'], as_index= False)['total_amount'].sum()
# obtener el top 10 de articulos con mas monto de ventas
df_top10ventasart =df_ingresosarticulos.sort_values('total_amount', ascending= False).head(10)
print(df_top10ventasart)
df_top1ventasart = df_top10ventasart.sort_values('total_amount', ascending= False).head(1)
print('\nArtículo mas Vendido:')
print(df_top1ventasart)
# RESOLUCIÓN GRÁFICA
#sns.barplot(x="total_amount", y="article_name", data=df_arting10, orient='h')
sns.barplot(y="total_amount", x="article_name", data=df_top10ventasart)
plt.title('Top 10 de Venta de Artículos', size = 20)
plt.ylabel('Monto', size=10)
plt.xlabel('Artículos', size=10)
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
df_porvendedor = my_df.groupby(['seller_name'], as_index= False)['total_amount'].sum()
df_top10vendedor = df_porvendedor.sort_values('total_amount', ascending= False).head(10)
print (df_top10vendedor)
df_top1vendedor = df_porvendedor.sort_values('total_amount', ascending= False).head(1)
print('\nVendedor al que corresponde el Bono:')
print(df_top1vendedor)
# RESOLUCIÓN GRÁFICA
sns.barplot(y='seller_name', x='total_amount', data=df_top10vendedor, )
plt.title('Top 10 de Vendedores', size = 20)
plt.ylabel('Vendedor', size=10)
plt.xlabel('Total de Ventas', size=10)
# RESOLUCIÓN ANALÍTICA
# Obtener en un DF las ventas agrupadas por semana
df_porsemana = my_df.groupby(['week'], as_index= False)['total_amount'].sum()
print (df_porsemana)
# Agregar columna con el % de ventas por semana en función al total
df_porsemana['Porcentaje (%)'] = df_porsemana['total_amount'] / df_porsemana['total_amount'].sum() * 100
#df_porsemana['%'] = df_porsemana['%'].astype(float)
print (df_porsemana)
print ('\nLa campaña se debe lanzar en la última semana porque es la que tiene el % menor de ventas del mes')
# RESOLUCIÓN GRÁFICA
sns.barplot(y='total_amount', x='week', data=df_porsemana,)
plt.xlabel('Semanas', size=16)
plt.ylabel('Monto', size=1)
#'$ {:,.2f}'.format
#yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
#plt.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
plt.title('Ventas del Mes Agrupada por Semana', size = 20)
plt.show()
destacar = (0, 0, 0, 0.2)
plt.pie(df_porsemana['total_amount'], labels=df_porsemana['week'], autopct="%0.1f %%", explode=destacar)
plt.title('Ventas del Mes Agrupadas por Semana', size = 20)
plt.show()
# RESOLUCIÓN ANALÍTICA
# Agrupar ventas por país
df_porpais = my_df.groupby(['country_name'], as_index= False)['total_amount'].sum()
# Agregar columna de % al df
df_porpais['%'] = df_porpais['total_amount'] / df_porpais['total_amount'].sum() * 100
df_top5paisesmenosventas = df_porpais.sort_values('total_amount', ascending= False).tail(5)
print (df_top5paisesmenosventas.sort_values('total_amount'))
# RESOLUCIÓN GRÁFICA
sns.barplot(y='country_name', x='total_amount', data=df_top5paisesmenosventas, )
plt.title('5 Paises con Menos Ventas', size = 20)
plt.ylabel('País', size=10)
plt.xlabel('Total de Ventas', size=10)
# RESOLUCIÓN
df_ventasnotebookargentina = my_df.query('article_name== "HDD" and country_name == "Argentina"')
#print(df_ventasnotebookargentina)
df_evolucion = df_ventasnotebookargentina.groupby(['week'], as_index= False)['quantity'].sum()
print (df_evolucion)
#df_evolucion2 = my_df.groupby(['week'], as_index= False)['quantity'].sum().query('article_name== "Notebook" and country_name == "Argentina"')
#print (df_evolucion)
#df_evolucion.drop(['article_name', 'country_name'], axis= 'columns', inplace=True)
#print(df_evolucion)
#print(df_evolucion2)
# RESOLUCIÓN GRÁFICA
sns.barplot(y='quantity', x='week', data=df_evolucion, )
plt.title('Cantidad de "HDD" Vendidas por Semana en Argentina', size = 20)
plt.ylabel('Cantidad', size=10)
plt.xlabel('Semana', size=10)
plt.show()
# RESOLUCIÓN
# Crear DF agrupando por semana y vendedor
#df_porsemana = my_df.groupby(['seller_name','week'])['total_amount'].sum()
df_porsemana = df_ventasnotebookargentina.groupby(['week','seller_name'], as_index= False)['quantity'].sum()
print (df_porsemana.sort_values('week'))
df_pivot = df_porsemana.pivot(index='week', columns='seller_name', values='quantity')
#print (df_pivot)
df_pivot.plot.bar(stacked=True)
plt.title('Cantidad de "HDD"" Vendidas por Semana y Vendedor en Argentina', size = 20)
plt.ylabel('Cantidad', size=10)
plt.xlabel('Semana', size=10)
plt.legend(title='Vendedor')
plt.xticks(rotation=0)
plt.show()