bezrabot / app.py
Vilyam888's picture
Upload app.py
2012ca9 verified
import tensorflow as tf
import numpy as np
import gradio as gr
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import random
# Загрузка модели из локального файла
model = tf.keras.models.load_model('bezrabotica.keras')
# Загрузка данных из локального файла
data = pd.read_csv('data.csv')
# Оставляем только нужные столбцы
columns_to_keep = [
'territory',
'num_economactivepopulation_all',
'employed_num_all',
'unemployed_num_all',
'eactivity_lvl',
'employment_lvl',
'unemployment_lvl',
'dis_unagegroup_30-39',
'dis_emagegroup_30-39',
'num_unagegroup_30-39',
'num_emagegroup_30-39',
'year'
]
data = data[columns_to_keep]
# Заполнение пропущенных значений
data.fillna(data.mean(numeric_only=True), inplace=True)
# Очистка данных для столбца "territory"
def clean_territory(value):
if isinstance(value, str) and len(value) > 100:
return value[:100]
return value
data['territory'] = data['territory'].apply(clean_territory)
data['territory'] = data['territory'].astype(str).str.strip()
# Маппинг территории
territory_mapping = {territory: idx for idx, territory in enumerate(data['territory'].unique())}
territory_reverse_mapping = {v: k for k, v in territory_mapping.items()}
data['territory'] = data['territory'].map(territory_mapping)
# Нормализация данных
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data.drop(['year'], axis=1))
normalized_df = pd.DataFrame(normalized_data, columns=[col for col in data.columns if col != 'year'])
normalized_df['year'] = data['year'].values
# Функция предсказания
def predict_unemployment(territory):
if territory not in territory_mapping:
return "Неверное название территории. Пожалуйста, выберите из списка."
predictions = []
current_year = data['year'].max() + 1
for i in range(5):
sample_row = data[data['territory'] == territory_mapping[territory]].iloc[-1].copy()
sample_row['year'] = current_year
input_data = sample_row.drop('year').values.reshape(1, -1)
# Нормализация входных данных
input_normalized = scaler.transform(input_data)
input_sequence = np.expand_dims(input_normalized, axis=0)
# Прогноз
prediction = model.predict(input_sequence)
random_variation = random.uniform(-0.5, 0.5) # Добавление случайной вариации
adjusted_prediction = max(0, prediction[0][0] * 100 + random_variation) # Гарантия, что результат не отрицательный
predictions.append((current_year, f"{adjusted_prediction:.2f}"))
# Обновление года
current_year += 1
return [[year, value] for year, value in predictions]
# Интерфейс Gradio
interface = gr.Interface(
fn=predict_unemployment,
inputs=[
gr.Dropdown(label="Территория", choices=list(territory_mapping.keys()))
],
outputs=[
gr.Dataframe(headers=["Год", "Прогноз уровня безработицы (%)"], label="Прогноз на ближайшие 5 лет")
],
title="Модель прогнозирования уровня безработицы",
description="Выберите территорию для прогноза уровня безработицы на ближайшие 5 лет."
)
interface.launch()