Top Banner
################ # Premios Goya # ################ from selenium import webdriver from bs4 import BeautifulSoup import pandas as pd import numpy as np import re def datos1(): """ Primer bloque de datos: --> Título de la película. --> Nº de nominaciones. --> Ganador (1/0). Cada lista contiene los datos de una película. """ tp = [i.text for i in html1.find(id='best_picture').parent.findAll('a', 'movie-title- link')] np = [] nomi = html1.find(id='best_picture').parent.select('div.aw- mc') for i in nomi: if len(i.select('b')) == 0: np.append(0) else: np.append(i.select('b')[0].text)
27

economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

Apr 01, 2019

Download

Documents

dokien
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

################

# Premios Goya #

################

from selenium import webdriver

from bs4 import BeautifulSoup

import pandas as pd

import numpy as np

import re

def datos1():

"""

Primer bloque de datos:

--> Título de la película.

--> Nº de nominaciones.

--> Ganador (1/0).

Cada lista contiene los datos de una película.

"""

tp = [i.text for i in html1.find(id='best_picture').parent.findAll('a', 'movie-title-link')]

np = []

nomi = html1.find(id='best_picture').parent.select('div.aw-mc')

for i in nomi:

if len(i.select('b')) == 0:

np.append(0)

else:

np.append(i.select('b')[0].text)

gdor = [1] + [0] * (len(tp) - 1) # Lista con ganador (1) o no (0).

return tp, np, gdor

Page 2: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

def datos2():

"""

Segundo bloque de datos:

--> Puntuación media.

--> Nº de votos recibidos.

--> Nº de críticas recibidas.

--> Coproducción (1/0).

--> Género (lista de géneros principales).

Cada lista contiene datos homogéneos.

"""

puntuacion = driver.find_element_by_css_selector('#movie-rat-avg').text.replace(",", ".")

votos = driver.find_element_by_css_selector('#movie-count-rat > span').text.replace(".", "")

criticas = driver.find_element_by_css_selector('#movie-reviews-box').text.split()[0]

coproduccion = [1 if "Coproducción" in i.text else 0 for i in html2.select('dd div.credits span.nb span')]

if 1 in coproduccion:

coproduccion = 1

else:

coproduccion = 0

genero = [i.text for i in html2.select('dd span[itemprop="genre"]')] # Lista de géneros principales.

return [puntuacion, votos, criticas, coproduccion, genero]

# Listas iniciales

ttl, nmn, gnd, yr = [], [], [], []

dts2 = []

# Cargar páginas años

driver = webdriver.Chrome()

for ed in range(1987, 2019):

driver.get("https://www.filmaffinity.com/es/awards.php?award_id=goya&year=" + str(ed))

Page 3: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Bloque 1 de datos

html1 = BeautifulSoup(driver.page_source, 'html.parser')

titulo, nominaciones, ganador = datos1()

year = [ed] * len(titulo)

# Unión de listas del bloque 1

ttl.extend(titulo)

nmn.extend(nominaciones)

gnd.extend(ganador)

yr.extend(year)

# Bloque 2 de datos

for ti in titulo:

ti = ti.split('(')[0]

link = [i.get('href') for i in html1.findAll('a', 'movie-title-link', href=True, string=re.compile(ti))]

driver.get("https://www.filmaffinity.com" + link[0])

html2 = BeautifulSoup(driver.page_source, 'html.parser')

dts2.append(datos2())

# Unir datos

d = {'ganador': gnd, 'titulo': ttl, 'year': yr, 'nominaciones': nmn}

df1 = pd.DataFrame(d)

df2 = pd.DataFrame(dts2, columns=['puntuacion', 'votos', 'criticas', 'coproduccion', 'genero'])

df = df1.join(df2)

# Cerrar driver

driver.close()

# Guardar tabla de datos

Page 4: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

df.to_csv('df_goyas_data.csv', index=False)

#################

# Premios Feroz #

#################

from selenium import webdriver

from bs4 import BeautifulSoup

