Trabajo Practico Integrador
Codo a Codo 4.0-Big Data
Alumna: Gisela Fredes - Comision 22039
# 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.1.2 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 as opxl
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'])
#se PUEDE SACAR UNA DE ESTAS PUES SON IGUALES .... VER SI ALGUNA NO SE UTILIZA PARA SACAR
#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())
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBúsqueda de valores nulos por Columna')
print(df_articles.isnull().sum())
print('\nFormato de los datos por columna')
print(df_articles.dtypes)
#Aca me mostro que el precio unitario es un objeto, para manejarlo mejor
#con los precios lo cambiare en PREPARACION a float
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 nulos 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())
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBúsqueda de valores nulos 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 nulos 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())
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBúsqueda de valores nulos 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 nulos 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)
#Lo corro a esta sentencia y luego corro la primera de exploracion y voala!!!
#Toma la columna entera de precio unitario y completa la cambia a float
#Creo una copia del df_orders
#Hago una copia del mas parecido y asi este lo modifico para treabajar
my_df = df_orders.copy()
#Cambio el indice del df_articles porque no lo necesito, es redundante con el articles_id
df_articles.set_index('article_id', inplace= True)
#Ahora trabajamos en las columnas de my_df que debo agregar y pongo el campo que
# va a servir para anclar
my_df = my_df.assign(article_name = my_df['article_id'])
my_df = my_df.assign(seller_name = my_df['seller_id'])
#Utilizo la misma columna que en el anterior porque
#De aqui obtengo precio y cantidad
my_df = my_df.assign(total_amount = my_df['article_id'])
# reemplazo los valores en el nuevo df
#Columna article_name
# Busco el nombre del artículo y lo asigno a una variable(article)
# Uso article_id, para ubicarme en el registro que busco
# Y extraer el nombre del artículo , mismo procedimiento para las otras dos columnas
for i in range(len(my_df.index)):
#nombre de Articulo
article = df_articles.loc[my_df.loc[i]['article_id']]['article_name']
#Lo asignamos
my_df.loc[i,'article_name'] = article
#Total de Ventas
total = my_df.loc[ i,'quantity'] * df_articles.loc[my_df.loc[i]['article_id']]['unit_price']
#Lo asignamos
my_df.loc[i,'total_amount'] = total
#Nombre Vendedor
Vendedor = df_sellers.loc[my_df.loc[i]['seller_id']]['seller_name']
#lo asignamos
my_df.loc[i, 'seller_name'] = Vendedor
#Borro las columnas que no necesito
my_df.drop(['order_id', 'article_id', 'seller_id'], axis = 'columns', inplace = True)
print(my_df)
week quantity country_name article_name seller_name total_amount
0 1 10 Peru Water Cooling Cirilo Grandham 675.0
1 1 15 Peru Mouse Ewell Peres 454.5
2 1 5 Bolivia Netbook Janel O'Curran 725.0
3 1 9 Brazil Tablet Janel O'Curran 1170.0
4 1 6 Mexico Case Daisie Slograve 227.4
.. ... ... ... ... ... ...
995 4 1 Brazil Modem Kati Innot 67.5
996 4 15 Brazil Heatsink Daisie Slograve 150.0
997 4 2 Colombia Heatsink Vasily Danilyuk 20.0
998 4 14 Brazil Tablet Vasily Danilyuk 1820.0
999 4 12 Brazil SDD Onida Cosely 264.0
[1000 rows x 6 columns]
# RESOLUCIÓN ANALÍTICA
# Para determinar cual es el producto más vendido debo crear unn nuevo dataframe que
# Contenga el nombre del producto y la cantidad total vendida de ese producto
# ordenado de mayor a menor
dfmasvedido = my_df.groupby('article_name').sum()
# me muestra los productos vendidos por semana, la cantidad y el tota de ventas de ese producto
cantidad = dfmasvedido.sort_values('quantity', ascending= False)
print(cantidad['quantity'].head(1))
article_name
HDD 413
Name: quantity, dtype: int64
# RESOLUCIÓN GRÁFICA
sns.barplot(y=cantidad['quantity'], x=cantidad.index, palette = 'RdYlGn')
plt.xticks(rotation = 90)
plt.title('Ventas De Articulos')
plt.xlabel('Artículos')
plt.ylabel('Cantidad')
plt.show()
#En el siguiente grafico vemos que el mayor producto vendido
#Corresponde con la resolucion Analitica
# RESOLUCIÓN ANALÍTICA
dfingresos = dfmasvedido.sort_values('total_amount',ascending=False)
print(dfingresos)
week quantity total_amount
article_name
Full Pc 70 253 538335.93
Notebook 69 251 251000.00
Smartphone 74 290 152250.00
Chair 56 207 69477.48
Tablet 90 374 48620.00
Monitor 53 208 47840.00
Netbook 95 320 46400.00
Scanner 54 221 40885.00
Motherboard 79 291 40268.58
CPU 66 266 37138.92
Desk 60 223 29012.30
Video Card 65 209 27483.50
HDD 113 413 22558.06
Water Cooling 73 252 17010.00
Modem 64 244 16470.00
Power Supply 81 269 11822.55
Ram Memory 66 293 10533.35
Mouse 71 322 9756.60
Wi-Fi Card 47 141 8405.01
SDD 86 372 8184.00
Case 54 206 7807.40
Mesh Wi-Fi X 2 64 213 6922.50
Range Extender 78 281 5746.45
Headphones 77 239 5568.70
Webcam 68 229 4596.03
Keyboard 44 165 3729.00
Pci Express Port 89 291 2944.92
Heatsink 79 280 2800.00
Fan Cooler 64 205 871.25
Usb Cable 93 273 805.35
Sata Cable 82 264 564.96
# RESOLUCIÓN GRÁFICA
sns.barplot(dfingresos.index,dfingresos['total_amount'])
plt.title('Ingresos por Artículo')
plt.xticks(rotation = 90)
plt.xlabel('Artículos')
plt.ylabel('Total de Ventas')
plt.show()
#Aqui Resolvi con un barplot, en vez de la solucion que dieron en el curso.
#Pues mostrar los 5 primeros resultados no representa el total de la muestra
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
# RESOLUCIÓN ANALÍTICA
mvendedor = (my_df.groupby(by='seller_name').sum()).sort_values('total_amount',ascending=False)
print(mvendedor[['quantity']+['total_amount']])
quantity total_amount
seller_name
Janel O'Curran 703 192832.47
Brockie Patience 441 142709.88
Oliviero Charkham 555 141329.76
Vasily Danilyuk 521 129157.55
Daisie Slograve 554 120520.11
Aveline Swanwick 629 118874.33
Arnold Kilkenny 583 94552.04
Kati Innot 512 83704.62
Jase Doy 582 80628.31
Ewell Peres 496 78144.32
Onida Cosely 535 77373.37
Milly Christoffe 442 61733.69
Tobin Roselli 519 56984.42
Cornie Wynrehame 523 52253.57
Cirilo Grandham 470 45009.40
# RESOLUCIÓN GRÁFICA
plt.bar(mvendedor.index,mvendedor['total_amount'],color=['yellow', 'red', 'green', 'blue', 'cyan'])
plt.xticks(rotation=90)
plt.title('Mejor Vendedor')
plt.xlabel('Vendedor')
plt.ylabel('Total de ventas')
plt.show()
#Aqui notamos que la mejor vendedora es Janet O'Curran
# RESOLUCIÓN ANALÍTICA
ventasxmes=(my_df.groupby(by='week').sum()).sort_values('total_amount',ascending=False)
print(ventasxmes)
quantity total_amount
week
1 2449 507458.81
2 2444 415364.44
3 2114 329140.03
4 1058 223844.56
# RESOLUCIÓN GRÁFICA
plt.suptitle(t='Ventas Por Semana', y=0.9, fontsize='xx-large')
plt.pie(ventasxmes['total_amount'], labels= ventasxmes.index, autopct='%1.1f%%')
# RESOLUCIÓN
#Cual es el top de los cino paises que mas vendieron
rpaises=(my_df.groupby(by='country_name').sum()).sort_values('total_amount',ascending=False).head(5)
print(rpaises['total_amount'])
#Utilizo el metodo que he usado hasta ahora pero lo acoto a los primeros cinco resultado
country_name
Brazil 441271.85
Argentina 205832.78
Colombia 177514.29
Peru 161421.12
Mexico 138619.99
Name: total_amount, dtype: float64
#Resolucion Grafica
#Con un grafico de barras queda una respuesta contundente
sns.barplot(y=rpaises['total_amount'], x=rpaises.index )
#Aqui podemos observar con mas claridad que las ventas son superadoras en brazil
#Y relativamente iguales en los otros
# RESOLUCIÓN
# ¿Cual es la semana de mayor venta para cada pais?
# Obtener total x semana x pais
pais_semana = my_df.groupby(['country_name', 'week']).sum()
# Lista de paises
paises = my_df.groupby('country_name').sum().index.values
# Creo el DF final
df_final = pd.DataFrame(columns=['Semana', 'Ventas'], index=paises)
for p in paises:
df = pais_semana.loc[p]
v = df.max()['total_amount']
s = df[(df['total_amount'] == v)].index[0]
df_final.loc[p] = {'Semana': s, 'Ventas': v}
df_final['Semana'] = df_final['Semana'].astype(int)
print(df_final)
#En donde muestro la mejor semana de ventas por pais
Semana Ventas
Argentina 2 96789.13
Bolivia 1 13033.19
Brazil 1 165289.9
Chile 2 12876.41
Colombia 3 69473.9
Costa Rica 2 27962.3
Ecuador 2 12085.96
El Salvador 3 31917.15
Guatemala 4 27770.08
Honduras 1 24953.09
Mexico 1 58549.25
Paraguay 2 5669.0
Peru 2 56591.8
Puerto Rico 1 1256.58
Uruguay 2 14562.58
Venezuela 1 54262.85
# RESOLUCIÓN
#¿Cuales son los productos menos vendidos por paises
# Previsualizar el DF final
# -------------------------
# "País" "Artículo" "Ventas"
# Pais1 art monto
# Pais2 art monto
# 1) Obtener total x artículo x pais
df_pais_articulo = my_df.groupby(['country_name', 'article_name']).sum()
# 2) Obtener la lista de paises
paises = my_df.groupby('country_name').sum().index.values
# 3) Creo el DF final, pero aún sin datos
my_df6 = pd.DataFrame(columns=['Artículo', 'Ventas'], index=paises)
# 4) Procesar el DF df_pais_articulo y obtener las ventas minimas x artículo y guardarlas en my_df5
for p in paises:
df = df_pais_articulo.loc[p]
v = df.min()['total_amount']
a = df[(df['total_amount'] == v)].index[0]
my_df6.loc[p] = {'Artículo': a, 'Ventas': v}
my_df6 = my_df6.sort_values(['Artículo', 'Ventas'])
my_df6.reset_index(inplace=True, drop=False)
my_df6.columns = ['País','Artículo', 'Ventas']
print(my_df6)
País Artículo Ventas
0 Ecuador Heatsink 10.0
1 Argentina Pci Express Port 70.84
2 Guatemala Range Extender 20.45
3 Colombia Sata Cable 4.28
4 Venezuela Sata Cable 14.98
5 Mexico Sata Cable 17.12
6 Chile Sata Cable 23.54
7 Honduras Sata Cable 27.82
8 Costa Rica Sata Cable 34.24
9 El Salvador Sata Cable 34.24
10 Brazil Sata Cable 121.98
11 Paraguay Usb Cable 5.9
12 Puerto Rico Usb Cable 8.85
13 Bolivia Usb Cable 61.95
14 Uruguay Webcam 20.07
15 Peru Webcam 100.35