# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
Requirement already satisfied: openpyxl==3.0.10 in /root/venv/lib/python3.9/site-packages (3.0.10)
Requirement already satisfied: et-xmlfile in /root/venv/lib/python3.9/site-packages (from openpyxl==3.0.10) (1.1.0)
WARNING: You are using pip version 22.0.4; however, version 22.3.1 is available.
You should consider upgrading via the '/root/venv/bin/python -m pip install --upgrade pip' command.
# 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 de datos de artículos
--------------------------------
Muestra de datos
Registro de ejemplo
article_id article_name unit_price
14 20029 Mouse 30.30
Primeros 8 regstros
article_id article_name unit_price
0 20015 Smartphone 525.00
1 20016 Full Pc 2127.81
2 20017 Monitor 230.00
3 20018 Tablet 130.00
4 20019 Desk 130.10
5 20020 Chair 335.64
6 20021 Modem 67.50
7 20022 Range Extender 20.45
Últimos 5 regstros
article_id article_name unit_price
26 20041 Usb Cable 2.95
27 20042 Sata Cable 2.14
28 20043 Pci Express Port 10.12
29 20044 Wi-Fi Card 59.61
30 20045 Mesh Wi-Fi X 2 32.50
Formato del dataframe
(31, 3)
Búsqueda de valores null por columna
article_id 0
article_name 0
unit_price 0
dtype: int64
Formato de los datos por columna
article_id int64
article_name object
unit_price object
dtype: object
Cantidad de filas
31
Datos del Indice
RangeIndex(start=0, stop=31, step=1)
Datos de las columnas
Index(['article_id', 'article_name', 'unit_price'], dtype='object')
Analisis de la columna 'unit_price'
-----------------------------------
Promedio : 186.64
Desvio std : 410.64
Varianza : 168,626.76
Minimo : 2.14
Q1 : 22.30
Mediana : 54.62
Q3 : 139.00
Maximo : 2,127.81
Rango : 2,125.67
Rango IQR : 116.70
Datos Atipicos : Menores a -152.75 y Mayores a 314.05
# 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 de datos de vendedores
----------------------------------
Muestra de datos
Registro de ejemplo
seller_name
seller_id
12 Brockie Patience
Primeros 8 regstros
seller_name
seller_id
1 Aveline Swanwick
2 Jase Doy
3 Oliviero Charkham
4 Cornie Wynrehame
5 Ewell Peres
6 Milly Christoffe
7 Kati Innot
8 Tobin Roselli
Últimos 5 regstros
seller_name
seller_id
11 Vasily Danilyuk
12 Brockie Patience
13 Arnold Kilkenny
14 Janel O'Curran
15 Daisie Slograve
Formato del dataframe
(15, 1)
Búsqueda de valores null por columna
seller_name 0
dtype: int64
Formato de los datos por columna
seller_name object
dtype: object
Cantidad de filas
15
Datos del Indice
Int64Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], dtype='int64', name='seller_id')
Datos de las columnas
Index(['seller_name'], dtype='object')
# 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()
Exploración de datos de órdenes
--------------------------------
Muestra de datos
Registro de ejemplo
order_id week article_id quantity seller_id country_name
914 15938 4 20019 6 4 Peru
Primeros 8 regstros
order_id week article_id quantity seller_id country_name
0 15024 1 20039 10 10 Peru
1 15025 1 20029 15 5 Peru
2 15026 1 20024 5 14 Bolivia
3 15027 1 20018 9 14 Brazil
4 15028 1 20035 6 15 Mexico
5 15029 1 20024 6 11 Peru
6 15030 1 20025 13 13 Colombia
7 15031 1 20029 14 14 Peru
Últimos 5 regstros
order_id week article_id quantity seller_id country_name
995 16019 4 20021 1 7 Brazil
996 16020 4 20040 15 15 Brazil
997 16021 4 20040 2 11 Colombia
998 16022 4 20018 14 11 Brazil
999 16023 4 20026 12 9 Brazil
Formato del dataframe
(1000, 6)
Búsqueda de valores null por columna
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Formato de los datos por columna
order_id int64
week int64
article_id int64
quantity int64
seller_id int64
country_name object
dtype: object
Cantidad de filas
1000
Datos del Indice
RangeIndex(start=0, stop=1000, step=1)
Datos de las columnas
Index(['order_id', 'week', 'article_id', 'quantity', 'seller_id',
'country_name'],
dtype='object')
Analisis de la columna 'quantity'
-----------------------------------
Promedio : 8.06
Desvio std : 4.33
Varianza : 18.72
Minimo : 1.00
Q1 : 4.00
Mediana : 8.00
Q3 : 12.00
Maximo : 15.00
Rango : 14.00
Rango IQR : 8.00
Datos Atipicos : Menores a -8.00 y Mayores a 24.00
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
article_id int64
article_name object
unit_price float64
dtype: object
# 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)
week quantity country_name article_name total_amount seller_name
0 1 10 Peru Water Cooling 675.0 Cirilo Grandham
1 1 15 Peru Mouse 454.5 Ewell Peres
2 1 5 Bolivia Netbook 725.0 Janel O'Curran
3 1 9 Brazil Tablet 1170.0 Janel O'Curran
4 1 6 Mexico Case 227.4 Daisie Slograve
.. ... ... ... ... ... ...
995 4 1 Brazil Modem 67.5 Kati Innot
996 4 15 Brazil Heatsink 150.0 Daisie Slograve
997 4 2 Colombia Heatsink 20.0 Vasily Danilyuk
998 4 14 Brazil Tablet 1820.0 Vasily Danilyuk
999 4 12 Brazil SDD 264.0 Onida Cosely
[1000 rows x 6 columns]
# 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']])
quantity total_amount
article_name
HDD 413 $ 22,558.06
Tablet 374 $ 48,620.00
SDD 372 $ 8,184.00
Mouse 322 $ 9,756.60
Netbook 320 $ 46,400.00
# 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())
article_name
Full Pc $ 538,335.93
Notebook $ 251,000.00
Smartphone $ 152,250.00
Chair $ 69,477.48
Tablet $ 48,620.00
Name: total_amount, dtype: float64
# 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))
quantity total_amount
seller_name
Janel O'Curran 703 $ 192,832.47
Brockie Patience 441 $ 142,709.88
Oliviero Charkham 555 $ 141,329.76
Vasily Danilyuk 521 $ 129,157.55
Daisie Slograve 554 $ 120,520.11
# 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']])
quantity total_amount
week
1 2449 $ 507,458.81
2 2444 $ 415,364.44
3 2114 $ 329,140.03
4 1058 $ 223,844.56
# 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']])
Artículos más vendidos por Argentina
quantity total_amount
article_name
CPU 104 $ 14,520.48
SDD 73 $ 1,606.00
HDD 68 $ 3,714.16
Range Extender 58 $ 1,186.10
Fan Cooler 47 $ 199.75
Ram Memory 46 $ 1,653.70
Mesh Wi-Fi X 2 46 $ 1,495.00
Full Pc 45 $ 95,751.45
Notebook 43 $ 43,000.00
Motherboard 39 $ 5,396.82
Artículos más vendidos por Brasil
quantity total_amount
article_name
Tablet 156 $ 20,280.00
HDD 119 $ 6,499.78
SDD 117 $ 2,574.00
Chair 112 $ 37,591.68
Pci Express Port 105 $ 1,062.60
Heatsink 103 $ 1,030.00
Power Supply 103 $ 4,526.85
Motherboard 101 $ 13,976.38
Desk 97 $ 12,619.70
Ram Memory 92 $ 3,307.40
Artículos más vendidos entre ambos países
quantity total_amount
article_name
SDD 190 $ 4,180.00
HDD 187 $ 10,213.94
CPU 186 $ 25,969.32
Tablet 156 $ 20,280.00
Range Extender 148 $ 3,026.60
# 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)
Evolución de ventas de Argentina y Brasil por semana
quantity total_amount
country_name week
Argentina 1 275 $ 63,760.48
2 413 $ 96,789.13
3 160 $ 26,601.97
4 99 $ 18,681.20
Brazil 1 765 $ 165,289.90
2 664 $ 106,803.85
3 646 $ 79,341.50
4 440 $ 89,836.60
# 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])
1er semana
total_amount
seller_name
Oliviero Charkham $ 74,581.19
Janel O'Curran $ 68,273.51
Jase Doy $ 55,769.68
Daisie Slograve $ 46,744.06
2da Semana
total_amount
seller_name
Brockie Patience $ 78,999.56
Aveline Swanwick $ 54,701.55
Janel O'Curran $ 45,775.99
Vasily Danilyuk $ 37,261.77
3er Semana
total_amount
seller_name
Janel O'Curran $ 46,716.37
Brockie Patience $ 45,482.32
Aveline Swanwick $ 28,297.45
Arnold Kilkenny $ 27,623.56
4ta Semana
total_amount
seller_name
Vasily Danilyuk $ 55,479.87
Janel O'Curran $ 32,066.60
Kati Innot $ 23,488.18
Aveline Swanwick $ 18,878.90
# 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'))
Mejor vendedor por pais en UNIDADES
country_name seller_name quantity
15 Argentina Cornie Wynrehame 110
14 Bolivia Ewell Peres 33
13 Brazil Aveline Swanwick 227
12 Chile Onida Cosely 36
11 Colombia Janel O'Curran 93
10 Costa Rica Oliviero Charkham 25
9 Ecuador Oliviero Charkham 26
8 El Salvador Janel O'Curran 17
7 Guatemala Jase Doy 43
6 Honduras Onida Cosely 43
5 Mexico Janel O'Curran 118
4 Paraguay Arnold Kilkenny 26
3 Peru Ewell Peres 115
2 Puerto Rico Ewell Peres 9
1 Uruguay Jase Doy 21
0 Venezuela Ewell Peres 46
Mejor vendedor por pais en IMPORTE
country_name seller_name total_amount
15 Argentina Janel O'Curran $ 34,971.47
14 Bolivia Kati Innot $ 10,750.37
13 Brazil Daisie Slograve $ 65,283.28
12 Chile Onida Cosely $ 6,769.80
11 Colombia Brockie Patience $ 33,654.38
10 Costa Rica Oliviero Charkham $ 24,021.21
9 Ecuador Oliviero Charkham $ 6,647.50
8 El Salvador Janel O'Curran $ 32,967.15
7 Guatemala Vasily Danilyuk $ 27,661.53
6 Honduras Oliviero Charkham $ 19,403.32
5 Mexico Jase Doy $ 29,096.30
4 Paraguay Aveline Swanwick $ 3,220.00
3 Peru Brockie Patience $ 46,089.88
2 Puerto Rico Ewell Peres $ 1,256.58
1 Uruguay Janel O'Curran $ 9,488.58
0 Venezuela Oliviero Charkham $ 33,961.53
# 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()
weekint64
quantityint64
Daisie Slograve
60
226
Aveline Swanwick
66
227
Arnold Kilkenny
47
184
Kati Innot
52
151
Tobin Roselli
54
211
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()
total_amount quantity
seller_name
Daisie Slograve $ 65,283.28 226
Aveline Swanwick $ 58,771.48 227
Arnold Kilkenny $ 47,243.54 184
Kati Innot $ 32,087.32 151
Tobin Roselli $ 31,997.93 211
Janel O'Curran $ 31,562.86 182
Onida Cosely $ 29,354.31 206
Jase Doy $ 28,493.25 149
Vasily Danilyuk $ 27,495.77 124
Milly Christoffe $ 21,247.38 161
Cirilo Grandham $ 21,061.74 158
Ewell Peres $ 15,253.22 91
Oliviero Charkham $ 14,951.72 195
Brockie Patience $ 10,756.96 125
Cornie Wynrehame $ 5,711.09 125
total_amount
seller_name
Daisie Slograve $ 65,283.28
Aveline Swanwick $ 58,771.48
Arnold Kilkenny $ 47,243.54
Kati Innot $ 32,087.32
Tobin Roselli $ 31,997.93
Janel O'Curran $ 31,562.86
Onida Cosely $ 29,354.31
Jase Doy $ 28,493.25
Vasily Danilyuk $ 27,495.77
Milly Christoffe $ 21,247.38
Cirilo Grandham $ 21,061.74
Ewell Peres $ 15,253.22
Oliviero Charkham $ 14,951.72
Brockie Patience $ 10,756.96
Cornie Wynrehame $ 5,711.09
seller_name quantity
0 Aveline Swanwick 227
1 Daisie Slograve 226
2 Tobin Roselli 211
3 Onida Cosely 206
4 Oliviero Charkham 195
5 Arnold Kilkenny 184
6 Janel O'Curran 182
7 Milly Christoffe 161
8 Cirilo Grandham 158
9 Kati Innot 151
10 Jase Doy 149
11 Brockie Patience 125
12 Cornie Wynrehame 125
13 Vasily Danilyuk 124
14 Ewell Peres 91