import pandas as pd

import numpy as np

def datos_feroz():

"""

Bloque de datos:

--> Título de la película drama y comedia.

--> Ganador drama y comedia (1/0).

"""

tp_drama = [i.text for i in html1.find(id='mejor_pelicula_drama').parent.findAll('a', 'movie-title-link')]

gdor_drama = ["ganador"] + ["nominado"] * (len(tp_drama) - 1)

tp_comedia = [i.text for i in html1.find(id='mejor_comedia').parent.findAll('a', 'movie-title-link')]

gdor_comedia = ["ganador"] + ["nominado"] * (len(tp_comedia) - 1)

return tp_drama, gdor_drama, tp_comedia, gdor_comedia

# Listas iniciales

drama_feroz, comedia_feroz, gs_drama, gs_comedia = [], [], [], []

# Cargar páginas años

driver = webdriver.Chrome()

Page 5: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

for ed in range(2014, 2019):

driver.get("https://www.filmaffinity.com/es/awards.php?award_id=feroz&year=" + str(ed))

# Datos Premios Feroz

html1 = BeautifulSoup(driver.page_source, 'html.parser')

dr_feroz, g_dr_feroz, co_feroz, g_co_feroz = datos_feroz()

# Unión de listas Premios Feroz

drama_feroz.extend(dr_feroz)

comedia_feroz.extend(co_feroz)

gs_drama.extend(g_dr_feroz)

gs_comedia.extend(g_co_feroz)

# Cerrar driver

driver.close()

# Coordinación con Premios Goya

df = pd.read_csv('df_goyas_data.csv')

dra, com = [], []

fedrlow = [t.lower() for t in drama_feroz]

fecolow = [t.lower() for t in comedia_feroz]

for i in df.titulo.tolist():

if i.lower() in fedrlow:

dra.extend([gs_drama[drama_feroz.index(i)]])

else:

dra.extend(["no_clasificado"])

if i.lower() in fecolow:

com.extend([gs_comedia[comedia_feroz.index(i)]])

else:

com.extend(["no_clasificado"])

Page 6: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Unión Premios Feroz a Premios Goya

df['feroz_drama'] = dra

df['feroz_comedia'] = com

# Guardar tabla de datos Goya + Feroz

df.to_csv('df_goyas_feroz_data.csv', index=False)

##################

# Premios Forqué #

##################

from selenium import webdriver

from bs4 import BeautifulSoup

import pandas as pd

import numpy as np

def datos_forque():

"""

Bloque de datos:

--> Título de la película.

--> Ganador (1/0).

"""

tp = [i.text for i in html1.find(id='best_picture').parent.findAll('a', 'movie-title-link')]

gdor = ["ganador"] + ["nominado"] * (len(tp) - 1)

return tp, gdor

# Listas iniciales

ti_forque, ga_forque = [], []

Page 7: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Cargar páginas años

driver = webdriver.Chrome()

for ed in range(2010, 2019):

driver.get("https://www.filmaffinity.com/es/awards.php?award_id=forque&year=" + str(ed))

# Datos Premios Feroz

html1 = BeautifulSoup(driver.page_source, 'html.parser')

tit_fq, gan_fq = datos_forque()

# Unión de listas Premios Feroz

ti_forque.extend(tit_fq)

ga_forque.extend(gan_fq)

# Cerrar driver

driver.close()

# Coordinación con Premios Goya

df = pd.read_csv('df_goyas_feroz_data.csv')

fq = []

tfq = [t.lower() for t in ti_forque]

for i in df.titulo.tolist():

if i.lower() in tfq:

fq.extend([ga_forque[ti_forque.index(i)]])

else:

fq.extend(["no_clasificado"])

# Unión Premios Feroz a Premios Goya

df['forque'] = fq

# Guardar tabla de datos Goya + Feroz

Page 8: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

df.to_csv('df_goyas_total.csv', index=False)

###############

# Premios CEC #

###############

from selenium import webdriver

