# 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 31.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 matplotlib.pyplot as plt
import seaborn as sns
#import openpyxl # para levantar excel de otros paqueres (no office)
# 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'])
#df_articles
#Vendedores
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
#df_sellers
#Ordenes
df_orders = pd.read_csv('/work/data/orders.csv')
#df_orders
#sql_query
df_articles
article_idint64
20015 - 20045
article_nameobject
Smartphone3.2%
Full Pc3.2%
29 others93.5%
0
20015
Smartphone
1
20016
Full Pc
2
20017
Monitor
3
20018
Tablet
4
20019
Desk
5
20020
Chair
6
20021
Modem
7
20022
Range Extender
8
20023
Notebook
9
20024
Netbook
# Exploración del df de artículos
print('Muestra de datos')
print(df_articles.head())
print('\nForma del dataframe')
print(df_articles.shape)
print('\nBuscar valores nulos')
print(df_articles.isnull().sum())
print('\nFormato de los datos del dataframe')
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
Forma del dataframe
(31, 3)
Buscar valores nulos
article_id 0
article_name 0
unit_price 0
dtype: int64
Formato de los datos del dataframe
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('\nForma del dataframe')
print(df_sellers.shape)
print('\nBuscar valores nulos')
print(df_sellers.isnull().sum())
print('\nFormato de los datos del dataframe')
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
Forma del dataframe
(15, 1)
Buscar valores nulos
seller_name 0
dtype: int64
Formato de los datos del dataframe
seller_name object
dtype: object
# Exploración del df de órdenes
print('Muestra de datos')
print(df_orders.head())
print('\nForma del dataframe')
print(df_orders.shape)
print('\nBuscar valores nulos')
print(df_orders.isnull().sum())
print('\nFormato de los datos del dataframe')
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
Forma del dataframe
(1000, 6)
Buscar valores nulos
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Formato de los datos del dataframe
order_id int64
week int64
article_id int64
quantity int64
seller_id int64
country_name object
dtype: object
# Cambar a float los precios unitarios
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 indice del df_articles
df_articles.set_index('article_id', inplace=True)
# Agrego 3 columnas y pongo el campo que me va a servir de "ancla" para buscar la información real.
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'])
print(df_articles)
article_name unit_price
article_id
20015 Smartphone 525.00
20016 Full Pc 2127.81
20017 Monitor 230.00
20018 Tablet 130.00
20019 Desk 130.10
20020 Chair 335.64
20021 Modem 67.50
20022 Range Extender 20.45
20023 Notebook 1000.00
20024 Netbook 145.00
20025 HDD 54.62
20026 SDD 22.00
20027 Ram Memory 35.95
20028 Motherboard 138.38
20029 Mouse 30.30
20030 Fan Cooler 4.25
20031 Webcam 20.07
20032 Keyboard 22.60
20033 Headphones 23.30
20034 Scanner 185.00
20035 Case 37.90
20036 Video Card 131.50
20037 CPU 139.62
20038 Power Supply 43.95
20039 Water Cooling 67.50
20040 Heatsink 10.00
20041 Usb Cable 2.95
20042 Sata Cable 2.14
20043 Pci Express Port 10.12
20044 Wi-Fi Card 59.61
20045 Mesh Wi-Fi X 2 32.50
#Reemplazar los valores reales en el df
for i in range (len(my_df.index)): #len(my_df.index) devuelva la cantidad de filas (registros)
#reemplazo el nombre del articulo usando el id guardado en my_df
article = df_articles.loc[my_df.loc[i]['article_id']]['article_name']
my_df.loc[i, 'article_name'] = article
#reemplazo el nombre del vendedor usando el id guardado en my_df
my_df.loc[i, 'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_id']]['seller_name']
#busco el pecio unitario y lo multiplico por la cantidad de unidades vendidas.
my_df.loc[i, 'total_amount'] = df_articles.loc[my_df.loc[i]['article_id']]['unit_price'] * my_df.loc[i, 'quantity']
#elimino las columnas que no utilizo
my_df.drop(['article_id', 'seller_id', 'order_id'], axis='columns', inplace=True)
print(my_df.head())
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
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
por_cantidad = my_df2.sort_values('quantity', ascending=False)
print(por_cantidad['quantity'].head(1))
article_name
HDD 413
Name: quantity, dtype: int64
#RESOLUCION GRAFICA <<<<<Mi propuesta de gráfico>>>>>
#my_df2_sort = my_df2.sort_values('quantity', ascending=False)
#my_df2_sort['quantity'].plot(kind='barh', color= 'green', alpha= 0.8)
plt.figure(figsize=(10,5))
plt.bar(por_cantidad.index, por_cantidad['quantity'],color= 'purple', alpha= 0.6, width=0.9)
plt.ylabel('Cantidad vendida')
plt.xlabel('Producto')
plt.title('Ventas por articulo')
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
mas_ingresos = my_df2.sort_values('total_amount', ascending=False).head()
print(mas_ingresos['total_amount'])
article_name
Full Pc 538335.93
Notebook 251000.00
Smartphone 152250.00
Chair 69477.48
Tablet 48620.00
Name: total_amount, dtype: float64
# RESOLUCIÓN GRÁFICA <<<<<Mi propuesta de gráfico2>>>>>
plt.figure(figsize =(10, 7))
x = [1, 2, 3, 4]
colors = plt.get_cmap('Purples')(np.linspace(0.2, 0.7, len(x)))
plt.pie(x=mas_ingresos['total_amount'], labels=mas_ingresos.index, colors = colors )
plt.title('Ingresos por articulo')
plt.show()
#prueba analitica <<<<<Mi propuesta. Pregunta3>>>>>
my_df2 = my_df.groupby('seller_name').sum()
mas_ingresos = my_df2.sort_values('total_amount', ascending=False).head()
print(mas_ingresos[['quantity']+ ['total_amount']].head(1))
quantity total_amount
seller_name
Janel O'Curran 703 192832.47
# RESOLUCIÓN GRÁFICA <<<<<Mi propuesta de gráfico. Pregunta3>>>>>
plt.figure(figsize=(10,5))
plt.barh(df3.index,df3['total_amount'],color= 'purple', alpha= 0.4)
plt.xlabel('ingresos generados')
plt.ylabel('Vendedor')
plt.title('Principales vendedores')
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 = my_df.groupby('week').sum()
print(df4)
quantity total_amount
week
1 2449 507458.81
2 2444 415364.44
3 2114 329140.03
4 1058 223844.56
# RESOLUCIÓN GRÁFICA <<<<<Mi propuesta de gráfico.Pregunta4>>>>>
plt.figure(figsize =(10, 7))
x = [1, 2, 3, 4]
colors = plt.get_cmap('Purples')(np.linspace(0.2, 0.7, len(x)))
week=['semana1','semana2','semana3', 'semana4']
#df4.index
plt.pie(x=df4['total_amount'], labels=week, colors = colors, autopct='%1.1f%%' )
plt.title('Ventas en el mes. Indicado por semana')
plt.show()
# RESOLUCIÓN Pregunta: Cuál es el país al que más se le vendió en el último mes?
df5 = my_df.groupby('country_name').sum().sort_values('total_amount', ascending = False)
print(df5[['total_amount']].head(5))
total_amount
country_name
Brazil 441271.85
Argentina 205832.78
Colombia 177514.29
Peru 161421.12
Mexico 138619.99
plt.bar(df5.index,df5['total_amount'],color= 'purple', alpha= 0.6, width=0.9)
plt.xlabel('Paises clientes')
plt.ylabel('Cantidad vendida')
plt.title('Principales clientes')
plt.xticks(rotation=75)
plt.show()
# RESOLUCIÓN PREGUNTA 6: CUAL ES PRODUCTO MÁS VENDIDO EN ARGENTINA (unidades)?
#primero obtengo todos los registros donde el pais sea Argentina
v10=my_df.loc[my_df['country_name'] =='Argentina']
print(v10)
week quantity country_name article_name total_amount \
11 1 4 Argentina Ram Memory 143.80
17 1 1 Argentina Range Extender 20.45
23 1 5 Argentina Water Cooling 337.50
27 1 4 Argentina Modem 270.00
33 1 7 Argentina Range Extender 143.15
.. ... ... ... ... ...
943 4 1 Argentina HDD 54.62
948 4 7 Argentina Mesh Wi-Fi X 2 227.50
976 4 7 Argentina Usb Cable 20.65
990 4 4 Argentina Motherboard 553.52
991 4 7 Argentina Keyboard 158.20
seller_name
11 Kati Innot
17 Ewell Peres
23 Onida Cosely
27 Janel O'Curran
33 Jase Doy
.. ...
943 Vasily Danilyuk
948 Arnold Kilkenny
976 Cornie Wynrehame
990 Cornie Wynrehame
991 Brockie Patience
[113 rows x 6 columns]
#segundo: ordeno de manera descendente los registros para obtener el articulo mas vendido
v10 = v10.groupby('article_name').sum()
por_cant = v10.sort_values('quantity', ascending=False)
print(por_cant['quantity'].head(1))
article_name
CPU 104
Name: quantity, dtype: int64
#resolución grafica Pregunta 6
plt.figure(figsize=(10,5))
plt.bar(por_cant.index, por_cant['quantity'],color= 'purple', alpha= 0.6, width=0.9)
plt.ylabel('Cantidad vendida')
plt.xlabel('Producto')
plt.title('Ventas por articulo en Argentina')
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN Promedio de los ingresos del producto más vendido en Argentina.
#a partir de la copia creada de my_df quiero el promedio de los productos
v11 = v10.groupby('article_name').mean()
por_cant11 = v11.sort_values('total_amount', ascending=False)
print(por_cant['total_amount'].head(5))
article_name
Full Pc 95751.45
Notebook 43000.00
CPU 14520.48
Smartphone 13125.00
Netbook 5655.00
Name: total_amount, dtype: float64
#RESOLUCIÓN GRÁFICA Pregunta 7
plt.figure(figsize=(10,5))
plt.bar(por_cant11.index, por_cant11['total_amount'],color= 'purple', alpha= 0.6, width=0.9)
plt.ylabel('Ingresos generados')
plt.xlabel('Producto')
plt.title('Promedio de ventas por articulo en Argentina')
plt.xticks(rotation=90)
plt.show()
#Al momento de analizar las ventas durante el mes, con la ayuda un grafico de torta (grafico 4)
#nos podemos dar cuenta de que las ventas caen al rededor de un 50% en la última semana
#comparadas con la primer semana del mismo mes, por lo que es el momento oportuno para impulsar
# una campaña de promociones y descuentos con el fin de levantar estas ventas.
#A nivel global podemos observar que el articulo con más demanda en el mercado es el HDD, sin embargo los
# mayores ingresos provienen del producto Full PC. Comparando a nivel local, en Argentina se comercializa
# más el producto CPU, siendo el producto Full PC el que genera más ingresos.
#En ambos casos la mayor rentabilidad proveniene del producto full PC.
#sería interesante analizar, a nivel estrategia comercial, la relación Ventas del producto Full Pc con
#la etapa del mes.