# 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_articulos = pd.DataFrame(sql_query)
#Vendedores
df_vendedores = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
#df_sellers
#Ordenes
df_ordenes = pd.read_csv('/work/data/orders.csv')
df_ordenes
order_idint64
15024 - 16023
weekint64
1 - 4
0
15024
1
1
15025
1
2
15026
1
3
15027
1
4
15028
1
5
15029
1
6
15030
1
7
15031
1
8
15032
1
9
15033
1
# Exploración del df de artículos
print('Muestra de datos')
print(df_articulos.head())
print('\nForma del dataframe')
print(df_articulos.shape)
print('\nBuscar valores nulos')
print(df_articulos.isnull().sum())
print('\nFormato de los datos del dataframe')
print(df_articulos.dtypes)
Muestra de datos
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
Forma del dataframe
(31, 3)
Buscar valores nulos
article_id 0
article_name 0
unit_price 0
dtype: int64
Formato de los datos del dataframe
article_id int64
article_name object
unit_price object
dtype: object
# Exploración del df de vendedores
print('Muestra de datos')
print(df_vendedores.head())
print('\nForma del dataframe')
print(df_vendedores.shape)
print('\nBuscar valores nulos')
print(df_vendedores.isnull().sum())
print('\nFormato de los datos del dataframe')
print(df_vendedores.dtypes)
Muestra de datos
seller_name
seller_id
1 Aveline Swanwick
2 Jase Doy
3 Oliviero Charkham
4 Cornie Wynrehame
5 Ewell Peres
Forma del dataframe
(15, 1)
Buscar valores nulos
seller_name 0
dtype: int64
Formato de los datos del dataframe
seller_name object
dtype: object
# Exploración del df de órdenes
print('Muestra de datos')
print(df_ordenes.head())
print('\nForma del dataframe')
print(df_ordenes.shape)
print('\nBuscar valores nulos')
print(df_ordenes.isnull().sum())
print('\nFormato de los datos del dataframe')
print(df_ordenes.dtypes)
Muestra de datos
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
Forma del dataframe
(1000, 6)
Buscar valores nulos
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Formato de los datos del dataframe
order_id int64
week int64
article_id int64
quantity int64
seller_id int64
country_name object
dtype: object
# Cambiar a float los precios unitarios
df_articulos['unit_price'] = df_articulos['unit_price'].astype(float)
print(df_articulos.dtypes)
article_id int64
article_name object
unit_price float64
dtype: object
#Creo una copia del df_ordenes
my_df = df_ordenes.copy()
# Cambio el indice del df_articles
df_articulos.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(my_df)
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
.. ... ... ... ... ... ...
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
article_name total_amount seller_name
0 20039 20039 10
1 20029 20029 5
2 20024 20024 14
3 20018 20018 14
4 20035 20035 15
.. ... ... ...
995 20021 20021 7
996 20040 20040 15
997 20040 20040 11
998 20018 20018 11
999 20026 20026 9
[1000 rows x 9 columns]
# 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_articulos.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_vendedores.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_articulos.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())
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
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
por_cantidad = my_df2.sort_values('quantity', ascending=False)
print(por_cantidad['quantity'].head(1))
article_name
HDD 413
Name: quantity, dtype: int64
# Otra RESOLUCIÓN ANALÍTICA
my_df2b = my_df.groupby('article_name').sum()
res = my_df2b['quantity'].max()
df_mask = my_df2b['quantity'] == res
filtered_my_df2b = my_df2b[df_mask]
print(filtered_my_df2b)
week quantity total_amount
article_name
HDD 113 413 22558.06
# RESOLUCIÓN GRÁFICA
sns.barplot(x=my_df2.index, y=my_df2['quantity'], data = my_df2, order=my_df2.sort_values('quantity', ascending=False).index).set(title='Ventas por articulo')
plt.xlabel('Cantidad vendida')
plt.ylabel('Producto')
plt.xticks(rotation=90)
plt.show()
#my_df2_sort = my_df2.sort_values('quantity', ascending=False)
#my_df2_sort['quantity'].plot(kind='barh', color= 'green', alpha= 0.8)
plt.figure(figsize=(5,8))
plt.barh(por_cantidad.index, por_cantidad['quantity'],color= 'green', alpha= 0.8)
plt.xlabel('Cantidad vendida')
plt.ylabel('Producto')
plt.title('Unidades vendidas por producto')
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
mas_ingresos = my_df2.sort_values('total_amount', ascending=False).head()
print(mas_ingresos['total_amount'].head(1))
article_name
Full Pc 538335.93
Name: total_amount, dtype: float64
# RESOLUCIÓN GRÁFICA
# OJO: Solo graficamos los 5 primeros productos, si ponemos el porcentaje de cada uno en el grafico,
# no sería el numero real.
plt.pie(x=mas_ingresos['total_amount'], labels=mas_ingresos.index)
plt.show()
Mejor Vendedor del Mes = Janel O'Curran
# RESOLUCIÓN GRÁFICA
plt.bar(df3.index,df3['total_amount'],color='green')
plt.xticks(rotation=90)
plt.xlabel('Vendedor')
plt.ylabel('Venta mensual (U$S)')
plt.title('Venta Mensual por Vendedor')
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 = my_df.groupby('week',as_index=False).sum()
print(df4)
week quantity total_amount
0 1 2449 507458.81
1 2 2444 415364.44
2 3 2114 329140.03
3 4 1058 223844.56
# RESOLUCIÓN GRÁFICA
df4['week'] = df4['week'].astype(str)
plt.bar(df4['week'],df4['total_amount'],width=0.4, color='orange', align='center')
plt.xlabel('Semana')
plt.ylabel('Venta (U$S)')
plt.title('Venta Semanal')
plt.show()
La campaña debería realizarse durante la primer semana del mes dado que es dónde se registran las mayores.
# RESOLUCIÓN
df5 = my_df.groupby('country_name',as_index=False).sum().sort_values('total_amount', ascending = False)
print(df5[['country_name']+['quantity']+['total_amount']].head(1))
country_name quantity total_amount
2 Brazil 2515 441271.85
plt.bar(df5['country_name'],df5['total_amount'],width=0.6,color='yellowgreen')
plt.xticks(rotation=90)
plt.xlabel('País')
plt.ylabel('Venta mensual (U$S)')
plt.title('Venta Mensual por País')
plt.show()
# RESOLUCIÓN
df_mask = my_df['country_name'] == 'Brazil'
#print(df_mask)
my_df_br = my_df[df_mask]
#print(df_br)
df6 = my_df_br.groupby('article_name',as_index=False).sum().sort_values('total_amount', ascending = False)
print(df6[['article_name']+['quantity']+['total_amount']].head())
df6q = df6.sort_values('quantity', ascending = False)
print(df6q[['article_name']+['quantity']+['total_amount']].head())
article_name quantity total_amount
5 Full Pc 63 134052.03
16 Notebook 83 83000.00
24 Smartphone 79 41475.00
2 Chair 112 37591.68
25 Tablet 156 20280.00
article_name quantity total_amount
25 Tablet 156 20280.00
6 HDD 119 6499.78
21 SDD 117 2574.00
2 Chair 112 37591.68
17 Pci Express Port 105 1062.60
plt.pie(x=df6['total_amount'], labels=df6['article_name'],autopct='%1.2f%%')
plt.title('Producto con mayor ingreso en ventas en Brasil')
plt.show()
sns.barplot(x=df6q['article_name'], y=df6q['quantity'], data=df6q).set(title='Unidades Vendidas por Artículo en Brasil')
plt.xlabel('Producto')
plt.ylabel('Cantidad vendida')
plt.xticks(rotation=90)
plt.show()
# agrupo los datos por país y vendedor
df7 = my_df.groupby(['country_name','seller_name']).sum().sort_values('total_amount', ascending = False)
print(df7.head(10))
# agrupo los datos por país y artículo
df8 = my_df.groupby(['country_name','article_name']).sum().sort_values('total_amount', ascending = False)
print(df8.head(10))
# grafico el artículo y el monto total vendido agrupado por país
sns.relplot(x='article_name', y='total_amount', hue='country_name', data=df8).set(title='Ventas por Artículo y por País')
plt.xticks(rotation=90)
plt.xlabel('Artículo')
plt.ylabel('Venta mensual (U$S)')
plt.show()
week quantity total_amount
country_name seller_name
Brazil Daisie Slograve 60 226 65283.28
Aveline Swanwick 66 227 58771.48
Arnold Kilkenny 47 184 47243.54
Peru Brockie Patience 15 49 46089.88
Argentina Janel O'Curran 23 91 34971.47
Venezuela Oliviero Charkham 4 25 33961.53
Colombia Brockie Patience 14 70 33654.38
Janel O'Curran 26 93 33333.03
El Salvador Janel O'Curran 4 17 32967.15
Argentina Brockie Patience 9 44 32553.20
week quantity total_amount
country_name article_name
Brazil Full Pc 17 63 134052.03
Argentina Full Pc 10 45 95751.45
Brazil Notebook 20 83 83000.00
Colombia Full Pc 11 34 72345.54
Peru Full Pc 9 24 51067.44
Venezuela Full Pc 5 21 44684.01
Mexico Notebook 17 44 44000.00
Argentina Notebook 16 43 43000.00
Brazil Smartphone 19 79 41475.00
El Salvador Full Pc 4 19 40428.39
# RESOLUCIÓN
sns.pairplot(my_df, hue='country_name')
Las ventas en Brasil son las más altas seguidas por las de Argentina.
Entre los productos más vendidos se encuentran la Full PC y Notebooks.
Siendo la primer semana de ventas la más alta y más propicia para hacer campañas de marketing.