Vilyam888 commited on
Commit
46ff0e0
·
verified ·
1 Parent(s): 917f610

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -81
app.py CHANGED
@@ -1,90 +1,106 @@
 
 
 
1
  import tensorflow as tf
2
  from huggingface_hub import hf_hub_download
3
  from datasets import load_dataset
4
- import numpy as np
5
- import gradio as gr
6
- from sklearn.preprocessing import MinMaxScaler
7
- import pandas as pd
8
  # Загрузка модели
9
  model_path = hf_hub_download(repo_id='neuronetties/bezrabot', filename='bezrabotica.keras')
10
  model = tf.keras.models.load_model(model_path)
11
 
12
  # Загрузка и обработка датасета
13
  dataset = load_dataset("Vilyam888/data")
14
- data = pd.DataFrame(dataset['train'])
15
-
16
- columns_to_keep = [
17
- 'territory',
18
- 'num_economactivepopulation_all',
19
- 'employed_num_all',
20
- 'unemployed_num_all',
21
- 'eactivity_lvl',
22
- 'employment_lvl',
23
- 'unemployment_lvl',
24
- 'dis_unagegroup_30-39',
25
- 'dis_emagegroup_30-39',
26
- 'num_unagegroup_30-39',
27
- 'num_emagegroup_30-39',
28
- 'year'
29
- ]
30
- data = data[columns_to_keep]
31
- data.fillna(data.mean(numeric_only=True), inplace=True)
32
-
33
- def clean_territory(value):
34
- if isinstance(value, str) and len(value) > 100:
35
- return value[:100]
36
- return value
37
-
38
- data['territory'] = data['territory'].apply(clean_territory)
39
- data['territory'] = data['territory'].astype(str).str.strip()
40
- territory_mapping = {territory: idx for idx, territory in enumerate(data['territory'].unique())}
41
- data['territory'] = data['territory'].map(territory_mapping)
42
-
43
- scaler = MinMaxScaler()
44
- normalized_data = scaler.fit_transform(data.drop(['year'], axis=1))
45
- normalized_df = pd.DataFrame(normalized_data, columns=[col for col in data.columns if col != 'year'])
46
- normalized_df['year'] = data['year'].values
47
-
48
- def predict(territory, year, num_economactivepopulation_all, employed_num_all, unemployed_num_all,
49
- eactivity_lvl, employment_lvl, dis_unagegroup_30_39, dis_emagegroup_30_39,
50
- num_unagegroup_30_39, num_emagegroup_30_39):
51
- input_data = pd.DataFrame({
52
- 'territory': [territory_mapping[territory]],
53
- 'num_economactivepopulation_all': [num_economactivepopulation_all],
54
- 'employed_num_all': [employed_num_all],
55
- 'unemployed_num_all': [unemployed_num_all],
56
- 'eactivity_lvl': [eactivity_lvl],
57
- 'employment_lvl': [employment_lvl],
58
- 'dis_unagegroup_30-39': [dis_unagegroup_30_39],
59
- 'dis_emagegroup_30-39': [dis_emagegroup_30_39],
60
- 'num_unagegroup_30-39': [num_unagegroup_30_39],
61
- 'num_emagegroup_30-39': [num_emagegroup_30_39]
62
- })
63
-
64
- input_normalized = scaler.transform(input_data)
65
- input_sequence = np.expand_dims(input_normalized, axis=0)
66
-
67
- prediction = model.predict(input_sequence)
68
- return round(prediction[0][0], 2)
69
-
70
- interface = gr.Interface(
71
- fn=predict,
72
- inputs=[
73
- gr.Textbox(label="Territory", placeholder="Введите название территории"),
74
- gr.Number(label="Year"),
75
- gr.Number(label="Economic Active Population"),
76
- gr.Number(label="Employed Population"),
77
- gr.Number(label="Unemployed Population"),
78
- gr.Number(label="Economic Activity Level"),
79
- gr.Number(label="Employment Level"),
80
- gr.Number(label="Disunemployed Age Group 30-39"),
81
- gr.Number(label="Disemployed Age Group 30-39"),
82
- gr.Number(label="Unemployed Age Group 30-39"),
83
- gr.Number(label="Employed Age Group 30-39")
84
- ],
85
- outputs=gr.Textbox(label="Predicted Value"),
86
- title="Unemployment Prediction Model",
87
- description="Введите значения для прогноза уровня безработицы."
88
- )
89
-
90
- interface.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import pandas as pd
4
  import tensorflow as tf
5
  from huggingface_hub import hf_hub_download
6
  from datasets import load_dataset
7
+
 
 
 
8
  # Загрузка модели
9
  model_path = hf_hub_download(repo_id='neuronetties/bezrabot', filename='bezrabotica.keras')
10
  model = tf.keras.models.load_model(model_path)
11
 
