File size: 3,773 Bytes
b3f3f41
61550d2
 
 
 
9dd569e
46ff0e0
ff2a3a1
 
b3f3f41
ff2a3a1
 
61550d2
b2b1653
61550d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b2b1653
 
61550d2
 
b2b1653
61550d2
 
 
 
 
 
 
b2b1653
 
61550d2
b2b1653
61550d2
 
b2b1653
61550d2
 
 
 
 
b2b1653
1c18b6b
 
b2b1653
1c18b6b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9dd569e
 
 
1c18b6b
 
 
 
2012ca9
61550d2
b2b1653
61550d2
1c18b6b
61550d2
1c18b6b
61550d2
2012ca9
 
 
1c18b6b
 
61550d2
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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()