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
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.
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)
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
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
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)
print(df_articles.dtypes)
article_id int64
article_name object
unit_price float64
dtype: object
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)
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]
# 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))
article_name
HDD 413
Name: quantity, dtype: int64
# 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))
article_name
Full Pc 538335.93
Name: total_amount, dtype: float64
# 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']])
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
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
quantity total_amount
Semana
1 2449 507458.81
2 2444 415364.44
3 2114 329140.03
4 1058 223844.56
# 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()
country_name
Puerto Rico 1265.43
Paraguay 8195.12
Ecuador 17475.30
Uruguay 17843.09
Bolivia 22682.80
Name: total_amount, dtype: float64
# 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.
Semana Ventas
Paises
Bolivia 4 411.44
Ecuador 1 67.5
Paraguay 4 690.0
Puerto Rico 2 8.85
Uruguay 4 164.98
# 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.
Vendedor Ventas
Paises
Bolivia Kati Innot 10750.37
Ecuador Oliviero Charkham 6647.5
Paraguay Aveline Swanwick 3220.0
Puerto Rico Ewell Peres 1256.58
Uruguay Janel O'Curran 9488.58