12
  # Загрузка и обработка датасета
13
  dataset = load_dataset("Vilyam888/data")
14
+
15
+ # Извлечение данных из датасета в DataFrame (обычно данные находятся в ключе 'train')
16
+ df = pd.DataFrame(dataset['train'])
17
+
18
+ # Удаление ненужных колонок
19
+ df = df.drop(columns=['date_x', 'status', 'budget_x', 'country', 'revenue', 'orig_lang', 'orig_title', 'overview', 'crew', 'score'], errors='ignore')
20
+
21
+ # Обработка жанров
22
+ df['genre'] = df['genre'].fillna('')
23
+ df['genre'] = df['genre'].str.split(',')
24
+
25
+ # Убираем пробелы или нежелательные символы из жанров, устраняем дублирование
26
+ all_genres = set()
27
+ for genres_list in df['genre']:
28
+ all_genres.update([genre.strip() for genre in genres_list if genre.strip()])
29
+
30
+ all_genres = sorted(all_genres) # Сортируем для удобства
31
+
32
+ # Создаем бинарные колонки для каждого жанра
33
+ for genre in all_genres:
34
+ df[genre] = df['genre'].apply(lambda x: 1 if genre in x else 0)
35
+
36
+ # Удаляем колонку 'genre', так как она больше не нужна
37
+ df = df.drop(columns=['genre'])
38
+
39
+ # Проверяем наличие столбца с названиями фильмов
40
+ if 'names' not in df.columns:
41
+ df['names'] = [f"Фильм {i}" for i in range(len(df))] # Генерируем фиктивные названия, если их нет
42
+
43
+ # Функция для рекомендаций
44
+ current_index = 0 # Глобальная переменная для отслеживания текущего индекса
45
+ recommended_movies_list = []
46
+
47
+ def recommend_movies(selected_genres):
48
+ global current_index, recommended_movies_list
49
+
50
+ if not selected_genres:
51
+ return "Выберите хотя бы один жанр."
52
+
53
+ # Создаем фильтр по выбранным жанрам с учетом схожести
54
+ filtered_df = df.copy()
55
+ filtered_df['genre_match'] = filtered_df[selected_genres].sum(axis=1)
56
+ filtered_df = filtered_df[filtered_df['genre_match'] > 0]
57
+
58
+ if filtered_df.empty:
59
+ return "Не найдено фильмов для выбранных жанров."
60
+
61
+ # Используем модель для предсказания (замените np.random.rand() на реальную модель)
62
+ probabilities = np.random.rand(len(filtered_df)) # Здесь должны быть предсказания от модели
63
+
64
+ # Сортируем фильмы по количеству совпадений жанров и вероятности
65
+ filtered_df['probability'] = probabilities
66
+ filtered_df = filtered_df.sort_values(by=['genre_match', 'probability'], ascending=[False, False])
67
+
68
+ # Получаем фильмы с текущего индекса
69
+ movies_to_display = filtered_df.iloc[current_index:current_index + 10]
70
+ current_index += 10 # Увеличиваем индекс
71
+
72
+ if not movies_to_display.empty:
73
+ recommended_movies_list = movies_to_display[['names']].to_dict(orient='records')
74
+ return "\n".join([f"{movie['names']}" for movie in recommended_movies_list])
75
+ else:
76
+ return "Больше фильмов нет."
77
+
78
+ def reset_index():
79
+ global current_index, recommended_movies_list
80
+ current_index = 0
81
+ recommended_movies_list = []
82
+ return "Список фильмов обновлен."
83
+
84
+ def remove_movie(movie_name):
85
+ global recommended_movies_list
86
+ recommended_movies_list = [movie for movie in recommended_movies_list if movie['names'] != movie_name]
87
+ return "\n".join([f"{movie['names']}" for movie in recommended_movies_list])
88
+
89
+ # Интерфейс Gradio с дополнительными кнопками
90
+ with gr.Blocks() as demo:
91
+ genre_selector = gr.CheckboxGroup(choices=all_genres, label="Выберите жанры")
92
+ result_output = gr.Textbox(label="Рекомендации")
93
+
94
+ with gr.Row():
95
+ recommend_button = gr.Button("Рекомендовать 10 фильмов")
96
+ reset_button = gr.Button("Сбросить список")
97
+
98
+ recommend_button.click(fn=recommend_movies, inputs=genre_selector, outputs=result_output)
99
+ reset_button.click(fn=reset_index, outputs=result_output)
100
+
101
+ for movie in recommended_movies_list:
102
+ remove_button = gr.Button(f"Уже смотрел: {movie['names']}")
103
+ remove_button.click(fn=remove_movie, inputs=[gr.Textbox(value=movie['names'], visible=False)], outputs=result_output)
104
+
105
+ # Запуск интерфейса
106
+ demo.launch()