DavidHosp commited on
Commit
3ab02cd
1 Parent(s): 732b808

update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -41
app.py CHANGED
@@ -3,49 +3,30 @@ import io
3
  from PIL import Image
4
  import pickle
5
  import pandas as pd
6
- from pandas.io.formats.style import Styler
7
  import gradio as gr
8
 
9
-
10
  def generar_recomendacion(svd_model, user_id, df, genres, top=5):
11
- # Crear un mapeo de id de película a título de película para una búsqueda más eficiente
12
- id_to_title = df.set_index('id')['title'].to_dict()
13
 
14
-
15
- # Obtener las películas que el usuario aún no ha calificado
16
- user_ratings = df[df['user_id'] == user_id]
17
- unwatched_movie_ids = set(df['id'].unique()) - set(user_ratings['id'].unique())
18
 
19
- # Obtener las recomendaciones utilizando la función `predict` del modelo SVD
20
  recommended_movies = []
21
- for movie_id in unwatched_movie_ids:
22
  predicted_rating = svd_model.predict(user_id, movie_id).est
23
  recommended_movies.append((movie_id, predicted_rating))
24
 
25
- # Ordenar las películas según su predicción de rating
26
  recommended_movies.sort(key=lambda x: x[1], reverse=True)
27
 
28
-
29
- # Obtener los títulos de las películas recomendadas y géneros
30
  recommended_titles = [id_to_title[movie_id] for movie_id, _ in recommended_movies[:top]]
31
- recommended_genres = []
32
- for movie_id, _ in recommended_movies[:top]:
33
- movie_genres = []
34
- for genre in genres:
35
- if df[df['id'] == movie_id][genre].values[0] == 1:
36
- movie_genres.append(genre)
37
- recommended_genres.append(', '.join(movie_genres))
38
-
39
- # Crear un dataframe con las recomendaciones
40
- recommendations_df = pd.DataFrame({
41
- 'Top': range(1, top+1),
42
- 'Películas': recommended_titles,
43
- 'Genero': recommended_genres
44
- })
45
 
46
  # Contar cuántas películas de cada género hay en las recomendaciones
47
  recommended_movies_ids = [movie_id for movie_id, _ in recommended_movies[:top]]
48
- genre_counts = df[df['id'].isin(recommended_movies_ids)][genres].sum()
49
 
50
  # Limpiar la figura
51
  plt.clf()
@@ -54,15 +35,19 @@ def generar_recomendacion(svd_model, user_id, df, genres, top=5):
54
  genre_colors = {'Drama': 'blue', 'Comedy': 'orange', 'Horror': 'red', 'Romance': 'pink'}
55
  colors = [genre_colors[genre] for genre in genres]
56
 
 
 
57
  # Crear el gráfico de barras con los colores específicos
58
- plt.style.use('ggplot')
59
  plt.bar(genres, genre_counts, color=colors)
60
  plt.xlabel('Género', fontsize=10)
61
  plt.ylabel('Cantidad', fontsize=10)
62
  plt.title('Cantidad de Películas por Género en las Recomendaciones', fontsize=12)
63
- plt.grid(True)
64
- plt.xticks(fontsize=10)
65
- plt.yticks(fontsize=10)
 
 
66
 
67
  # Guardar el gráfico como una imagen PNG en una cadena de bytes
68
  buf = io.BytesIO()
@@ -74,9 +59,8 @@ def generar_recomendacion(svd_model, user_id, df, genres, top=5):
74
  im = im.convert('RGB')
75
  buf.close()
76
 
77
- # Devolver la lista de títulos como una cadena, el gráfico como una imagen y el dataframe de recomendaciones
78
- return ', '.join(recommended_titles), im, Styler(recommendations_df).to_html()
79
-
80
 
81
 
82
  # Leer los datos
@@ -86,6 +70,7 @@ dfmerge = pd.read_csv('merged_data7.csv')
86
  with open('fc_model_svd_v2.pkl', 'rb') as file:
87
  svd_model = pickle.load(file)
88
 
 
89
  def wrap_generar_recomendacion(user_id, drama, comedy, horror, romance, top=5):
90
  # Crear la lista de géneros de interés a partir de las casillas de verificación
91
  genres = []
@@ -97,11 +82,11 @@ def wrap_generar_recomendacion(user_id, drama, comedy, horror, romance, top=5):
97
  # Llamar a la función de recomendación y devolver los resultados como una cadena y una imagen
98
  return generar_recomendacion(svd_model, user_id, dfmerge, genres, int(top))
99
 
100
-
101
  demo = gr.Interface(
102
  fn=wrap_generar_recomendacion,
103
  inputs=[gr.inputs.Number(label="User ID"), gr.inputs.Checkbox(label="Drama"), gr.inputs.Checkbox(label="Comedy"), gr.inputs.Checkbox(label="Horror"), gr.inputs.Checkbox(label="Romance"), gr.inputs.Number(label="Top")],
104
- outputs=[gr.outputs.Textbox(), gr.outputs.Image(type='pil'),gr.outputs.HTML()],
105
  title = '<h1 style="text-align: center; color: #FF6347;">STREAMREC</h1>',
106
  description = """
107
  <p>
@@ -112,14 +97,16 @@ Sistema de Recomendaciones Personalizadas de Películas y Series
112
  <p><b style="color: #DC143C;">Advertencia: Ingresa el ID del usuario (user_id), selecciona los géneros de interés y la cantidad de recomendaciones que te gustaría generar.
113
  Te mostraremos algunas películas que pueden gustarte.</b></p>
114
  <img src="https://i.pinimg.com/564x/18/51/c8/1851c8a1adbf68564f3a29e1c5c602a0.jpg" alt="logo" width="250"/>
115
- <img src="https://i.pinimg.com/564x/22/19/69/221969071884e659af16c78455e3afde.jpg" alt="logo" width="1000" height="95"/>
116
  </center>
117
  </p>
118
  """,
119
 
120
  allow_flagging='auto',
121
- theme="huggingface",
122
- favicon="https://iconos8.es/icon/OrZ75sWwdNU2/comedia",
 
123
  )
