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
# 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
# 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)
# 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)
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)
# 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))
# 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)
# 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
# RESOLUCIÓN ANALÍTICA
mvendedor = (my_df.groupby(by='seller_name').sum()).sort_values('total_amount',ascending=False)
print(mvendedor[['quantity']+['total_amount']])
# 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)
# 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
#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
# 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)