Federico Firmani Roma
TP FINAL INTEGRADOR. Comisión #22039
# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
import numpy as np
import pandas as pd
import sqlite3 as sql3
import openpyxl # para que levante bien el excel
import matplotlib.pyplot as plt
import seaborn as sns
# Artículos
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)
# Órdenes
df_orders = pd.read_csv('/work/data/orders.csv')
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)
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)
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)
print(df_articles.dtypes)
my_df = df_orders.copy()
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(len(my_df.index)):
idArticulo = my_df.loc[i]['article_id']
nombreArticulo = df_articles.loc[idArticulo]['article_name']
my_df.loc[i,'article_name'] = nombreArticulo
precioArticulo = df_articles.loc[idArticulo]['unit_price']
cantArticulo = my_df.loc[i]['quantity']
my_df.loc[i,'total_amount'] = precioArticulo * cantArticulo
idVendedor = my_df.loc[i]['seller_id']
nombreVendedor = df_sellers.loc[idVendedor]['seller_name']
my_df.loc[i,'seller_name'] = nombreVendedor
my_df.drop(['order_id', 'article_id', 'seller_id'], axis = 'columns', inplace=True)
print(my_df)
# RESOLUCIÓN ANALÍTICA
my_df2=my_df.groupby('article_name').sum()
por_cant = my_df2.sort_values('quantity', ascending=False)
print(por_cant['quantity'].head(1))
# RESOLUCIÓN GRÁFICA
mas_vendidos = por_cant.head()
sns.set_theme(style="whitegrid")
sns.barplot(y=mas_vendidos["quantity"], x=mas_vendidos.index, palette="Blues_d")
plt.ylabel("Cantidad")
plt.xlabel("Artículo")
plt.title("Artículo más vendido")
plt.xticks(rotation=60)
plt.show()
# RESOLUCIÓN ANALÍTICA
#Puedo utilizar el DataFrame my_df2 del item anterior
por_total = my_df2.sort_values('total_amount', ascending=False)
print(por_total['total_amount'].head(1))
# RESOLUCIÓN GRÁFICA
top_10 = por_total.head()
sns.set_theme(style="whitegrid")
plt.barh(top_10.index,top_10['total_amount'] , height=0.8, color = "Salmon")
plt.xlabel("Artículos")
plt.ylabel("Monto vendido")
plt.title("Artículos que proporcionaron más ingresos")
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 = (my_df.groupby(by='seller_name').sum()).sort_values('total_amount',ascending=False)
print(df4[['quantity']+['total_amount']])
# RESOLUCIÓN GRÁFICA
mejores_vendedores = df4.head(10)
sns.set_theme(style="whitegrid")
plt.bar(mejores_vendedores.index,mejores_vendedores['total_amount'], color="Salmon")
plt.xticks(rotation=60, ha="right")
plt.xlabel("Vendedores")
plt.ylabel("Total vendido")
plt.title("Monto vendido por cada vendedor")
plt.show()
# RESOLUCIÓN ANALÍTICA
df5 = (my_df.groupby(by='week').sum()).sort_values('total_amount',ascending=False)
df5['Semana'] = df5.index
df5 = df5.set_index('Semana')
print(df5)
#Convendría lanzar una campaña de promociones cerca de fin de mes, cuando las ventas decaen
# RESOLUCIÓN GRÁFICA
sns.barplot(y=df5["total_amount"], x=df5.index, palette="Blues_d")
plt.xlabel("Semanas")
plt.ylabel("Monto vendido")
plt.title("Monto vendido por semana")
plt.show()
# RESOLUCIÓN
# ¿Cuales son los 5 paises que menos compraron en el mes?
por_paises = (my_df.groupby(by='country_name').sum()).sort_values('total_amount',ascending=True)
print(por_paises['total_amount'].head(5))
plt.bar(por_paises.index,por_paises['total_amount'], color="salmon")
plt.xticks(rotation=60, ha="right")
plt.xlabel("Países")
plt.ylabel("Monto vendido")
plt.title("Monto vendido por país")
plt.show()
# RESOLUCIÓN
df_pais_semana = my_df.groupby(['country_name', 'week']).sum()
#print(df_pais_semana)
paises = my_df.groupby('country_name').sum().index.values
#print(paises)
df_final = pd.DataFrame(columns=['Semana', 'Ventas'], index=paises)
#print(df_final)
for p in paises:
df = df_pais_semana.loc[p]
v = df.min()['total_amount']
s = df[(df['total_amount'] == v)].index[0]
df_final.loc[p] = {'Semana': s, 'Ventas': v}
df_final['Paises'] = df_final.index
df_final['Semana'] = df_final['Semana'].astype(int)
df_peores=df_final
values= ['Puerto Rico','Paraguay', 'Ecuador', 'Uruguay','Bolivia']
filtered_df = df_peores[df_peores.Paises.isin(values)]
df_filtrado = filtered_df.set_index('Paises')
print(df_filtrado)
#Se obtiene un DataFrame con las peores semanas de los peores países.
# RESOLUCIÓN
df_pais_vendedor = my_df.groupby(['country_name', 'seller_name']).sum()
#print(df_pais_vendedor)
paises = my_df.groupby('country_name').sum().index.values
df_ya_casi = pd.DataFrame(columns=['Vendedor', 'Ventas'], index=paises)
for p in paises:
df = df_pais_vendedor.loc[p]
v = df.max()['total_amount']
s = df[(df['total_amount'] == v)].index[0]
df_ya_casi.loc[p] = {'Vendedor': s, 'Ventas': v}
df_ya_casi['Paises'] = df_ya_casi.index
#print(df_ya_casi)
values= ['Puerto Rico','Paraguay', 'Ecuador', 'Uruguay','Bolivia']
filtro = df_ya_casi[df_ya_casi.Paises.isin(values)]
df_terminado = filtro.set_index('Paises')
print(df_terminado)
#Se obtiene un DataFrame con los mejores vendedores de los 5 peores países en ventas.