Economiaenjuguetes.files.wordpress.com



################# Premios Goya #################from selenium import webdriverfrom bs4 import BeautifulSoupimport pandas as pdimport numpy as npimport redef 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, gdordef 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 inicialesttl, nmn, gnd, yr = [], [], [], []dts2 = []# Cargar páginas a?osdriver = webdriver.Chrome()for ed in range(1987, 2019): driver.get("" + str(ed))# 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=pile(ti))] driver.get("" + link[0]) html2 = BeautifulSoup(driver.page_source, 'html.parser') dts2.append(datos2())# Unir datosd = {'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 driverdriver.close()# Guardar tabla de datosdf.to_csv('df_goyas_data.csv', index=False)################## Premios Feroz ##################from selenium import webdriverfrom bs4 import BeautifulSoupimport pandas as pdimport numpy as npdef 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 inicialesdrama_feroz, comedia_feroz, gs_drama, gs_comedia = [], [], [], []# Cargar páginas a?osdriver = webdriver.Chrome()for ed in range(2014, 2019): driver.get("" + 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 driverdriver.close()# Coordinación con Premios Goyadf = 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"])# Unión Premios Feroz a Premios Goyadf['feroz_drama'] = dradf['feroz_comedia'] = com# Guardar tabla de datos Goya + Ferozdf.to_csv('df_goyas_feroz_data.csv', index=False)################### Premios Forqué ###################from selenium import webdriverfrom bs4 import BeautifulSoupimport pandas as pdimport numpy as npdef 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 inicialesti_forque, ga_forque = [], []# Cargar páginas a?osdriver = webdriver.Chrome()for ed in range(2010, 2019): driver.get("" + 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 driverdriver.close()# Coordinación con Premios Goyadf = 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 Goyadf['forque'] = fq# Guardar tabla de datos Goya + Ferozdf.to_csv('df_goyas_total.csv', index=False)################ Premios CEC ################from selenium import webdriverfrom bs4 import BeautifulSoupimport pandas as pdimport numpy as npimport redef datos_cec(): """ Bloque de datos: --> Título de la película. """ try: if len(html1.find('b', string=pile('Película')).parent.parent('i')) != 0: tp = html1.find('b', string=pile('Película')).parent.parent('i')[0].string else: tp = html1.find('b', string=pile('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() tp2 = tp[1].strip() tp = [tp1 + " " + tp2] return tp# Lista de ganadores (procedente de la web)ti_cec_web = []# Recopilación webdriver = 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("" + str(ed) + ".htm") html1 = BeautifulSoup(driver.page_source, 'html.parser') ti_cec_web.extend(datos_cec()) # Cerrar driverdriver.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áticati_cec_web[-(len(ti_cec_man)+1):] = ti_cec_man# Coordinación con Premios Goyadf = 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 Goyadf['cec'] = cec# Guardar tabla de datos Goya + CECdf.to_csv('df_goyas.csv', index=False)import pandas as pdimport pickledf = pd.read_csv('df_goyas.csv')# Columna genero de string a listadf.genero = df.genero.apply(lambda x: [r.strip("[").strip("]").strip(" ").strip("'") for r in x.split(",")])# Lista de géneros posiblesy = [][y.extend(i) for i in df.genero]lgp = list(set(y))# Dummy génerosdummy_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] = 1dummy_generos.fillna(0, inplace=True)# Dummy Premios Ferozdummy_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 CECdummy_cec = pd.get_dummies(df.cec, prefix='cec')# Unión df y df_dummydf = 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óndf.at[df[df.titulo == '27 horas'].index[0], 'nominaciones'] = 1# Guardar ABT de Goyasdf.to_csv('ABT_Goyas.csv', index=False)# Guardar lista de géneroswith open("lista_generos.txt", "wb") as f: pickle.dump(lgp, f)import pandas as pdimport numpy as npimport picklefrom matplotlib import pyplot as plt%matplotlib inlineimport seaborn as snsdf = pd.read_csv('ABT_Goyas.csv')with open("lista_generos.txt", "rb") as f: lgp = pickle.load(f)# Películas por génerofor feature in lgp: print(feature, ":", df[feature].sum()) # Eliminación columnas usadas para generar dummiesdf.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 usadasdf.drop(columns=['feroz_drama_ganador', 'feroz_drama_no_clasificado', 'feroz_drama_nominado', 'feroz_comedia_no_clasificado', 'feroz_comedia_nominado', 'forque_no_clasificado', 'cec_no_clasificado'], inplace=True)# Muchos géneros (13). Hacemos 4 grupos:# Grupo más frecuente: Dramadf['G_drama'] = df.Drama# Grupo de frecuencia media-alta: Comedia, Thriller, Romance e Intriga.df['G_med_alto'] = np.where((edia == 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 agrupadosdf.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.forque_nan = [0] * (len(df) - n_forque) + [1] * n_forquecec_nan = [0] * (len(df) - n_cec) + [1] * n_cecdf['feroz_nan'] = feroz_nandf['forque_nan'] = forque_nandf['cec_nan'] = cec_nan# Porcentaje anual de variables cuantitativast_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']] = ptjdf.reset_index(inplace=True)# Eliminamos columnas que no vamos a usar como variables independientesdf.drop(columns=['year', 'titulo'], inplace=True)# Matriz final: 125 registros, 18 variables X. "ganador" variable Y.# Guardar matriz de datos de Premios Goyasdf.to_csv('Datos_Goyas.csv', index=False)import pickleimport pandas as pdfrom matplotlib import pyplot as plt%matplotlib inlinefrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn.metrics import confusion_matrix, roc_curve, auc# Cargar tabla final de variablesdf = pd.read_csv('Datos_Goyas.csv')# Se utilizan datos solo desde el a?o 2000 (incluido)df = df[44:]# Separar variable target y variables predictorasy = df.ganadorX = df.drop('ganador', axis=1)# Dividir X e y en train y testX_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 testprint("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ónscaler_X = StandardScaler().fit(X_train)X_train_std = scaler_X.transform(X_train)X_test_std = scaler_X.transform(X_test)# Algoritmoclf_gb = GradientBoostingClassifier(random_state=123)# Hiperparámetroshyperparameters = {'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]}# Modelomodelo = GridSearchCV(clf_gb, hyperparameters, n_jobs=-1, cv=10)# Ajustar modelomodelo.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 positivafpr, tpr, threshols = roc_curve(y_test, pred)# Dibujar la curva ROC# Valores gráficofig = plt.figure(figsize=(8, 8))plt.title('Receiver Operating Characteristic (ROC)')# Plot ROC curveplt.plot(fpr, tpr, label='gradient boosting')plt.legend(loc='lower right')# Diagonal 45 degree lineplt.plot([0, 1], [0, 1], 'k--')# Axes limits and labelsplt.xlim([-0.1, 1.1])plt.ylim([-0.1, 1.1])plt.xlabel('True Positive Rate')plt.ylabel('False Positive Rate')plt.show()# AUROCprint("?rea bajo la curva ROC", auc(fpr, tpr))# Parámetros del modeloprint("Parámtros del modelo ajustado:", modelo.best_estimator_)# Importancia de las variablesprint("Importancia sobre 1:\n")for nom, val in zip(X, modelo.best_estimator_.feature_importances_): print(nom, "\t", round(val, 3))# Guardar el modelowith open('modelo_goyas_gb.pkl', 'wb') as f: pickle.dump(modelo.best_estimator_, f)import pandas as pdimport numpy as npimport picklefrom matplotlib import pyplot as plt%matplotlib inlinefrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn.metrics import confusion_matrix, roc_curve, auc# Datos: solo features relevantesdf = pd.read_csv('Datos_Goyas.csv', usecols=['ganador', 'nominaciones', 'puntuacion', 'votos', 'criticas', 'cec_ganador', 'forque_ganador'])# Utilizar solo datos desde el a?o 2000 (incluido)df = df[44:]# Separar variable target y variables predictorasy = df.ganadorX = df.drop('ganador', axis=1)# Estandarización de todo Xscaler_X = StandardScaler().fit(X)X_scaler = scaler_X.transform(X)# Algoritmo con parámetros del mejor modelomod_final_goyas = GradientBoostingClassifier(n_estimators=1500, learning_rate=0.005, max_depth=1, random_state=123)# Ajuste del modelo sobre todos los datosmod_final_goyas.fit(X_scaler, y)# Guardar el modelo '2000' sobre todas las películaswith 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.# Data frame con valores mayores que 0, y ordenadofeatures = {'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 featuresfig_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ítuloplt.xlabel('Porcentaje')plt.title('RELEVANCIA DE VARIABLES (desde 2000)')# Etiquetas de datosfor 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áficofig_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 positivafpr, tpr, threshols = roc_curve(y, pred)# Dibujar la curva ROC# Valor AUROCvalor_auroc = auc(fpr, tpr)# Valores gráficofig_roc = plt.figure(figsize=(9, 9))plt.title('Receiver Operating Characteristic (ROC)')# Plot ROC curveplt.plot(fpr, tpr, label="AUROC: " + "{0:.4}".format(valor_auroc))plt.legend(loc='lower right')# Diagonal 45 degree lineplt.plot([0, 1], [0, 1], 'k--')# Axes limits and labelsplt.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áficofig_roc.savefig('ROC_curve')#### PREDICCI?N 2019# Cargar datos para prediccióndf_2019 = pd.read_csv('datos_para_prediccion_2019.csv', sep=";")titulos_2019 = df_2019.tituloX_2019 = df_2019.drop('titulo', axis=1)# Variables cuantitativas en porcentaje anualv_c = ['nominaciones', 'puntuacion', 'votos', 'criticas']v_d = ['cec_ganador', 'forque_ganador']X_2019 = pd.concat([X_2019[v_c] / X_2019[v_c].sum(), X_2019[v_d]], axis=1)# EstandarizaciónX_2019_std = scaler_X.transform(X_2019)# Predicción de probabilidadespred_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 framen_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ítulofig, 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ítuloplt.ylabel('Probabilidad de ganar')plt.title('?QUI?N GANAR? EL GOYA?')# Etiquetas de datosfor 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áficofig.savefig('Probs_Goya_2019')import pickleimport pandas as pdimport numpy as npfrom matplotlib import pyplot as plt%matplotlib inlinefrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn.metrics import confusion_matrix, roc_curve, auc# Modelo '2000' entrenado con todas la películaswith open("modelo_goyas_gb_todas.pkl", "rb") as f: mggt = pickle.load(f)# Datos: solo features relevantesdf = pd.read_csv('Datos_Goyas.csv', usecols=['ganador', 'nominaciones', 'puntuacion', 'votos', 'criticas', 'cec_ganador', 'forque_ganador'])# Separar variable target y variables predictorasy = df.ganadorX = df.drop('ganador', axis=1)# 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 2018pred_todas = mggt.predict_proba(X_scaler)pred_todas = pred_todas[:, 1]# Data frame con a?os, títulos y prediccionestts = 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ónt_anual = tts.groupby('year')['probabilidad'].sum()tts.set_index('year', inplace=True)probabilidad_anual = tts['probabilidad'] / t_anualtts['probabilidad_anual'] = probabilidad_anualtts.reset_index(inplace=True)tts['ganador'] = y# Salvar Data frametts.to_csv('probs_todas.csv', encoding='utf-8-sig') ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download