Hace mucho tiempo atrás, me habían recomendado Breaking Bad, y yo para variar, rechacé verla porque dije “Debe ser la típica serie acerca de drogas”, y, cláramente, estaba equivocado. Luego de darme cuenta que es una de las mejores series de la TV, decidí explorar qué otro tipo de maravillas me había estado perdiendo por ser prejuicioso.

Obviamente, hablando desde una perspectiva de programador, lo primero que hice es programar un parser de IMDb, específicamente de la página donde están los top n shows.

El primer resultado que obtuve, debido a que no apliqué ningún filtro, fueron de series qué jamás había escuchado (probablemente caían dentro de la categoría de documental).

Lo primero que hice obviamente, es inicializar el entorno

import matplotlib.pyplot as plt
from scipy.interpolate import spline
import pandas as pd
import numpy as np
import matplotlib
from matplotlib import cm
plt.style.use('ggplot')
# Ideal para mostrar información más bonita :)

dataset = pd.read_csv("data2.csv", encoding = 'utf8', sep=";")

Por ahí había escuchado de pandas cuando era mechón, y como todo novato, con mucho temor lo dejé en el olvido. Como ahora me picó el bicho de la data visualization, aprendí a ocuparlo, y realmente es muy amigable.

Lo siguiente fue agrupar por score, debido a que el objetivo final es ver la concentración de capítulos buenos de cada serie:

df = dataset.groupby(["show", "score"]).count()
del df['name_chapter']
df.columns = ["count"]

# Además, debemos normalizar para que se pueda comparar con mayor facilidad
df["distribution"] = df['count'] / dataset.groupby("show").count()['chapter']

Luego, por cosas “pythonescas”, debemos rellenar las notas que faltan en la escala del 0 al 10 con cantidad 0 para plotear el área bien

new_index = [(show, score) for show in shows for score in np.arange(0, 10, 0.1)]
df = df.reindex(new_index, fill_value=0)

Finalmente, incluímos unos colormaps para que quede más bonito, y se plotea:

# obtenemos todos los shows
shows = list(set(map(lambda x: x[0], df.index)))

# colormaps!
cmap = plt.get_cmap('Set1')
colors = [cmap(i) for i in np.linspace(0, 1, len(shows))]
colors = zip(shows, colors)
colors = dict(colors)

plt.rcParams['figure.figsize'] = (15, 10)
fig = plt.figure()
ax_1 = fig.add_subplot(111)

for key in shows:
    # Se ordenan por score
    show = df.loc[key].reset_index().sort_values(by="score")

    # smoothing the curve because reasons
    x_smooth = np.linspace(show.min()['score'], show.max()['score'], 500)
    y_smooth = spline(show['score'], show['distribution'], x_smooth)

    # al hacer el smooth de la curva, se generan valores negativos, lo que
    # es claramente erróneo.
    y_smooth = [y if y > 0 else 0 for y in y_smooth]
    ax_1.plot(x_smooth, y_smooth, label=key, color=colors[key])
    ax_1.fill_between(x_smooth, y_smooth, color=colors[key], alpha=0.3)

Finalmente, al ejecutar todo, se obtiene el plot:

Luego, al revisar la lista de los top 5 shows, (['Breaking Bad', 'Planet Earth II', 'Game of Thrones', 'Planet Earth', 'Band of Brothers']), quedo extrañado al ver Planet Earth I y II, jamás en la vida había escuchado de ellas. Revisándolas, parecían como un documental acerca de la tierra, así que se me ocurrió crear un filtro más: tomar en cuenta sólo las series con más de una temporada, a ver si se obtenía un resultado con series de más renombre.

Series con más de una temporada

Lo único que tuve que cambiar para obtener esta información, fue el parser, ya que desde ahí filtré las series con solo una temporada, y se obtuvo un resultado mucho más interesante:

Se puede apreciar que las series con más concentración en las notas altas son Rick and Morty, Game of Thrones y Breaking Bad.

Aguante python, y aguante la data visualization.