DavidHosp commited on
Commit
1b3df15
·
1 Parent(s): 2f26661

update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -29
app.py CHANGED
@@ -1,5 +1,3 @@
1
-
2
-
3
  import matplotlib.pyplot as plt
4
  import io
5
  from PIL import Image
@@ -7,38 +5,39 @@ import pickle
7
  import pandas as pd
8
  import gradio as gr
9
 
10
-
11
  def generar_recomendacion(svd_model, user_id, df, genres, top=5):
12
- # Filtrar las películas que correspondan al usuario y a los géneros de interés
13
- df_filtered = df[(df['user_id'] == user_id) & df[genres].any(axis=1)]
14
-
15
  # Crear un mapeo de id de película a título de película para una búsqueda más eficiente
16
- id_to_title = df_filtered.set_index('id')['title'].to_dict()
17
 
18
  # Obtener las recomendaciones utilizando la función `predict` del modelo SVD
19
  recommended_movies = []
20
- for movie_id in df_filtered['id'].unique():
21
  predicted_rating = svd_model.predict(user_id, movie_id).est
22
  recommended_movies.append((movie_id, predicted_rating))
23
 
24
  # Ordenar las películas según su predicción de rating
25
  recommended_movies.sort(key=lambda x: x[1], reverse=True)
26
 
27
- # Obtener los títulos de las películas recomendadas y géneros
28
  recommended_titles = [id_to_title[movie_id] for movie_id, _ in recommended_movies[:top]]
29
- recommended_genres = [df[df['id'] == movie_id]['genre'].values[0] for movie_id, _ in recommended_movies[:top]]
30
-
31
- # Crear un dataframe con las recomendaciones
 
 
 
 
 
 
32
  recommendations_df = pd.DataFrame({
33
  'Top': range(1, top+1),
34
  'Películas': recommended_titles,
35
  'Genero': recommended_genres
36
  })
37
 
38
-
39
  # Contar cuántas películas de cada género hay en las recomendaciones
40
  recommended_movies_ids = [movie_id for movie_id, _ in recommended_movies[:top]]
41
- genre_counts = df_filtered[df_filtered['id'].isin(recommended_movies_ids)][genres].sum()
42
 
43
  # Limpiar la figura
44
  plt.clf()
@@ -47,19 +46,15 @@ def generar_recomendacion(svd_model, user_id, df, genres, top=5):
47
  genre_colors = {'Drama': 'blue', 'Comedy': 'orange', 'Horror': 'red', 'Romance': 'pink'}
48
  colors = [genre_colors[genre] for genre in genres]
49
 
50
-
51
-
52
  # Crear el gráfico de barras con los colores específicos
53
- plt.style.use('ggplot') # establece el estilo del gráfico
54
  plt.bar(genres, genre_counts, color=colors)
55
  plt.xlabel('Género', fontsize=10)
56
  plt.ylabel('Cantidad', fontsize=10)
57
  plt.title('Cantidad de Películas por Género en las Recomendaciones', fontsize=12)
58
- plt.grid(True) # agrega una cuadrícula
59
- plt.xticks(fontsize=10) # ajusta el tamaño de la fuente de los ticks del eje x
60
- plt.yticks(fontsize=10) # ajusta el tamaño de la fuente de los ticks del eje y
61
-
62
-
63
 
64
  # Guardar el gráfico como una imagen PNG en una cadena de bytes
65
  buf = io.BytesIO()
@@ -82,8 +77,6 @@ dfmerge = pd.read_csv('merged_data7.csv')
82
  with open('fc_model_svd_v2.pkl', 'rb') as file:
83
  svd_model = pickle.load(file)
84
 
85
-
86
- # Modificar la función wrap_generar_recomendacion para devolver una imagen también
87
  def wrap_generar_recomendacion(user_id, drama, comedy, horror, romance, top=5):
88
  # Crear la lista de géneros de interés a partir de las casillas de verificación
89
  genres = []
@@ -95,7 +88,6 @@ def wrap_generar_recomendacion(user_id, drama, comedy, horror, romance, top=5):
95
  # Llamar a la función de recomendación y devolver los resultados como una cadena y una imagen
96
  return generar_recomendacion(svd_model, user_id, dfmerge, genres, int(top))
97
 
