# 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
import matplotlib.pyplot as plt
import seaborn as sns
# Exploración del df de artículos
print('Exploración de datos de artículos')
print('--------------------------------')
print('Muestra de datos')
print('Registro de ejemplo')
print(df_articles.sample(1)) # sample(1) 1 fila
print('\nPrimeros 8 regstros')
print(df_articles.head(8)) # head(8) 8 Filas
print('\nÚltimos 5 regstros')
print(df_articles.tail()) # tail() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBúsqueda de valores null por columna')
print(df_articles.isnull().sum())
print('\nFormato de los datos por columna')
print(df_articles.dtypes)
print('\nCantidad de filas')
print(len(df_articles))
print('\nDatos del Indice')
print(df_articles.index)
print('\nDatos de las columnas')
print(df_articles.columns)
print('\nAnalisis de la columna \'unit_price\'')
print('-----------------------------------')
# Cambio a float la columna de precios de los artículos.
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(f"Promedio : {df_articles['unit_price'].mean():,.2f}")
print(f"Desvio std : {df_articles['unit_price'].std():,.2f}")
print(f"Varianza : {df_articles['unit_price'].var():,.2f}")
print(f"Minimo : {df_articles['unit_price'].min():,.2f}")
print(f"Q1 : {df_articles['unit_price'].quantile(q=0.25):,.2f}")
print(f"Mediana : {df_articles['unit_price'].median():,.2f}")
print(f"Q3 : {df_articles['unit_price'].quantile(q=0.75):,.2f}")
print(f"Maximo : {df_articles['unit_price'].max():,.2f}")
Rango=df_articles['unit_price'].max()-df_articles['unit_price'].min()
print(f"Rango : {Rango:,.2f}")
IQR=df_articles['unit_price'].quantile(q=0.75)-df_articles['unit_price'].quantile(q=0.25)
print(f"Rango IQR : {IQR:,.2f}")
# Outliers
# Datos entre Q1 - 1,5 x IQR y Q3 + 1,5 x IQR
OI=df_articles['unit_price'].quantile(q=0.25) - (1.5 * IQR)
OS=df_articles['unit_price'].quantile(q=0.75) + (1.5 * IQR)
print(f"Datos Atipicos : Menores a {OI:,.2f} y Mayores a {OS:,.2f}")
# Grafico
plt.title('BoxPlot - Cajas y Bigotes \'unit_price\'',color='darkblue', size=14)
sns.set(style='whitegrid', palette='terrain', font="sans-serif", font_scale=0.75)
sns.boxplot(x = 'unit_price', data=df_articles)
plt.show()
# Exploración del df de vendedores
print('Exploración de datos de vendedores')
print('----------------------------------')
print('Muestra de datos')
print('Registro de ejemplo')
print(df_sellers.sample(1)) # sample(1) 1 fila
print('\nPrimeros 8 regstros')
print(df_sellers.head(8)) # head(8) 8 Filas
print('\nÚltimos 5 regstros')
print(df_sellers.tail()) # tail() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBúsqueda de valores null por columna')
print(df_sellers.isnull().sum())
print('\nFormato de los datos por columna')
print(df_sellers.dtypes)
print('\nCantidad de filas')
print(len(df_sellers))
print('\nDatos del Indice')
print(df_sellers.index)
print('\nDatos de las columnas')
print(df_sellers.columns)
# Exploración del df de órdenes
print('Exploración de datos de órdenes')
print('--------------------------------')
print('Muestra de datos')
print('Registro de ejemplo')
print(df_orders.sample(1)) # sample(1) 1 fila
print('\nPrimeros 8 regstros')
print(df_orders.head(8)) # head(8) 8 Filas
print('\nÚltimos 5 regstros')
print(df_orders.tail()) # tail() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBúsqueda de valores null por columna')
print(df_orders.isnull().sum())
print('\nFormato de los datos por columna')
print(df_orders.dtypes)
print('\nCantidad de filas')
print(len(df_orders))
print('\nDatos del Indice')
print(df_orders.index)
print('\nDatos de las columnas')
print(df_orders.columns)
print('\nAnalisis de la columna \'quantity\'')
print('-----------------------------------')
print(f"Promedio : {df_orders['quantity'].mean():,.2f}")
print(f"Desvio std : {df_orders['quantity'].std():,.2f}")
print(f"Varianza : {df_orders['quantity'].var():,.2f}")
print(f"Minimo : {df_orders['quantity'].min():,.2f}")
print(f"Q1 : {df_orders['quantity'].quantile(q=0.25):,.2f}")
print(f"Mediana : {df_orders['quantity'].median():,.2f}")
print(f"Q3 : {df_orders['quantity'].quantile(q=0.75):,.2f}")
print(f"Maximo : {df_orders['quantity'].max():,.2f}")
Rango=df_orders['quantity'].max()-df_orders['quantity'].min()
print(f"Rango : {Rango:,.2f}")
IQR=df_orders['quantity'].quantile(q=0.75)-df_orders['quantity'].quantile(q=0.25)
print(f"Rango IQR : {IQR:,.2f}")
# Outliers
# Datos entre Q1 - 1,5 x IQR y Q3 + 1,5 x IQR
OI=df_orders['quantity'].quantile(q=0.25) - (1.5 * IQR)
OS=df_orders['quantity'].quantile(q=0.75) + (1.5 * IQR)
print(f"Datos Atipicos : Menores a {OI:,.2f} y Mayores a {OS:,.2f}")
# Grafico
plt.title('BoxPlot - Cajas y Bigotes \'quantity\'',color='darkblue', size=14)
sns.set(style='dark', palette='Accent', font="sans-serif", font_scale=0.75)
sns.boxplot(x = 'quantity', data=df_orders, color='green')
plt.show()
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
# https://pandas.pydata.org/docs/user_guide/indexing.html
# https://towardsdatascience.com/how-to-use-loc-and-iloc-for-selecting-data-in-pandas-bd09cb4c3d79
# https://stackoverflow.com/questions/28754603/indexing-pandas-data-frames-integer-rows-named-columns
my_df = df_orders.copy() # shallow copy
# 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'])
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 (tabla)
# 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' de 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']
#my_df
# 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 de my_df
my_df.drop(['order_id', 'article_id', 'seller_id'], axis='columns', inplace=True)
print(my_df)
# RESOLUCIÓN ANALÍTICA
# Si no filtro por 'quantity' toma las series numéricas
# df7 = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False)
# print(df7.head())
# print(df7[['quantity']].head())
# print()
# Tomamos article_name como una columna más
# df7 = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False).reset_index()
# print(df7.head())
# df7_2 = df7[['article_name', 'quantity']].groupby('article_name').sum('quantity').sort_values('quantity', ascending=False)
# print(df7_2.head())
# print()
# print(df7_2.head().index)
# print(df7_2.index[0]) # toma correctamente el index
# Vista tipo Serie
# df7 = my_df.groupby(by='article_name')['quantity'].sum().sort_values(ascending=False).head()
# df7 = my_df.groupby(by='article_name')[['quantity'] + ['total_amount']].sum().sort_values('quantity',ascending=False).head()
# print(df7)
# print(df7.head().index)
# Vista tipo Serie
# df7 = my_df.groupby(by='article_name')['quantity'].sum().sort_values(ascending=False)
# print(df7.iloc[0:5])
# Vista tipo Serie (reset index)
# df7 = my_df.groupby(by='article_name')['quantity'].sum().sort_values(ascending=False).reset_index()
# print(df7.iloc[0:5])
# Vista tipo Serie
# df7 = my_df.groupby(by='article_name')['quantity'].sum().sort_values(ascending=False)
# df7 = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False)
# print(df7.loc['HDD':'Netbook'])
# print(df7.loc['HDD':'Netbook']['quantity'])
# print(df7.head())
# df7 = my_df.groupby(by='article_name').agg({'quantity':'sum'}).sort_values('quantity',ascending=False)
# print(df7.head())
# df7 = my_df.groupby(by='article_name').agg({'quantity':'sum'}).rename(columns={'quantity':'Cantidad'}).sort_values('Cantidad',ascending=False)
# print(df7.head())
# df7 = my_df.groupby(by='article_name').agg({'quantity':'sum'}).reset_index().rename(columns={'quantity':'Cantidad'}).sort_values('Cantidad',ascending=False)
# print(df7.head())
df7 = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False).head()
pd.options.display.float_format= '$ {:,.2f}'.format
# print(df7[['quantity']].head())
# print(df7[['quantity', 'total_amount']].head(5))
print(df7[['quantity', 'total_amount']])
# RESOLUCIÓN GRÁFICA
# Opción 1 - Count
# sns.countplot(my_df, x='article_name')
# Opción - barplot
sns.barplot(data=df7, x=df7.index, y='quantity')
# Opción 3 - barplot
# xs = ['HDD', 'Tablet', 'SDD', 'Mouse', 'Netbook']
# ys = [413, 374, 372, 322, 320]
# sns.barplot(x=xs, y=ys)
plt.xticks(rotation=90) # 'vertical'
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'])
# 'article_name' es el index
# print()
# print(df2.index[0])
# print()
# print(df2.reset_index().iloc[0])
# print()
# for i in range(5):
# # print(df2.index[i])
# print(df2.reset_index().iloc[i])
# print()
# print()
# print(df2.reset_index())
# RESOLUCIÓN GRÁFICA
plt.pie(x=df2['total_amount'], labels=df2.index, autopct='%1.2f%%')
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']].head(5))
# RESOLUCIÓN GRÁFICA
plt.bar(df4.index, df4['total_amount'])
plt.xticks(rotation=90)
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
plt.bar(df5.index, df5['total_amount'])
plt.show()
# creo el dataframe para Argentina y Brasil
df8A = my_df[my_df['country_name'].isin (['Argentina'])]
df8B = my_df[my_df['country_name'].isin (['Brazil'])]
df8C = my_df[my_df['country_name'].isin (['Argentina','Brazil'])]
df8AA = df8A.groupby(['article_name']).sum().sort_values('quantity', ascending=False).head(10)
df8BB = df8B.groupby(['article_name']).sum().sort_values('quantity', ascending=False).head(10)
df8CC = df8C.groupby(['article_name']).sum().sort_values('quantity', ascending=False).head()
df8AA.insert(0, "country_name", 'Argentina', allow_duplicates=False)
df8BB.insert(0, "country_name", 'Brasil', allow_duplicates=False)
print('Artículos más vendidos por Argentina')
print(df8AA[['quantity', 'total_amount']])
print('\nArtículos más vendidos por Brasil')
print(df8BB[['quantity', 'total_amount']])
print('\nArtículos más vendidos entre ambos países')
print(df8CC[['quantity', 'total_amount']])
# Barplot
sns.barplot(data=df8AA, x=df8AA.index, y='quantity')
plt.title('Articulos más vendidos por Argentina',color='blue', size=18)
plt.xlabel('Artículos',color='green', size=14)
plt.ylabel('Cantidad',color='green', size=14)
plt.xticks(rotation=90) # 'vertical'
plt.show()
sns.barplot(data=df8BB, x=df8BB.index, y='quantity')
plt.title('Articulos más vendidos por Brasil',color='blue', size=18)
plt.xlabel('Artículos',color='green', size=14)
plt.ylabel('Cantidad',color='green', size=14)
plt.xticks(rotation=90) # 'vertical'
plt.show()
# Pie
plt.pie(x=df8CC['quantity'], labels=df8CC.index, autopct='%1.2f%%')
plt.title('Articulos más vendidos por Argentina y Brasil',color='blue', size=16)
plt.xlabel('Artículos',color='green', size=14)
plt.ylabel('Cantidad',color='green', size=14)
plt.xticks(rotation=90) # 'vertical'
plt.show()
# creo el dataframe para Argentina y Brasil agrupado por semana
df9A = my_df[my_df['country_name'].isin (['Argentina','Brazil'])].groupby(['country_name','week']).sum().sort_values(['country_name','week'], ascending=True)
# muestro el df
print ('\nEvolución de ventas de Argentina y Brasil por semana')
print (df9A)
# Lineplot
sns.lineplot(x = "week", y = "quantity", data = df9A, hue='country_name',palette='terrain')
plt.legend(bbox_to_anchor = ( 1.20 ,0.9 ), loc = 'upper right', borderaxespad = 0 )
plt.title('Evolución de ventas de Argentina y Brasil\npor semana en unidades',color='blue', size=14)
plt.xlabel('Semana',color='green', size=14)
plt.ylabel('Cantidad',color='green', size=14)
plt.xticks(rotation=45) # 'vertical'
plt.show()
sns.lineplot(x = "week", y = "total_amount", data = df9A, hue='country_name', palette='terrain')
plt.legend(bbox_to_anchor = ( 1.20 ,0.9 ), loc = 'upper right', borderaxespad = 0 )
plt.title('Evolución de ventas de Argentina y Brasil\npor semana en importe',color='blue', size=14)
plt.xlabel('Semana',color='green', size=14)
plt.ylabel('Dólares ($)',color='green', size=14)
plt.xticks(rotation=45) # 'vertical'
plt.show()
# Filtramos el df por cada semana y agrupamos por 'seller_name' para sumar los valores
# lo ordenamos por 'total_amount' y nos quedamos con las 4 primeras filas
df_w1 = my_df[my_df['week'] == 1].groupby(by='seller_name').sum().sort_values('total_amount', ascending=False).head(4)
pd.options.display.float_format= '$ {:,.2f}'.format # Seteamos el formato para type float
print('1er semana')
# Traigo todas las filas de la columna 2 (total_amount)
print(df_w1.iloc[:,2:3])
df_w2 = my_df[my_df['week'] == 2].groupby(by='seller_name').sum().sort_values('total_amount', ascending=False).head(4)
pd.options.display.float_format= '$ {:,.2f}'.format
print("\n2da Semana")
print(df_w2.iloc[:,2:3])
df_w3 = my_df[my_df['week'] == 3].groupby(by='seller_name').sum().sort_values('total_amount', ascending=False).head(4)
pd.options.display.float_format= '$ {:,.2f}'.format
print("\n3er Semana")
print(df_w3.iloc[:,2:3])
df_w4 = my_df[my_df['week'] == 4].groupby(by='seller_name').sum().sort_values('total_amount', ascending=False).head(4)
pd.options.display.float_format= '$ {:,.2f}'.format
print("\n4ta Semana")
print(df_w4.iloc[:,2:3])
# Definimos los subplots con las dimensiones
fig, ax = plt.subplots(2, 2, figsize=(12,12))
fig.supxlabel('Valores expresados en pesos')
fig.suptitle('Mejores Vendedores por Semana')
# Se crean los subplots
ax[0, 0].bar(df_w1.index, df_w1['total_amount'],width=0.6, color=['green', 'lightgreen','lightgray','lightgray'])
ax[0, 1].bar(df_w2.index, df_w2['total_amount'],width=0.6, color=['green', 'lightgreen','lightgray','lightgray'])
ax[1, 0].bar(df_w3.index, df_w3['total_amount'],width=0.6, color=['green', 'lightgreen','lightgray','lightgray'])
ax[1, 1].bar(df_w4.index, df_w4['total_amount'],width=0.6, color=['green', 'lightgreen','lightgray','lightgray'])
# Se agrega titulos y ejes
ax[0,0].set_title("Semana 1")
ax[0,1].set_title("Semana 2")
ax[1,0].set_title("Semana 3")
ax[1,1].set_title("Semana 4")
ax[0,0].set_ylabel("Importe")
ax[0,1].set_ylabel("Importe")
ax[1,0].set_ylabel("Importe")
ax[1,1].set_ylabel("Importe")
ax[0,0].set_xlabel("Vendedor")
ax[0,1].set_xlabel("Vendedor")
ax[1,0].set_xlabel("Vendedor")
ax[1,1].set_xlabel("Vendedor")
# Muestro el gráfico
plt.show()
#Analisis en UNIDADES
# Agrupo por pais/vendedor y ordeno por pais/cantidad
df10A = my_df.groupby(['country_name','seller_name']).sum().sort_values(['country_name','quantity'], ascending=False)
# Elimino indices
df10A.reset_index(inplace=True)
# creo df final, para el mejor vendedor por pais en unidades
df10U = pd.DataFrame(columns=['country_name', 'seller_name', 'quantity'])
last ='null' #marcador de pais
# recorro el array ordenado y agrego al df la primer ocurrencia por pais (mejor vendedor)
for i in range(0,len(df10A)):
if last != df10A.iloc[i]['country_name']:
df10U=df10U.append({'country_name' : df10A.iloc[i]['country_name'] , 'seller_name' : df10A.iloc[i]['seller_name'], 'quantity' : df10A.iloc[i]['quantity']} , ignore_index=True)
last = df10A.iloc[i]['country_name']
print ('Mejor vendedor por pais en UNIDADES')
print (df10U.sort_values('country_name'))
#Analisis en importe
# Agrupo por pais/vendedor y ordeno por pais/importe
df10B = my_df.groupby(['country_name','seller_name']).sum().sort_values(['country_name','total_amount'], ascending=False)
# Elimino indices
df10B.reset_index(inplace=True)
# creo df final, para el mejor vendedor por pais en importe
df10I = pd.DataFrame(columns=['country_name', 'seller_name', 'total_amount'])
last ='null'
# recorro el array ordenado y agrego al df la primer ocurrencia por pais (mejor vendedor)
for i in range(0,len(df10B)):
if last != df10B.iloc[i]['country_name']:
df10I=df10I.append({'country_name' : df10B.iloc[i]['country_name'] , 'seller_name' : df10B.iloc[i]['seller_name'], 'total_amount' : df10B.iloc[i]['total_amount']} , ignore_index=True)
last = df10B.iloc[i]['country_name']
print ('\n\nMejor vendedor por pais en IMPORTE')
print (df10I.sort_values('country_name'))
# Barplot Horizontales
sns.barplot(data=df10U, x='quantity', y='country_name', orient='h', palette='terrain')
plt.title('Mejor vendedor por país en UNIDADES',color='blue', size=16)
plt.xlabel('Cantidad',color='green', size=14)
plt.ylabel('Pais',color='green', size=14)
plt.xticks(rotation=45)
plt.show()
sns.barplot(data=df10I, x='total_amount', y='country_name', orient='h', palette='terrain')
plt.title('Mejor vendedor por país en IMPORTE',color='blue', size=16)
plt.xlabel('Importe',color='green', size=14)
plt.ylabel('Pais',color='green', size=14)
plt.xticks(rotation=45)
plt.show()
df6 = my_df[my_df['country_name'] == 'Brazil']
#A partir del anterior, ordenar vendedores por total de ventas
vendedores_pais = df6.groupby('seller_name').sum().sort_values('total_amount', ascending=False)
vendedores_pais.head()
plt.bar(vendedores_pais.index,vendedores_pais['total_amount'],
color = ['green' if x in vendedores_pais.index[0:5] else 'blue' for x in vendedores_pais.index]) #Color verde para los mejores 5
plt.xticks(rotation = 90)
plt.title("Desempeño vendedores del país que más compra")
plt.xlabel("Vendedores")
plt.ylabel("Total de Ventas")
plt.show()
df_brazil = my_df[my_df['country_name'] == 'Brazil']
print(df_brazil[['seller_name','total_amount', 'quantity']].groupby('seller_name').sum().sort_values('total_amount', ascending=False))
print()
df_brazil_bars = df_brazil[['seller_name','total_amount']].groupby('seller_name').sum('total_amount').sort_values('total_amount', ascending=False)
print(df_brazil_bars)
print()
df_brazil_line = df_brazil[['seller_name','quantity']].groupby('seller_name').sum('quantity').sort_values('quantity', ascending=False).reset_index()
print(df_brazil_line)
fig, ax1 = plt.subplots()
# ax1: axes1
# sns.barplot(data = df_brazil_bars, x='seller_name', y='total_amount', ax=ax1, color='C3')
sns.barplot(data=df_brazil_bars, x = df_brazil_bars.index, y='total_amount', ax=ax1, color='C3')
# ax: axes
plt.xticks(rotation=90)
ax2 = ax1.twinx()
# ax2: axes2 = ax1.twinx()
sns.lineplot(data = df_brazil_line, x='seller_name', y='quantity', ax=ax2, color='C11')
plt.xticks(rotation=90)
plt.title('Top sellers in Brazil')
ax1.set_xlabel("Seller Name")
ax1.set_ylabel("Income ($)")
ax2.set_ylabel("Quantity (line)")
plt.show()