Trabajo Practico Integrador - CAC Big Data
Leonardo Hernan Guzman Comision 22614
# 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
# 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'])
# Vendedores
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
# Ordenes
df_orders = pd.read_csv('/work/data/orders.csv')
# Exploración del df de artículos
print('Muestra de datos')
print(df_articles.head()) # head() 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)
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
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
# Exploración del df de vendedores
print('Muestra de datos')
print(df_sellers.head()) # head() 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)
Muestra de datos
seller_name
seller_id
1 Aveline Swanwick
2 Jase Doy
3 Oliviero Charkham
4 Cornie Wynrehame
5 Ewell Peres
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
# Exploración del df de órdenes
print('Muestra de datos')
print(df_orders.head()) # head() 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)
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
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
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
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'])
# print(df_articles)
# print()
# my_df
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)
#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]
# my_df.loc[:, 'quantity']
# my_df.loc[:, ['quantity','country_name']]
# my_df.loc[0:5, ['quantity','country_name']]
# my_df.iloc[:, 1]
# my_df.iloc[:, [1,2]]
# my_df.iloc[0:6, [1,2]]
my_df.iloc[0:5, [1,2]]
quantityint64
country_nameobject
0
10
Peru
1
15
Peru
2
5
Bolivia
3
9
Brazil
4
6
Mexico
# RESOLUCIÓN ANALÍTICA
# 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())
article_name week quantity total_amount
0 HDD 113 413 $ 22,558.06
1 Tablet 90 374 $ 48,620.00
2 SDD 86 372 $ 8,184.00
3 Mouse 71 322 $ 9,756.60
4 Netbook 95 320 $ 46,400.00
quantity
article_name
HDD 413
Tablet 374
SDD 372
Mouse 322
Netbook 320
# RESOLUCIÓN GRÁFICA
# Opción - barplot
sns.barplot(data=df7, x=df7.index, y='quantity')
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
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()
Conclusion: las ventas tienen su pico mas alto a principio de mes y luego van disminuyendo, a partir de la 2da semana seria prudente comenzar con la campaña de promociones tratando de evitar la caida.
5. ¿Cuales son los paises con mayor venta en monto? Comparo dos paises.
¿Cual es el producto que mas se vende en cantidad?
# RESOLUCIÓN
# Ventas filtrado por país. Comparar 2 países
# Cuál es el producto que más se vende, en qué cantidad
# Resolución Analítica y Gráfica
dfpaises = my_df.groupby(by='country_name').sum().sort_values('total_amount', ascending=False).head()
print(dfpaises)
print()
dfarticulos = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False).head()
print(dfarticulos)
plt.subplot(2,3,1)
plt.title('Articulos por cantidad')
sns.barplot(data=dfarticulos, x=dfarticulos.index, y='quantity')
plt.xticks(rotation=90)
plt.subplot(2,3,3)
plt.title('Monto, ventas por pais')
sns.barplot(data=dfpaises, x=dfpaises.index, y='total_amount')
plt.xticks(rotation=90)
dfm2paises = my_df.groupby(by='country_name').sum().sort_values('total_amount', ascending=False).head(2)
plt.subplot(2,3,5)
plt.pie(dfm2paises['total_amount'], labels=dfm2paises.index, autopct='%1.2f%%')
plt.show()
week quantity total_amount
country_name
Brazil 717 2515 $ 441,271.85
Argentina 241 947 $ 205,832.78
Colombia 230 881 $ 177,514.29
Peru 266 1027 $ 161,421.12
Mexico 237 846 $ 138,619.99
week quantity total_amount
article_name
HDD 113 413 $ 22,558.06
Tablet 90 374 $ 48,620.00
SDD 86 372 $ 8,184.00
Mouse 71 322 $ 9,756.60
Netbook 95 320 $ 46,400.00
Los articulos mas vendidos por cantidad son los discos rigidos si bien no es lo que proporciona mas monto de facturacion.
El pais con mayor cantidad de monto vendido es Brazil, seguido de lejos por Argentina y el resto.
# RESOLUCIÓN
# Evolución de Ventas por producto.
# Tomar 2 países y 'week' como variable categórica
# Resolución Analítica y Gráfica
dfpaisess = my_df.groupby(by=['country_name']).sum().sort_values('total_amount', ascending=False).reset_index()
paises = dfpaisess.head(2)['country_name'].values
dfpaises2 = my_df.groupby(by=['article_name', 'week']).sum().sort_values('article_name').reset_index()
dfpaises3 = my_df.loc[my_df['country_name'].isin(paises)]
dfpaises3 = dfpaises3.groupby(by=['country_name', 'week']).sum().sort_values('country_name').reset_index()
print(dfpaises3)
print()
fig = plt.figure()
axes = fig.add_subplot()
plt.title('Cantidad articulos por semana')
sns.lineplot(data=dfpaises2.head(4 * 5), x='week', y='quantity', hue='article_name')
plt.show()
fig = plt.figure()
axes=fig.add_subplot()
plt.title('Monto vendido por semana')
sns.lineplot(data=dfpaises3, x='week', y='total_amount', hue='country_name')
plt.show()
country_name week quantity total_amount
0 Argentina 1 275 $ 63,760.48
1 Argentina 2 413 $ 96,789.13
2 Argentina 3 160 $ 26,601.97
3 Argentina 4 99 $ 18,681.20
4 Brazil 1 765 $ 165,289.90
5 Brazil 2 664 $ 106,803.85
6 Brazil 3 646 $ 79,341.50
7 Brazil 4 440 $ 89,836.60
7. ¿Que productos vendio mas el mejor vendedor? en cantidad y monto total. Comparo los dos paises en los que mas vendio
# RESOLUCIÓN
# Mejor vendedor/producto. Mostrar importe/cantidad. Comparar 2 países (variable categórica)
# Resolución Analítica y Gráfica
print("Mejor vendedor Janel O'Curran por cantidad y monto total")
dfvendedor1 = my_df.loc[my_df['seller_name'] == "Janel O'Curran"].groupby(by = 'article_name').sum().sort_values('quantity', ascending=False).head().reset_index()
print(dfvendedor1[['article_name', 'quantity']])
print()
dfvendedor2 = my_df.loc[my_df['seller_name'] == "Janel O'Curran"].groupby(by = 'article_name').sum().sort_values('total_amount', ascending=False).head().reset_index()
print(dfvendedor2[['article_name', 'total_amount']])
print()
plt.subplot(2,3,1)
sns.barplot(data=dfvendedor1, x=dfvendedor1.index, y='quantity')
plt.xticks(rotation=90)
plt.subplot(2,3,3)
sns.barplot(data=dfvendedor2, x=dfvendedor2.index, y='total_amount')
plt.xticks(rotation=90)
plt.show()
dfvendedorpaises = my_df.loc[my_df['seller_name']== "Janel O'Curran"].groupby(by = ['country_name']).sum().sort_values('total_amount', ascending=False).head().reset_index()
print()
print(dfvendedorpaises)
paisesB = dfvendedorpaises.head(2)['country_name'].values
dfvendedorpaises3 = my_df.loc[my_df['country_name'].isin(paisesB)]
dfvendedorpaises3 = dfvendedorpaises3.groupby(by=['country_name', 'week']).sum().sort_values('country_name').reset_index()
fig = plt.figure()
axes=fig.add_subplot()
plt.title('Monto vendido por semana')
sns.lineplot(data=dfvendedorpaises3, x='week', y='total_amount', hue='country_name')
plt.show()
Mejor vendedor Janel O'Curran por cantidad y monto total
article_name quantity
0 HDD 75
1 Range Extender 62
2 Full Pc 56
3 Netbook 41
4 Tablet 38
article_name total_amount
0 Full Pc $ 119,157.36
1 Notebook $ 17,000.00
2 Smartphone $ 16,800.00
3 Netbook $ 5,945.00
4 Tablet $ 4,940.00
country_name week quantity total_amount
0 Argentina 23 91 $ 34,971.47
1 Colombia 26 93 $ 33,333.03
2 El Salvador 4 17 $ 32,967.15
3 Brazil 49 182 $ 31,562.86
4 Guatemala 2 17 $ 17,000.00
Podemos observar que tambien se caen sus ventas a fin de mes mas que nada en Argentina