98
- # Modificar la interfaz de Gradio para mostrar una imagen también
99
  demo = gr.Interface(
100
  fn=wrap_generar_recomendacion,
101
  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")],
@@ -116,10 +108,8 @@ Te mostraremos algunas películas que pueden gustarte.</b></p>
116
  """,
117
 
118
  allow_flagging='auto',
119
- theme="huggingface", # establece un tema predefinido
120
- favicon="https://iconos8.es/icon/OrZ75sWwdNU2/comedia", # establece tu favicon personalizado
121
-
122
  )
123
 
124
- # Lanzar la interfaz
125
  demo.launch()
 
 
 
1
  import matplotlib.pyplot as plt
2
  import io
3
  from PIL import Image
 
5
  import pandas as pd
6
  import gradio as gr
7
 
 
8
  def generar_recomendacion(svd_model, user_id, df, genres, top=5):
 
 
 
9
  # Crear un mapeo de id de película a título de película para una búsqueda más eficiente
10
+ id_to_title = df.set_index('id')['title'].to_dict()
11
 
12
  # Obtener las recomendaciones utilizando la función `predict` del modelo SVD
13
  recommended_movies = []
14
+ for movie_id in df['id'].unique():
15
  predicted_rating = svd_model.predict(user_id, movie_id).est
16
  recommended_movies.append((movie_id, predicted_rating))
17
 
18
  # Ordenar las películas según su predicción de rating
19
  recommended_movies.sort(key=lambda x: x[1], reverse=True)
20
 
21
+ # Obtener los títulos de las películas recomendadas y géneros
22
  recommended_titles = [id_to_title[movie_id] for movie_id, _ in recommended_movies[:top]]
23
+ recommended_genres = []
24
+ for movie_id, _ in recommended_movies[:top]:
25
+ movie_genres = []
26
+ for genre in genres:
27
+ if df[df['id'] == movie_id][genre].values[0] == 1:
28
+ movie_genres.append(genre)
29
+ recommended_genres.append(', '.join(movie_genres))
30
+
31
+ # Crear un dataframe con las recomendaciones
32
  recommendations_df = pd.DataFrame({
33
  'Top': range(1, top+1),
34
  'Películas': recommended_titles,
35
  'Genero': recommended_genres
36
  })
37
 
 
38
  # Contar cuántas películas de cada género hay en las recomendaciones
39
  recommended_movies_ids = [movie_id for movie_id, _ in recommended_movies[:top]]
40
+ genre_counts = df[df['id'].isin(recommended_movies_ids)][genres].sum()
41
 
42
  # Limpiar la figura
43
  plt.clf()
 
46
  genre_colors = {'Drama': 'blue', 'Comedy': 'orange', 'Horror': 'red', 'Romance': 'pink'}
47
  colors = [genre_colors[genre] for genre in genres]
48
 
 
 
49
  # Crear el gráfico de barras con los colores específicos
50
+ plt.style.use('ggplot')
51
  plt.bar(genres, genre_counts, color=colors)
52
  plt.xlabel('Género', fontsize=10)
53
  plt.ylabel('Cantidad', fontsize=10)
54
  plt.title('Cantidad de Películas por Género en las Recomendaciones', fontsize=12)
55
+ plt.grid(True)
56
+ plt.xticks(fontsize=10)
57
+ plt.yticks(fontsize=10)
 
 
58
 
59
  # Guardar el gráfico como una imagen PNG en una cadena de bytes
60
  buf = io.BytesIO()
 
77
  with open('fc_model_svd_v2.pkl', 'rb') as file:
78
  svd_model = pickle.load(file)
79
 
 
 
80
  def wrap_generar_recomendacion(user_id, drama, comedy, horror, romance, top=5):
81
  # Crear la lista de géneros de interés a partir de las casillas de verificación
82
  genres = []
 
88
  # Llamar a la función de recomendación y devolver los resultados como una cadena y una imagen
89
  return generar_recomendacion(svd_model, user_id, dfmerge, genres, int(top))
90
 
 
91
  demo = gr.Interface(
92
  fn=wrap_generar_recomendacion,
93
  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")],
 
108
  """,
109
 
110
  allow_flagging='auto',
111
+ theme="huggingface",
112
+ favicon="https://iconos8.es/icon/OrZ75sWwdNU2/comedia",
 
113
  )
114
 
 
115
  demo.launch()