from bs4 import BeautifulSoup

import pandas as pd

import numpy as np

import re

def datos_cec():

"""

Bloque de datos:

--> Título de la película.

"""

try:

if len(html1.find('b', string=re.compile('Película')).parent.parent('i')) != 0:

tp = html1.find('b', string=re.compile('Película')).parent.parent('i')[0].string

else:

tp = html1.find('b', string=re.compile('Película')).parent.parent('em')[0].string

except:

return [np.nan]

tp = tp.split(",")[0].split("\n")

if len(tp) == 1:

tp = [tp[0].strip()]

pass

else:

tp1 = tp[0].strip()

Page 9: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

tp2 = tp[1].strip()

tp = [tp1 + " " + tp2]

return tp

# Lista de ganadores (procedente de la web)

ti_cec_web = []

# Recopilación web

driver = webdriver.Chrome()

for ed in range(1990, 2019): # El año es de la producción de la película, no el del premio.

driver.get("http://www.cinecec.com/EDITOR/premios/palmares/" + str(ed) + ".htm")

html1 = BeautifulSoup(driver.page_source, 'html.parser')

ti_cec_web.extend(datos_cec())

# Cerrar driver

driver.close()

# Lista de ganadores (webs - manual)

ti_cec_man = ['También la lluvia',

'No habrá paz para los malvados',

'Blancanieves',

'Vivir es fácil con los ojos cerrados',

'La isla mínima',

'Truman',

'Tarde para la ira',

'La librería']

# Sustitución de lista manual en lista web automática

ti_cec_web[-(len(ti_cec_man)+1):] = ti_cec_man

Page 10: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Coordinación con Premios Goya

df = pd.read_csv('df_goyas_total.csv')

cec = []

tcw = [t.lower() for t in ti_cec_web]

for i in df.titulo.tolist():

if i.lower() in tcw: # Todo en minúsculas.

cec.extend(["ganador"])

else:

cec.extend(["no_clasificado"])

# Unión Premios CEC a Premios Goya

df['cec'] = cec

# Guardar tabla de datos Goya + CEC

df.to_csv('df_goyas.csv', index=False)

import pandas as pd

import pickle

df = pd.read_csv('df_goyas.csv')

# Columna genero de string a lista

df.genero = df.genero.apply(lambda x: [r.strip("[").strip("]").strip(" ").strip("'") for r in x.split(",")])

# Lista de géneros posibles

y = []

[y.extend(i) for i in df.genero]

lgp = list(set(y))

Page 11: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Dummy géneros

dummy_generos = pd.DataFrame(columns=lgp, index=df.index)

for n, i in zip(df.genero, df.index):

for j in n:

if j in lgp:

dummy_generos.at[i, j] = 1

dummy_generos.fillna(0, inplace=True)

# Dummy Premios Feroz

dummy_fe_dr = pd.get_dummies(df.feroz_drama, prefix='feroz_drama')

dummy_fe_co = pd.get_dummies(df.feroz_comedia, prefix='feroz_comedia')

# Dummy Premios Forqué

dummy_forque = pd.get_dummies(df.forque, prefix='forque')

# Dummy Premios CEC

dummy_cec = pd.get_dummies(df.cec, prefix='cec')

# Unión df y df_dummy

df = pd.concat([df, dummy_fe_dr, dummy_fe_co, dummy_forque, dummy_cec, dummy_generos], axis=1, sort=False)

# Parche manual: una película en los Goyas al menos tiene una nominación

df.at[df[df.titulo == '27 horas'].index[0], 'nominaciones'] = 1

# Guardar ABT de Goyas

df.to_csv('ABT_Goyas.csv', index=False)

# Guardar lista de géneros

with open("lista_generos.txt", "wb") as f:

pickle.dump(lgp, f)

Page 12: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

import pandas as pd

import numpy as np

import pickle

from matplotlib import pyplot as plt

%matplotlib inline

import seaborn as sns

df = pd.read_csv('ABT_Goyas.csv')