124
 
125
- demo.launch()
 
 
3
  from PIL import Image
4
  import pickle
5
  import pandas as pd
 
6
  import gradio as gr
7
 
 
8
  def generar_recomendacion(svd_model, user_id, df, genres, top=5):
9
+ # Filtrar las películas que correspondan al usuario y a los géneros de interés
10
+ df_filtered = df[(df['user_id'] == user_id) & df[genres].any(axis=1)]
11
 
12
+ # Crear un mapeo de id de película a título de película para una búsqueda más eficiente
13
+ id_to_title = df_filtered.set_index('id')['title'].to_dict()
 
 
14
 
15
+ # Obtener las recomendaciones utilizando la función `predict` del modelo SVD
16
  recommended_movies = []
17
+ for movie_id in df_filtered['id'].unique():
18
  predicted_rating = svd_model.predict(user_id, movie_id).est
19
  recommended_movies.append((movie_id, predicted_rating))
20
 
21
+ # Ordenar las películas según su predicción de rating
22
  recommended_movies.sort(key=lambda x: x[1], reverse=True)
23
 
24
+ # Obtener los títulos de las películas recomendadas
 
25
  recommended_titles = [id_to_title[movie_id] for movie_id, _ in recommended_movies[:top]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
  # Contar cuántas películas de cada género hay en las recomendaciones
28
  recommended_movies_ids = [movie_id for movie_id, _ in recommended_movies[:top]]
29
+ genre_counts = df_filtered[df_filtered['id'].isin(recommended_movies_ids)][genres].sum()
30
 
31
  # Limpiar la figura
32
  plt.clf()
 
35
  genre_colors = {'Drama': 'blue', 'Comedy': 'orange', 'Horror': 'red', 'Romance': 'pink'}
36
  colors = [genre_colors[genre] for genre in genres]
37
 
38
+
39
+
40
  # Crear el gráfico de barras con los colores específicos
41
+ plt.style.use('ggplot') # establece el estilo del gráfico
42
  plt.bar(genres, genre_counts, color=colors)
43
  plt.xlabel('Género', fontsize=10)
44
  plt.ylabel('Cantidad', fontsize=10)
45
  plt.title('Cantidad de Películas por Género en las Recomendaciones', fontsize=12)
46
+ plt.grid(True) # agrega una cuadrícula
47
+ plt.xticks(fontsize=10) # ajusta el tamaño de la fuente de los ticks del eje x
48
+ plt.yticks(fontsize=10) # ajusta el tamaño de la fuente de los ticks del eje y
49
+
50
+
51
 
52
  # Guardar el gráfico como una imagen PNG en una cadena de bytes
53
  buf = io.BytesIO()
 
59
  im = im.convert('RGB')
60
  buf.close()
61
 
62
+ # Devolver la lista de títulos y el gráfico como una imagen
63
+ return ', '.join(recommended_titles), im
 
64
 
65
 
66
  # Leer los datos
 
70
  with open('fc_model_svd_v2.pkl', 'rb') as file:
71
  svd_model = pickle.load(file)
72
 
73
+ # Modificar la función wrap_generar_recomendacion para devolver una imagen también
74
  def wrap_generar_recomendacion(user_id, drama, comedy, horror, romance, top=5):
75
  # Crear la lista de géneros de interés a partir de las casillas de verificación
76
  genres = []
 
82
  # Llamar a la función de recomendación y devolver los resultados como una cadena y una imagen
83
  return generar_recomendacion(svd_model, user_id, dfmerge, genres, int(top))
84
 
85
+ # Modificar la interfaz de Gradio para mostrar una imagen también
86
  demo = gr.Interface(
87
  fn=wrap_generar_recomendacion,
88
  inputs=[gr.inputs.Number(label="User ID"), gr.inputs.Checkbox(label="Drama"), gr.inputs.Checkbox(label="Comedy"), gr.inputs.Checkbox(label="Horror"), gr.inputs.Checkbox(label="Romance"), gr.inputs.Number(label="Top")],
89
+ outputs=[gr.outputs.Textbox(), gr.outputs.Image(type='pil')],
90
  title = '<h1 style="text-align: center; color: #FF6347;">STREAMREC</h1>',
91
  description = """
92
  <p>
 
97
  <p><b style="color: #DC143C;">Advertencia: Ingresa el ID del usuario (user_id), selecciona los géneros de interés y la cantidad de recomendaciones que te gustaría generar.
98
  Te mostraremos algunas películas que pueden gustarte.</b></p>
99
  <img src="https://i.pinimg.com/564x/18/51/c8/1851c8a1adbf68564f3a29e1c5c602a0.jpg" alt="logo" width="250"/>
100
+ <img src="https://i.pinimg.com/564x/22/19/69/221969071884e659af16c78455e3afde.jpg" alt="logo" width="1000" height="200"/>
101
  </center>
102
  </p>
103
  """,
104
 
105
  allow_flagging='auto',
106
+ theme="huggingface", # establece un tema predefinido
107
+ favicon="https://iconos8.es/icon/OrZ75sWwdNU2/comedia", # establece tu favicon personalizado
108
+
109
  )
110
 
111
+ # Lanzar la interfaz
112
+ demo.launch()