Trabajo Practico Integrador - CAC Big Data
Leonardo Hernan Guzman Comision 22614
# 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
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'])
# 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()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBúsqueda de valores null por columna')
print(df_articles.isnull().sum())
print('\nFormato de los datos por columna')
print(df_articles.dtypes)
# Exploración del df de vendedores
print('Muestra de datos')
print(df_sellers.head()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBúsqueda de valores null 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()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBúsqueda de valores null 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() # shallow copy
# Cambio el indice del df de artículos
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'])
# print(df_articles)
# print()
# my_df
for i in range(max(my_df.count())):
# print(i)
# 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 (article_name) de df_articles (tabla)
# print(df_articles.loc[my_df.loc[i ,'article_id']]['article_name'])
article = df_articles.loc[my_df.loc[i ,'article_id']]['article_name']
# print(article)
# Asignar a cada valor id de la columna 'article_name' de my_df, el nombre del artículo
my_df.loc[i, 'article_name'] = article
#my_df
# hacemos lo mismo con total_amount
my_df.loc[i, 'total_amount'] = my_df.loc[i, 'quantity']*df_articles.loc[my_df.loc[i ,'article_id']]['unit_price']
#my_df
# Columna de seller name
my_df.loc[i, 'seller_name'] = df_sellers.loc[my_df.loc[i ,'seller_id']]['seller_name']
# elimino las columnas que no necesito de my_df
my_df.drop(['order_id', 'article_id', 'seller_id'], axis='columns', inplace=True)
print(my_df)
#my_df
# my_df.loc[:, 'quantity']
# my_df.loc[:, ['quantity','country_name']]
# my_df.loc[0:5, ['quantity','country_name']]
# my_df.iloc[:, 1]
# my_df.iloc[:, [1,2]]
# my_df.iloc[0:6, [1,2]]
my_df.iloc[0:5, [1,2]]
# RESOLUCIÓN ANALÍTICA
# Tomamos article_name como una columna más
df7 = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False).reset_index()
print(df7.head())
df7_2 = df7[['article_name', 'quantity']].groupby('article_name').sum('quantity').sort_values('quantity', ascending=False)
print(df7_2.head())
# RESOLUCIÓN GRÁFICA
# Opción - barplot
sns.barplot(data=df7, x=df7.index, y='quantity')
plt.xticks(rotation=90) # 'vertical'
plt.show()
# RESOLUCIÓN ANALÍTICA
df2 = my_df.groupby(by='article_name').sum().sort_values('total_amount', ascending=False).head(5)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df2['total_amount'])
# 'article_name' es el index
# RESOLUCIÓN GRÁFICA
plt.pie(x=df2['total_amount'], labels=df2.index, autopct='%1.2f%%')
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 = my_df.groupby(by='seller_name').sum().sort_values('total_amount', ascending=False)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df4[['quantity'] + ['total_amount']].head(5))
# RESOLUCIÓN GRÁFICA
plt.bar(df4.index, df4['total_amount'])
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
df5 = my_df.groupby(by='week').sum().sort_values('total_amount', ascending=False)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df5[['quantity'] + ['total_amount']])
# RESOLUCIÓN GRÁFICA
plt.bar(df5.index, df5['total_amount'])
plt.show()
Conclusion: las ventas tienen su pico mas alto a principio de mes y luego van disminuyendo, a partir de la 2da semana seria prudente comenzar con la campaña de promociones tratando de evitar la caida.
5. ¿Cuales son los paises con mayor venta en monto? Comparo dos paises.
¿Cual es el producto que mas se vende en cantidad?
# RESOLUCIÓN
# Ventas filtrado por país. Comparar 2 países
# Cuál es el producto que más se vende, en qué cantidad
# Resolución Analítica y Gráfica
dfpaises = my_df.groupby(by='country_name').sum().sort_values('total_amount', ascending=False).head()
print(dfpaises)
print()
dfarticulos = my_df.groupby(by='article_name').sum().sort_values('quantity', ascending=False).head()
print(dfarticulos)
plt.subplot(2,3,1)
plt.title('Articulos por cantidad')
sns.barplot(data=dfarticulos, x=dfarticulos.index, y='quantity')
plt.xticks(rotation=90)
plt.subplot(2,3,3)
plt.title('Monto, ventas por pais')
sns.barplot(data=dfpaises, x=dfpaises.index, y='total_amount')
plt.xticks(rotation=90)
dfm2paises = my_df.groupby(by='country_name').sum().sort_values('total_amount', ascending=False).head(2)
plt.subplot(2,3,5)
plt.pie(dfm2paises['total_amount'], labels=dfm2paises.index, autopct='%1.2f%%')
plt.show()
Los articulos mas vendidos por cantidad son los discos rigidos si bien no es lo que proporciona mas monto de facturacion.
El pais con mayor cantidad de monto vendido es Brazil, seguido de lejos por Argentina y el resto.
# RESOLUCIÓN
# Evolución de Ventas por producto.
# Tomar 2 países y 'week' como variable categórica
# Resolución Analítica y Gráfica
dfpaisess = my_df.groupby(by=['country_name']).sum().sort_values('total_amount', ascending=False).reset_index()
paises = dfpaisess.head(2)['country_name'].values
dfpaises2 = my_df.groupby(by=['article_name', 'week']).sum().sort_values('article_name').reset_index()
dfpaises3 = my_df.loc[my_df['country_name'].isin(paises)]
dfpaises3 = dfpaises3.groupby(by=['country_name', 'week']).sum().sort_values('country_name').reset_index()
print(dfpaises3)
print()
fig = plt.figure()
axes = fig.add_subplot()
plt.title('Cantidad articulos por semana')
sns.lineplot(data=dfpaises2.head(4 * 5), x='week', y='quantity', hue='article_name')
plt.show()
fig = plt.figure()
axes=fig.add_subplot()
plt.title('Monto vendido por semana')
sns.lineplot(data=dfpaises3, x='week', y='total_amount', hue='country_name')
plt.show()
7. ¿Que productos vendio mas el mejor vendedor? en cantidad y monto total. Comparo los dos paises en los que mas vendio
# RESOLUCIÓN
# Mejor vendedor/producto. Mostrar importe/cantidad. Comparar 2 países (variable categórica)
# Resolución Analítica y Gráfica
print("Mejor vendedor Janel O'Curran por cantidad y monto total")
dfvendedor1 = my_df.loc[my_df['seller_name'] == "Janel O'Curran"].groupby(by = 'article_name').sum().sort_values('quantity', ascending=False).head().reset_index()
print(dfvendedor1[['article_name', 'quantity']])
print()
dfvendedor2 = my_df.loc[my_df['seller_name'] == "Janel O'Curran"].groupby(by = 'article_name').sum().sort_values('total_amount', ascending=False).head().reset_index()
print(dfvendedor2[['article_name', 'total_amount']])
print()
plt.subplot(2,3,1)
sns.barplot(data=dfvendedor1, x=dfvendedor1.index, y='quantity')
plt.xticks(rotation=90)
plt.subplot(2,3,3)
sns.barplot(data=dfvendedor2, x=dfvendedor2.index, y='total_amount')
plt.xticks(rotation=90)
plt.show()
dfvendedorpaises = my_df.loc[my_df['seller_name']== "Janel O'Curran"].groupby(by = ['country_name']).sum().sort_values('total_amount', ascending=False).head().reset_index()
print()
print(dfvendedorpaises)
paisesB = dfvendedorpaises.head(2)['country_name'].values
dfvendedorpaises3 = my_df.loc[my_df['country_name'].isin(paisesB)]
dfvendedorpaises3 = dfvendedorpaises3.groupby(by=['country_name', 'week']).sum().sort_values('country_name').reset_index()
fig = plt.figure()
axes=fig.add_subplot()
plt.title('Monto vendido por semana')
sns.lineplot(data=dfvendedorpaises3, x='week', y='total_amount', hue='country_name')
plt.show()
Podemos observar que tambien se caen sus ventas a fin de mes mas que nada en Argentina