with open("lista_generos.txt", "rb") as f:

lgp = pickle.load(f)

# Películas por género

for feature in lgp:

print(feature, ":", df[feature].sum())

# Eliminación columnas usadas para generar dummies

df.drop(columns=['genero', 'feroz_drama', 'feroz_comedia', 'forque', 'cec'], inplace=True)

# Fusión de Premios Feroz drama y comedia (pocos datos en comedia)

df['feroz_ganador'] = df.feroz_drama_ganador # No hay comedias ganadoras coincidentes Goya-Feroz.

df['feroz_nominado'] = df.feroz_drama_nominado + df.feroz_comedia_nominado

# Se eliminan columnas no usadas

df.drop(columns=['feroz_drama_ganador',

'feroz_drama_no_clasificado',

'feroz_drama_nominado',

'feroz_comedia_no_clasificado',

'feroz_comedia_nominado',

Page 13: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

'forque_no_clasificado',

'cec_no_clasificado'], inplace=True)

# Muchos géneros (13). Hacemos 4 grupos:

# Grupo más frecuente: Drama

df['G_drama'] = df.Drama

# Grupo de frecuencia media-alta: Comedia, Thriller, Romance e Intriga.

df['G_med_alto'] = np.where((df.Comedia == 1)

| (df.Thriller == 1)

| (df.Romance == 1)

| (df.Intriga == 1), 1, 0)

# Grupo de frecuencia media-baja: Fantástico, Terror, Acción y Aventuras.

df['G_med_bajo'] = np.where((df['Fantástico'] == 1)

| (df.Thriller == 1)

| (df.Romance == 1)

| (df.Intriga == 1), 1, 0)

# Grupo de frecuencia baja: Western, Ciencia ficción, Musical y Cine negro.

df['G_bajo'] = np.where((df.Western == 1)

| (df['Ciencia ficción'] == 1)

| (df.Musical == 1)

| (df['Cine negro'] == 1), 1, 0)

# Eliminación de géneros ya agrupados

df.drop(columns=lgp, inplace=True)

# Control de Nan en premios sin ediciones (parche)

num_tit = df.groupby('year').count()

n_feroz = num_tit[num_tit.index > 2013].sum()['titulo']

n_forque = num_tit[num_tit.index > 2009].sum()['titulo']

n_cec = num_tit[num_tit.index > 1989].sum()['titulo']

feroz_nan = [0] * (len(df) - n_feroz) + [1] * n_feroz # 0 = nan, 1 = sí hay dato.

Page 14: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

forque_nan = [0] * (len(df) - n_forque) + [1] * n_forque

cec_nan = [0] * (len(df) - n_cec) + [1] * n_cec

df['feroz_nan'] = feroz_nan

df['forque_nan'] = forque_nan

df['cec_nan'] = cec_nan

# Porcentaje anual de variables cuantitativas

t_anual = df.groupby('year')['nominaciones', 'puntuacion', 'votos', 'criticas'].sum() # Totales.

df.set_index('year', inplace=True)

ptj = df[['nominaciones', 'puntuacion', 'votos', 'criticas']] / t_anual # Porcentaje.

df[['nominaciones', 'puntuacion', 'votos', 'criticas']] = ptj

df.reset_index(inplace=True)

# Eliminamos columnas que no vamos a usar como variables independientes

df.drop(columns=['year', 'titulo'], inplace=True)

# Matriz final: 125 registros, 18 variables X. "ganador" variable Y.

# Guardar matriz de datos de Premios Goyas

df.to_csv('Datos_Goyas.csv', index=False)

import pickle

import pandas as pd

from matplotlib import pyplot as plt

%matplotlib inline

from sklearn.model_selection import train_test_split, GridSearchCV

from sklearn.preprocessing import StandardScaler

from sklearn.ensemble import GradientBoostingClassifier

from sklearn.metrics import confusion_matrix, roc_curve, auc

# Cargar tabla final de variables

Page 15: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

