# IMPORTACIONES
import sqlite3 as sq3
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from IPython.display import display
# CONEXION Y CREACIÓN DE DFs
conn = sq3.connect('/work/Mi_proyecto/Consigna 6/netflix_oscar (1).db')
dfs = {
"df_content":pd.read_sql_query("SELECT * FROM content",conn),
"df_oscar": pd.read_sql_query("SELECT * FROM oscar",conn),
"df_production": pd.read_sql_query("SELECT * FROM production",conn)
}
conn.close()
Run to view results
#Comprobando la cración de los DataFramne
display(dfs['df_content'].head())
print()
display(dfs['df_oscar'].head())
print()
display(dfs['df_production'].head())
print()
Run to view results
def analizar_columnas(columna):
no_nulos = columna.count()
nulos = columna.isnull().sum()
distintos = columna.nunique()
vacios = (columna == " ").sum()
return pd.Series([no_nulos,nulos,distintos,vacios], index = ["No_nulos","Nulos","Distintos","Vacios"])
dfs_analisis = {tabla : pd.DataFrame for tabla in dfs}
# print(dfs_analisis) para ver el diccionaro que creé con llaves "df_content","df_oscar","df_production" y DataFrames vacios
#Itero los items de mi dfs donde guardé los datos y asigno en mi dfs_analisis
for tabla, df in dfs.items():
dfs_analisis[tabla] = df.apply(analizar_columnas)
#Donde h es la llave e i es el valor del diccionario dfs_analisis.
#Nótese que el valor de este diccionario es un DataFrame que "llenamos" aplicando la fórmula en la iteración de arriba
for h, i in dfs_analisis.items():
print(f"{h}:")
display(i)
print()
Run to view results
# Consultas específicas a DF
#Asignamos a 3 variables los valores de los dataframes de las llaves de los diccionarios dfs
df_content = dfs["df_content"].fillna('')
df_oscar = dfs["df_oscar"].fillna('')
df_production = dfs["df_production"].fillna('')
#Respondiendo la pregunta i
print('Respuesta pregunta i')
display(df_content.loc[:,['type','title_content','country','rating','duration','listed_in']])
#Respondiendo la pregunta ii
print('Respuesta pregunta ii')
display(df_content.loc[df_content['country'].str.contains('Argentina'),\
['id_content','type','title_content','cast','rating','duration','listed_in']]
)
#Respondiendo la pregunta iii
print('Respuesta pregunta iii')
display(df_production.loc[df_production['imdb_score']>7.5,['title_production','genre','language','imdb_score']])
#Respondiendo la pregunta iv
print('Respuesta pregunta iv')
frances_90 = df_production.loc[(df_production['runtime']>90)&(df_production['language']=='French')]
df_joineado = pd.merge(frances_90,df_content, how= 'inner', on= 'id_content')
display(df_joineado.loc[:,['title_production','type','runtime','imdb_score']]\
.sort_values('imdb_score',ascending=False).reset_index(drop=True)
)
Run to view results
df_set_total = pd.read_csv('/work/Mi_proyecto/Consigna 6/set_total.csv')
df_set_total
#Respondiendo la pregunta i
df_set_total.duplicated().sum()
df_set_total.drop_duplicates(inplace=True)
#Respondiendo la pregunta ii
df_set_total.dtypes
df_set_total['id_content']=df_set_total['id_content'].fillna(0).astype('int64')
df_set_total['id_content']
Run to view results
#Matplotlib
df_content = dfs["df_content"]
df_production = dfs["df_production"]
df_oscar = dfs["df_oscar"]
print("Respuesta i")
#Configuracion del estilo
sns.set(style="whitegrid")
#Configuracion del grafico de pastel
fig,ax=plt.subplots()
ax.pie(df_content["type"].value_counts(), labels=df_content["type"].value_counts().index,autopct="%.2f%%",\
colors=sns.color_palette('pastel')
)
#Creando el circulo blanco para que sea un grafico de dona
centre_circle = plt.Circle((0,0),0.30,fc='white')
fig = plt.gcf()
fig.gca().add_artist(centre_circle)
ax.axis('equal')
#Se coloca el titulo del grafico
ax.set_title("Relación entre películas y series")
#Se muestra el grafico
plt.show()
print("Respuesta ii")
#Limpiamos datos para finalmente plotear
#Dropeamos nulos
df_limpio = df_content[["type","country"]].dropna(subset=["country"])
#Borrar las cooperaciones
df_limpio = df_limpio[~df_limpio["country"].str.contains(",")]
df_limpio
#Creación de tabla dinámica (pivot_table)
df_limpio_agrupado = df_limpio.pivot_table(index="country",columns="type",aggfunc="size",fill_value=0)
#Creo columna nueva para tener el total de títulos
df_limpio_agrupado["Total"]=df_limpio_agrupado["Movie"]+df_limpio_agrupado["TV Show"]
#Ordeno y me quedo solo con el top10
top_10_ordenado = df_limpio_agrupado.sort_values("Total",ascending=False).head(10)
#Borro columna total que ya cumplió su misión
top_10_ordenado.drop("Total",axis="columns",inplace=True)
#Configuración del estilo de seaborn (para cambiar paleta de colores)
sns.set(style="whitegrid")
#Selecciono la paleta de colores azul pastel
colores_azules_pastel = sns.color_palette("pastel", n_colors=len(top_10_ordenado.columns))
fig,barras= plt.subplots()
top_10_ordenado.plot(kind="bar",width=0.8,ax=barras, color=colores_azules_pastel)
#Inclino los títulos de los países en el eje x
barras.set_xticklabels(barras.get_xticklabels(), rotation=45, ha="right")
barras.set_title("Top 10 paises con más producciones")
plt.show()
Run to view results
#Seaborn
df_content = dfs["df_content"]
df_production = dfs["df_production"]
df_oscar = dfs["df_oscar"]
print('Respuesta i')
#Limpiamos datos
#Dropeamos nulos en la columna "director"
df_limpio_directores = df_content.dropna(subset=["director"])
#Borramos las cooperaciones
df_limpio_directores = df_limpio_directores[~df_limpio_directores["director"].str.contains(",")]
df_limpio_directores
#Configuramos el estilo de seaborn
sns.set(style="whitegrid")
#Obtenemos el top 20 de directores con más producciones
top_directores = df_limpio_directores["director"].value_counts().head(20)
#display(top_directores)
# Selecciono una paleta de colores azul en un degradado
colores_azul_degradado = sns.color_palette("Blues", n_colors=20)[::-1]
#Creo el gráfico de barras con Seaborn
plt.figure(figsize=(12, 8))
sns.barplot(x=top_directores.values, y=top_directores.index, palette=colores_azul_degradado)
#Establezco el título
plt.title("Top 20 Directores con más producciones")
#Muestro el gráfico
plt.show()
print('Respuesta ii')
#Dropeamos nulos en la columna "listed_in"
df_limpio_generos = df_content.dropna(subset=["listed_in"])
#Borramos las cooperaciones
df_limpio_generos = df_limpio_generos[~df_limpio_generos["listed_in"].str.contains(",")]
df_limpio_generos
#Configuración del estilo de seaborn (opcional)
sns.set(style="whitegrid")
#Obtén el top 20 de géneros con más producciones
top_generos = df_limpio_generos["listed_in"].value_counts().head(20)
#Selecciono una paleta de colores en un degradado y la invierto
colores_degradado = sns.color_palette("viridis", n_colors=20)[::-1]
#Crear el gráfico de barras con Seaborn y colores en degradado
plt.figure(figsize=(12, 8))
sns.barplot(x=top_generos.values, y=top_generos.index, palette=colores_degradado)
#Establezco el título correctamente
plt.title("Top 20 Géneros de Netflix con más producciones")
#Rotación de las etiquetas del eje y para mejorar la legibilidad
plt.xticks(rotation=45, ha="right")
#Muestra el gráfico
plt.show()
print('Respuesta iii')
#Dropeo nulos
df_limpio_content = df_content[["type","rating"]].dropna()
gen_cnt = df_limpio_content['rating'].value_counts().sort_values(ascending=False)
orden = gen_cnt.index
#Selecciono una paleta de colores personalizada
colores_personalizados = ["#001F3F", "#003366"]
fig, ax1 = plt.subplots(figsize=(16, 9))
#Uso la paleta de colores personalizada y ajusto el tamaño de los números en las barras
sns.countplot(data=df_limpio_content, x='rating', hue='type', palette=colores_personalizados, order=orden)
#Aumento el tamaño de los números en las barras
for bar in ax1.patches:
ax1.annotate(
f'{int(bar.get_height())}',
xy=(bar.get_x() + bar.get_width() / 2, bar.get_height()),
ha='center',
va='center',
size=12, # Ajusta el tamaño de los números
xytext=(0, 5),
textcoords='offset points'
)
ax1.set_yticks(range(0, 2200, 400))
ax1.set_title('Clasificación por tipo de contenido')
plt.show()
print('Respuesta iv')
#Dropeamos nulos y filtramos por películas que no son en inglés
df_limpio_idiomas = df_production.dropna(subset=["language"])
df_limpio_idiomas = df_limpio_idiomas[df_limpio_idiomas["language"] != "English"]
#Configuración del estilo de seaborn (opcional)
sns.set(style="whitegrid")
#Obtengo el top 15 de idiomas con más películas
top_idiomas = df_limpio_idiomas["language"].value_counts().head(15)
fig, ax = plt.subplots(figsize=(12, 8))
#Creo el gráfico de barras con Seaborn
sns.barplot(x=top_idiomas.values, y=top_idiomas.index, palette="viridis", ax=ax)
#Añado anotaciones en cada barra
for bar in ax.patches:
ax.annotate(
f'{int(bar.get_width())}',
xy=(bar.get_width(), bar.get_y() + bar.get_height() / 2),
ha='left',
va='center',
size=10,
xytext=(5, 0),
textcoords='offset points'
)
#Establezvo el título correctamente
ax.set_title("Top 15 Idiomas de Películas (excluyendo inglés)")
#Muestra el gráfico
plt.show()
Run to view results