# A veces necesitamos instalar nuevas librerías en nuestros proyectos
!pip install openpyxl==3.0.10
Collecting openpyxl==3.0.10
Downloading openpyxl-3.0.10-py2.py3-none-any.whl (242 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 242.1/242.1 KB 13.5 MB/s eta 0:00:00
Collecting et-xmlfile
Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)
Installing collected packages: et-xmlfile, openpyxl
Successfully installed et-xmlfile-1.1.0 openpyxl-3.0.10
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 # para que levante bien el excel
import matplotlib.pyplot as plt
import seaborn as sns
# Configuracion de graficos
sns.set(style="darkgrid")
# 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())
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) #unit_price es un objet, hay que cambiarlo 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
# 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
# Encuentro un inconveniente en la columna de precios de los artículos.
# Necesito cambiar el formato cadena a float.
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
# Creo una copia del df_orders
my_df = df_orders.copy()
# Cambio el índice del df de artículos
df_artic = df_articles.set_index('article_id',inplace = False)
# Agrego algunas columnas y pongo el campo que me va a servir de "ancla" para acordarme
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'])
# reemplazo los valores en el nuevo df
# 1. busco el nombre del artículo y lo asigno a una variable
# como df_articles está indexado por article_id, lo uso para ubicarme en
# el registro que busco
# 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
for i in range(len(my_df.index)): # len(my_df.index) devuelve la cantidad de registros
id_articulo = my_df.loc[i]['article_id']
nombreArticulo = df_artic.loc[id_articulo]['article_name']
# se lo asigno a la columna correspondiente
my_df.loc[i,'article_name'] = nombreArticulo
# Obtenemos total_amount
precioArticulo = df_artic.loc[id_articulo]['unit_price']
my_df.loc[i, "total_amount"] = my_df.loc[i, "quantity"] * precioArticulo
# Obtenemos seller_name
id_vendedor = my_df.loc[i]['seller_id']
nombreVendedor = df_sellers.loc[id_vendedor]['seller_name']
my_df.loc[i, "seller_name"] = nombreVendedor
# elimino las columnas que no necesito
my_df.drop(['order_id', 'article_id', 'seller_id'], axis = 'columns', inplace=True)
my_df.head
article_name
HDD 413
Name: Cantidad, dtype: int64
Los 5 articulos que mas ingresos proporcionaron
quantity total_amount
article_name
Full Pc 253 538335.93
Notebook 251 251000.00
Smartphone 290 152250.00
Chair 207 69477.48
Tablet 374 48620.00
Janel O'Curran genero mas ingresos este mes
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
Ventas a lo largo del mes
week
1 507458.81
2 415364.44
3 329140.03
4 223844.56
Name: total_amount, dtype: float64
Cantidad Monto Total
country_name
Brazil 2515 441271.85
Peru 1027 161421.12
Argentina 947 205832.78
Colombia 881 177514.29
Mexico 846 138619.99
Venezuela 320 77684.52
Honduras 303 36763.56
Chile 231 24660.98
Guatemala 202 52579.25
Bolivia 181 22682.80
Costa Rica 145 34606.50
Ecuador 129 17475.30
Paraguay 123 8195.12
El Salvador 111 57391.26
Uruguay 92 17843.09
Puerto Rico 12 1265.43
Cantidad de articulos vendidos por semana
week
1 2449
2 2444
3 2114
4 1058
Name: quantity, dtype: int64
# RESOLUCIÓN
# 1)
df_art_semana = my_df.groupby(['article_name', 'week']).sum()
#print(df_art_semana)
# 2) Obtener la lista de articulos
articulos = my_df.groupby('article_name').sum().index.values
#print(paises)
# 3) Creo el DF final
df_final = pd.DataFrame(columns=['Semana', 'Cantidad'], index=articulos)
#print(df_final)
# 4) Procesar el DF df_art_semana y obtener las ventas maximas (en unidades) x semana
# y guardarlas en df_final
for a in articulos:
df = df_art_semana.loc[a]
c = df.max()['quantity']
s = df[(df['quantity'] == c)].index[0]
df_final.loc[a] = {'Semana': s, 'Cantidad': c}
df_final['Semana'] = df_final['Semana'].astype(int)
df_final['Cantidad'] = df_final['Cantidad'].astype(int)
print(df_final)
g = sns.barplot(data = df_final, x = df_final.index, y = 'Cantidad', hue = 'Semana')
g.set_xticklabels(labels=df_final.index, rotation=90)
plt.xlabel("Articulos")
plt.title("Pico de ventas por articulo durante el mes")
plt.show()
Semana Cantidad
CPU 2 89
Case 3 78
Chair 2 80
Desk 2 124
Fan Cooler 1 58
Full Pc 1 97
HDD 2 158
Headphones 3 95
Heatsink 2 110
Keyboard 1 61
Mesh Wi-Fi X 2 3 87
Modem 2 96
Monitor 1 72
Motherboard 1 102
Mouse 2 125
Netbook 1 124
Notebook 1 95
Pci Express Port 1 96
Power Supply 2 122
Ram Memory 1 113
Range Extender 1 100
SDD 1 153
Sata Cable 2 98
Scanner 3 101
Smartphone 2 93
Tablet 3 148
Usb Cable 3 72
Video Card 1 78
Water Cooling 3 80
Webcam 1 74
Wi-Fi Card 2 45