df = pd.read_csv('Datos_Goyas.csv')

# Se utilizan datos solo desde el año 2000 (incluido)

df = df[44:]

# Separar variable target y variables predictoras

y = df.ganador

X = df.drop('ganador', axis=1)

# Dividir X e y en train y test

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234, stratify=df.ganador)

# Comprobar train y test

print("Se comprueba train y test:")

print(len(X_train), len(X_test), len(y_train), len(y_test))

print(y_train.mean(), y_test.mean())

# Estandarización

scaler_X = StandardScaler().fit(X_train)

X_train_std = scaler_X.transform(X_train)

X_test_std = scaler_X.transform(X_test)

# Algoritmo

clf_gb = GradientBoostingClassifier(random_state=123)

# Hiperparámetros

hyperparameters = {'n_estimators': [100, 200, 500, 1000, 1500, 2000, 3000],

'learning_rate': [0.001, 0.005, 0.01, 0.05, 0.1, 0.2],

'max_depth': [1, 3, 5, 7, 9]}

Page 16: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Modelo

modelo = GridSearchCV(clf_gb, hyperparameters, n_jobs=-1, cv=10)

# Ajustar modelo

modelo.fit(X_train_std, y_train)

print("\nBest Train Score:", modelo.best_score_)

# Matriz de confusión. Predicción de categorías (y_test)

pred = modelo.predict(X_test_std)

print("MC sobre test:", "\n", confusion_matrix(pred, y_test))

# Curva ROC. Predicción de probabilidades (y_test)

pred = modelo.predict_proba(X_test_std)

pred = pred[:, 1] # Se toma sólo la clase positiva

fpr, tpr, threshols = roc_curve(y_test, pred)

# Dibujar la curva ROC

# Valores gráfico

fig = plt.figure(figsize=(8, 8))

plt.title('Receiver Operating Characteristic (ROC)')

# Plot ROC curve

plt.plot(fpr, tpr, label='gradient boosting')

plt.legend(loc='lower right')

# Diagonal 45 degree line

plt.plot([0, 1], [0, 1], 'k--')

# Axes limits and labels

plt.xlim([-0.1, 1.1])

plt.ylim([-0.1, 1.1])

plt.xlabel('True Positive Rate')

plt.ylabel('False Positive Rate')

plt.show()

Page 17: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# AUROC

print("Área bajo la curva ROC", auc(fpr, tpr))

# Parámetros del modelo

print("Parámtros del modelo ajustado:", modelo.best_estimator_)

# Importancia de las variables

print("Importancia sobre 1:\n")

for nom, val in zip(X, modelo.best_estimator_.feature_importances_):

print(nom, "\t", round(val, 3))

# Guardar el modelo

with open('modelo_goyas_gb.pkl', 'wb') as f:

pickle.dump(modelo.best_estimator_, f)

import pandas as pd

import numpy as np

import pickle

from matplotlib import pyplot as plt

%matplotlib inline

from sklearn.preprocessing import StandardScaler

from sklearn.ensemble import GradientBoostingClassifier

from sklearn.metrics import confusion_matrix, roc_curve, auc

# Datos: solo features relevantes

df = pd.read_csv('Datos_Goyas.csv',

usecols=['ganador', 'nominaciones', 'puntuacion',

'votos', 'criticas', 'cec_ganador', 'forque_ganador'])

Page 18: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Utilizar solo datos desde el año 2000 (incluido)

df = df[44:]

# Separar variable target y variables predictoras

y = df.ganador

X = df.drop('ganador', axis=1)

# Estandarización de todo X

scaler_X = StandardScaler().fit(X)

X_scaler = scaler_X.transform(X)

# Algoritmo con parámetros del mejor modelo

mod_final_goyas = GradientBoostingClassifier(n_estimators=1500, learning_rate=0.005, max_depth=1, random_state=123)

# Ajuste del modelo sobre todos los datos

mod_final_goyas.fit(X_scaler, y)

# Guardar el modelo '2000' sobre todas las películas

