# A veces necesitamos instalar nuevas librerías en nuestros proyectos
# "!" para instalar librería desde el intérprete...sino se instala desde la consola
!pip install openpyxl==3.0.10
#luego no hace falta importarla
# imports
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sqlite3 as sql3
import seaborn as sns
# Levanto los datos en 3 diferentes dataframes
# ARTÍCULOS
#Creo una conexion y le digo la fuente de los datos
con = sql3.connect("/work/data/articles.db")
#pandas tiene un método para leer los querys de sql
sql_query = pd.read_sql_query("SELECT * FROM articles", con) ###VER INDEX_COL DEL DF_SELLERS
#creo el Data frame
df_articles = pd.DataFrame(sql_query, columns= ["article_id", "article_name", "unit_price"])
print(df_articles)
#VENDEDORES
#creo el df de vendedores
df_sellers = pd.read_excel("/work/data/sellers.xlsx", index_col= 0) #con index elegí cuál quiero que sea mí índice
print(df_sellers)
#ÓRDENES
df_orders = pd.read_csv("/work/data/orders.csv")
print(df_orders)
# Exploración del df de artículos
print("Muestra de datos")
print(df_articles.head())
print("\nFormato del dataframe")
print(df_articles.shape)
print("\n Búsqueda de valores nulos")
print(df_articles.isnull().sum()) #primero evalua si hay nulos y luego los suma
print("\n Formato de los datos")
print(df_articles.dtypes) #si es un atributo no lleva () luego de la orden
# Exploración del df de vendedores
print("Muestra de datos")
print(df_sellers.head())
print("\nFormato del dataframe")
print(df_sellers.shape)
print("\n Búsqueda de valores nulos")
print(df_sellers.isnull().sum()) #primero evalua si hay nulos y luego los suma
print("\n Formato de los datos")
print(df_sellers.dtypes) #si es un atributo no lleva () luego de la orden
# Exploración del df de órdenes
print("Muestra de datos")
print(df_orders.head())
print("\nFormato del dataframe")
print(df_orders.shape)
print("\n Búsqueda de valores nulos")
print(df_orders.isnull().sum()) #primero evalua si hay nulos y luego los suma
print("\n Formato de los datos")
print(df_orders.dtypes) #si es un atributo no lleva () luego de la orden
df_articles ["unit_price"] = df_articles["unit_price"].astype(float)
print(df_articles.dtypes)
#CREO UNA COPIA DEL df_orders por si se rompe
my_df = df_orders.copy()
#realizo mi pendiente en el comentario, cambio el índice del df_articles
#saca la primera columna que enumeraba del 0 al 31
df_articles.set_index("article_id", inplace= True) #inplace me aplica el cambio directo en el df, es otra forma de nombrar los índices análoga al index_col del df_sellers
print(df_articles)
#print(df_articles.loc[20017]["article_name"]) #ver en video 11.11hs
print(my_df.head())
#agrego las columnas que me faltan
my_df = my_df.assign(article_name = my_df["article_id"]) #assign crea una columna con el nombre (article_name) y le pone el contenido que le asigno
my_df = my_df.assign(total_amount = my_df["article_id"])
my_df = my_df.assign(seller_name = my_df["seller_id"])
#ESTE BLOQUE NO SE PUEDE CORRER MÁS DE UNA VEZ PORQUE NO VA A PODER OPERAR SOBRE LOS CAMBIOS REALIZADOS.
#reemplazar los datos en las nuevas columnas
#print(len(my_df.index))
for i in range(len(my_df.index)):
#columna article_name
#cargo el nombre del artículo en una variable
article = df_articles.loc[my_df.loc[i]['article_name']]['article_name']
#se lo asigno a la columna y registro que corresponde
my_df.loc[i, "article_name"] = article
#columna total_amount
my_df.loc[i, "total_amount"] = my_df.loc[i, "quantity"] * df_articles.loc[my_df.loc[i]['total_amount']]['unit_price']
#columna de seller_name
my_df.loc[i,'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_name']]['seller_name']
print(my_df.head())
#elimino las columnas que no necesito
my_df.drop(['order_id','article_id','seller_id'], axis='columns', inplace=True)
#inplace= True es para que me lo haga en este df y no modifique el df original
print(my_df)
# RESOLUCIÓN ANALÍTICA
#creo un nuevo df para agrupar por articles
my_df2 = my_df.groupby("article_name").sum() #el criterio de agrupamiento se convierte en el índice
por_cant = my_df2.sort_values("quantity", ascending = False)
print(por_cant["quantity"].head(1))
# RESOLUCIÓN GRÁFICA
plt.figure(figsize=(8,5))
font = {'family': 'serif',
'color': 'darkred',
'weight': 'normal',
'size': 16,
}
sns.displot(my_df, x = "article_name", color="darkcyan") #gráfica de distribución
plt.ylabel("Cantidad de artículos vendidos")
plt.xlabel("Artículo")
plt.xticks(rotation = 90)
plt.title("Venta de artículos por unidades", fontdict= font, loc= "left")
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df3= (my_df.groupby("article_name").sum().sort_values("total_amount", ascending= False)).head(10)
print(my_df3)
print (my_df3["total_amount"].head(1))
# RESOLUCIÓN GRÁFICA
fig = plt.figure(figsize=(8, 5) )
font2 = {'family': 'serif',
'color': 'olive',
'weight': 'normal',
'size': 16,
}
#sns.scatterplot(data=my_df3, x="quantity", y= my_df3.index, color="darkred", size= round(my_df3["total_amount"], 2), legend="full", alpha = 0.7, sizes=(20, 1500))
plt.barh(my_df3.index, my_df3["total_amount"], color="darkcyan")
plt.title("Artículo que más ingresos proporcionó\n", loc="left", fontdict= font)
plt.xlabel("Monto total de ingresos (en u$d)")
plt.ylabel("Productos")
#plt.yticks(rotation=60)
plt.show()
# RESOLUCIÓN ANALÍTICA
df4 = (my_df.groupby("seller_name").sum()).sort_values("total_amount", ascending=False)
print(df4[["quantity"]+["total_amount"]])
# RESOLUCIÓN GRÁFICA
plt.bar(df4.index, df4["total_amount"], color="darkcyan")
plt.xticks(rotation=90)
plt.xlabel("Vendedor/a")
plt.ylabel("Monto total")
plt.title("Ventas por vendedor(en u$d)", fontdict=font, loc="left")
plt.show()
# RESOLUCIÓN ANALÍTICA
df5 =(my_df.groupby("week").sum()).sort_values("total_amount", ascending=False)
print(df5)
# RESOLUCIÓN GRÁFICA
fig = plt.figure()
c=["black", "dimgrey", "darkgrey", "lightgrey"]
plt.bar(df5.index, df5["total_amount"], color= c, tick_label=[1,2,3,4] )
plt.xlabel("Semana")
plt.ylabel("Monto total vendido (en u$d)")
plt.title("Monto total vendido por semana\n", fontdict=font, loc="left")
plt.show()
# RESOLUCIÓN
df_pais_fact = ((my_df.groupby("country_name")).sum().sort_values("total_amount", ascending=False)).head(5)
df_pais_art = ((my_df.groupby("country_name")).sum().sort_values("quantity", ascending=False)).head(5)
print(df_pais_fact["total_amount"], df_pais_art["quantity"])
#RESOLUCIÓN GRÁFICA
font3 = {'family': 'serif',
'color': 'darkred',
'weight': 'normal',
'size': 15,
}
c = ["gold", "olivedrab", "lightcoral", "teal", "purple"]
plt.figure(figsize=(20, 15))
#TRABAJO CON LA GRÁFICA DE FACTURACIÓN
plt.subplot(2, 2, 1)
plt.bar(df_pais_fact.index, df_pais_fact["total_amount"], color=c)
plt.ylabel('monto total en US$', fontdict=font3)
plt.yticks(rotation=45)
plt.title("Ventas: top 5 países", loc="left", fontdict=font3)
plt.subplot(2, 2, 2)
plt.pie(x= df_pais_fact["quantity"], labels=df_pais_fact.index, autopct= "%1.2f%%", explode = (0.1, 0,0,0,0), colors=c)
plt.title("Top five países, monto total.\n Distribución porcentual.", loc="right", fontdict=font3)
#TRABAJO CON LA GRÁFICA DE CANTIDAD DE PRODUCTOS
plt.subplot(2, 2, 3)
plt.bar(df_pais_art.index, df_pais_art["quantity"], color= c)
plt.ylabel('Artículos totales', fontdict=font3)
plt.yticks(rotation=45)
plt.title("Cantidad de productos: top 5 países", loc="left", fontdict=font3)
plt.subplot(2, 2, 4)
plt.pie(x= df_pais_art["quantity"], labels=df_pais_art.index, autopct= "%1.2f%%", explode = (0.1, 0,0,0,0), colors=c)
plt.title("Top five países, cantidad de productos.\n Distribución porcentual.\n", loc="right", fontdict=font3)
# RESOLUCIÓN
dff6 = my_df[((my_df['article_name'] == 'Notebook')| (my_df['article_name']=='Smartphone')) & ((my_df['country_name'] == 'Argentina') | (my_df['country_name']=='Brazil')| (my_df['country_name']=='Peru'))]
df6 = dff6.drop(["week", "total_amount", "seller_name"], axis="columns")
#borro del df las columnas que no voy a utilizar
df6 = dff6.drop(["week", "total_amount", "seller_name"], axis="columns")
sns.barplot(x= df6["country_name"], y = df6["quantity"], hue= "article_name", data=df6)
plt.xlabel("")
plt.ylabel("")
plt.title("Tendencia de venta de unidades de\n Notebooks y Smartphones en\n Argentina, Brasil y Perú.", loc= "right", fontdict=font)
# RESOLUCIÓN ANALÍTICA
my_df77= (my_df.groupby(["article_name"]).sum().sort_values("quantity", ascending= False).head(20))
my_df7=my_df77.drop("week", axis="columns")
print (my_df7)
# RESOLUCIÓN GRÁFICA
fig = plt.figure(figsize=(8, 8) )
font2 = {'family': 'serif',
'color': 'olive',
'weight': 'normal',
'size': 16,
}
#sns.scatterplot(x=my_df7["quantity"], y= my_df7.index, color="tab:purple", size= round(my_df3["total_amount"], 2), legend=True, alpha = 0.9, sizes=(2000, 35000))
sns.scatterplot(my_df7["quantity"], my_df7.index, color="tab:purple", size= round(my_df7["total_amount"], 2), alpha=0.8, sizes=(20, 3000))
plt.title("Artículos que más ingresos proporcionó\n", loc="left", fontdict= font2)
plt.show()