with open('modelo_goyas_gb_todas.pkl', 'wb') as f:

pickle.dump(mod_final_goyas, f)

# Diagramas de barras con importancia de características

#nom_var = ['Nº Nominaciones', 'Puntuación media', 'Nº Votos','Nº Críticas',

# 'Coproducción', 'Ganador Premios Forqué', 'Nominado Premios Forqué',

# 'Ganador Premios CEC', 'Ganador Premios Feroz', 'Nominado Premios Feroz',

# 'Género Drama', 'Géneros de frecuencia media-alta',

# 'Géneros de frecuencia media-baja', 'Géneros de frecuencia baja',

# 'Feroz nan', 'Forqué nan', 'CEC nan'] # Todas las variables.

nom_var = ['Nominaciones', 'Puntuación', 'Votos','Críticas',

'P. CEC', 'P. Forqué'] # Solo variables seleccionadas.

Page 19: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Data frame con valores mayores que 0, y ordenado

features = {'Variable': nom_var, 'Porcentaje': 100 * mod_final_goyas.feature_importances_}

a = pd.DataFrame(features)

b = a[a.Porcentaje > 0].sort_values(by=['Porcentaje'])

b.index = list(range(len(b))) # Renombrando índice tras ordenar por valores.

# Gráfico features

fig_features = plt.figure(figsize=(9, 9))

colores = ['aqua', 'yellow', 'red', 'green', 'silver', 'olive', 'navy', 'fuchsia', 'maroon']

plt.barh(b.Variable, b.Porcentaje, align='center', alpha=0.6, color=colores)

# Eje x. Título

plt.xlabel('Porcentaje')

plt.title('RELEVANCIA DE VARIABLES (desde 2000)')

# Etiquetas de datos

for i, fila in b.iterrows():

plt.text(x=fila.Porcentaje - 1.2, y=i, s="{0:.1%}".format(fila.Porcentaje/100), size=16, color='black')

plt.show()

# Salvar gráfico

fig_features.savefig('features importances')

# Matriz de confusión. Predicción de categorías (y_test)

pred = mod_final_goyas.predict(X_scaler)

print("Matriz Confusión sobre total:", "\n", confusion_matrix(pred, y))

# Curva ROC. Predicción de probabilidades (y_test)

pred = mod_final_goyas.predict_proba(X_scaler)

pred = pred[:, 1] # Se toma sólo la clase positiva

fpr, tpr, threshols = roc_curve(y, pred)

Page 20: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Dibujar la curva ROC

# Valor AUROC

valor_auroc = auc(fpr, tpr)

# Valores gráfico

fig_roc = plt.figure(figsize=(9, 9))

plt.title('Receiver Operating Characteristic (ROC)')

# Plot ROC curve

plt.plot(fpr, tpr, label="AUROC: " + "{0:.4}".format(valor_auroc))

plt.legend(loc='lower right')

# Diagonal 45 degree line

plt.plot([0, 1], [0, 1], 'k--')

# Axes limits and labels

plt.xlim([-0.1, 1.1])

plt.ylim([-0.1, 1.1])

plt.xlabel('True Positive Rate')

plt.ylabel('False Positive Rate')

plt.show()

# Salvar gráfico

fig_roc.savefig('ROC_curve')

###

# PREDICCIÓN 2019

# Cargar datos para predicción

df_2019 = pd.read_csv('datos_para_prediccion_2019.csv', sep=";")

titulos_2019 = df_2019.titulo

X_2019 = df_2019.drop('titulo', axis=1)

# Variables cuantitativas en porcentaje anual

v_c = ['nominaciones', 'puntuacion', 'votos', 'criticas']

v_d = ['cec_ganador', 'forque_ganador']

Page 21: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

X_2019 = pd.concat([X_2019[v_c] / X_2019[v_c].sum(), X_2019[v_d]], axis=1)

# Estandarización

X_2019_std = scaler_X.transform(X_2019)

# Predicción de probabilidades

pred_2019 = mod_final_goyas.predict_proba(X_2019_std)

pred_2019 = pred_2019[:, 1]

# Ponderación probabilidades sobre 100 (lineal)

probs = pred_2019 / pred_2019.sum()

# Mostrar probabilidades ponderadas sobre 100 para cada título

#print("\nPredicciones películas cargadas...\n")

#tamano = 1 + len(titulos_2019.max()) # Longitud del título más largo para luego rellenar con espacios.

#for tit, pre, prob in zip(titulos_2019, pred_2019, probs):

# print(tit.ljust(tamano), "\t", "{0:.1%}".format(pre), "\t", "{0:.1%}".format(prob))

# Gráfico probabilidades nominados 2019

# Data frame

n_2019 = pd.DataFrame({'titulo': titulos_2019, 'prob_absoluta': pred_2019, 'prob_edicion': probs})

n_2019 = n_2019.sort_values(by=['prob_edicion'], ascending=False)

n_2019.index = list(range(len(n_2019)))

# Gráfico dimensiones y supra-título

fig, ax = plt.subplots(figsize=(11, 9), facecolor='w')

fig.suptitle('Premios Goya - Mejor Película 2019', fontsize=14, fontweight='bold')

clrs = ['aqua', 'yellow', 'red', 'green', 'orange']

plt.bar(n_2019.titulo, n_2019.prob_edicion, align='center', alpha=0.6, color=clrs)

# Eje x. Título

plt.ylabel('Probabilidad de ganar')

Page 22: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

plt.title('¿QUIÉN GANARÁ EL GOYA?')

# Etiquetas de datos

for i, fila in n_2019.iterrows():

plt.text(x=i, y = 0.03, s="{0:.1%}".format(fila.prob_edicion),

size=16, horizontalalignment='center', color='black')

plt.show()

# Salvar gráfico

fig.savefig('Probs_Goya_2019')

import pickle

import pandas as pd

import numpy as np

from matplotlib import pyplot as plt

%matplotlib inline

from sklearn.preprocessing import StandardScaler

from sklearn.ensemble import GradientBoostingClassifier

from sklearn.metrics import confusion_matrix, roc_curve, auc

# Modelo '2000' entrenado con todas la películas

with open("modelo_goyas_gb_todas.pkl", "rb") as f:

mggt = pickle.load(f)

# Datos: solo features relevantes

df = pd.read_csv('Datos_Goyas.csv',

usecols=['ganador', 'nominaciones', 'puntuacion',

'votos', 'criticas', 'cec_ganador', 'forque_ganador'])

# Separar variable target y variables predictoras

y = df.ganador

X = df.drop('ganador', axis=1)

Page 23: economiaenjuguetes.files.wordpress.com file · Web view# Premios Goya # ##### from selenium import webdriver. from bs4 import BeautifulSoup. import pandas as pd. import numpy as np.

# Estandarización solo con los datos del modelo '2000'

scaler_X = StandardScaler().fit(X[44:])

X_scaler = scaler_X.transform(X)

# MODELO '2000' APLICADO A TODAS LAS PELÍCULAS

# Probabilidades de ganar el Goya de todas las películas hasta 2018

pred_todas = mggt.predict_proba(X_scaler)

pred_todas = pred_todas[:, 1]

# Data frame con años, títulos y predicciones

tts = pd.read_csv('ABT_Goyas.csv').loc[:, ['year', 'titulo']]

xx = pd.DataFrame(pred_todas, columns=['probabilidad'])

tts = pd.concat([tts, xx], axis=1)

# Agrupamiento y ponderación

t_anual = tts.groupby('year')['probabilidad'].sum()

tts.set_index('year', inplace=True)

probabilidad_anual = tts['probabilidad'] / t_anual

tts['probabilidad_anual'] = probabilidad_anual

tts.reset_index(inplace=True)

tts['ganador'] = y

# Salvar Data frame

tts.to_csv('probs_todas.csv', encoding='utf-8-sig')