sergey21000 commited on
Commit
59d5220
1 Parent(s): 2d73e81

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +109 -109
app.py CHANGED
@@ -1,110 +1,110 @@
1
- import pickle
2
- import pandas as pd
3
- import gradio as gr
4
-
5
- # словарь с названиями признаков на русском для отображения в приложении
6
- features = dict(
7
- gender='Пол',
8
- age='Возраст',
9
- hypertension='Гипертония',
10
- heart_disease='Заболевание сердца',
11
- smoking_history='История курения',
12
- bmi='Индекс массы тела',
13
- HbA1c_level='Гемоглобин',
14
- blood_glucose_level='Глюкоза',
15
- )
16
-
17
- # словари с названиями признаков и соответствующими индексами
18
- gender_label_to_index = {'Female': 0, 'Male': 1}
19
- smok_label_to_index = {
20
- 'Нет информации': 0,
21
- 'Курю': 1,
22
- 'Курил когда-либо': 2,
23
- 'Не курю (курил)': 3,
24
- 'Никогда не курил': 4,
25
- 'Бросил курить': 5,
26
- }
27
-
28
- # загрузка модели
29
- model_path = 'model.pkl'
30
- with open(model_path, 'rb') as f:
31
- model = pickle.load(f)
32
-
33
- # изменить ширину всего приложения (через css можно настраивать любые компоненты)
34
- css = '.gradio-container {width: 100% !important}'
35
-
36
- # интерфейс приложения
37
- with gr.Blocks(css=css) as demo:
38
- # приветсвенное сообщение
39
- gr.HTML(
40
- """
41
- <div style="text-align: center;">
42
- <h2 style="color: green; font-weight: bold; font-style: italic;">Диагностика диабета</h2>
43
- <h6>Введите ваши данные и получите результат</h6>
44
- </div>
45
- """
46
- )
47
- # строка в которой будут два столбца - 1) параметры ввода 2) картинка, датафрейм с введенными данными и результаты
48
- with gr.Row():
49
- # столбец с параметрами (scale между столбцами устанавливаем 1 к 3)
50
- with gr.Column(scale=1):
51
- # элементы параметров ввода данных пользователя (компоненты Gradio)
52
- gender = gr.Radio(gender_label_to_index.keys(), value='Male', label=features['gender'])
53
- with gr.Row():
54
- hypertension = gr.Checkbox(value=False, label=features['hypertension'])
55
- heart_disease = gr.Checkbox(value=False, label=features['heart_disease'])
56
- smoking_history = gr.Radio(smok_label_to_index.keys(), value='Нет информации', label=features['smoking_history'])
57
- age = gr.Slider(minimum=11, maximum=80, value=45, step=1, label=features['age'])
58
- bmi = gr.Slider(minimum=10.0, maximum=60.0, value=30.0, step=0.1, label=features['bmi'])
59
- HbA1c_level = gr.Slider(minimum=3.5, maximum=9.0, value=5.5, step=0.01, label=features['HbA1c_level'])
60
- blood_glucose_level = gr.Slider(minimum=80, maximum=300, value=138, step=1, label=features['blood_glucose_level'])
61
-
62
- # стобец с картинкой, датафреймом с введенными данными и результатом
63
- with gr.Column(scale=3):
64
-
65
- # отобразить картинку через через gr.Image()
66
- gr.Image('main_page_image.jpg', height=460)
67
- # датафрейм для отображения введенных данных
68
- dataframe = gr.DataFrame(
69
- value=pd.DataFrame(columns=features.values()), # пустой датафрейм с нашими названиями столбцов
70
- label='Ваши данные',
71
- row_count=1,
72
- column_widths='50%',
73
- height=100,
74
- # type='pandas',
75
- )
76
- # текстовое поле для результата
77
- textbox = gr.Textbox(label='Результат')
78
-
79
- # для удобства входные параметры о пользователе собираем в список
80
- all_params = [gender, age, hypertension, heart_disease, smoking_history, bmi, HbA1c_level, blood_glucose_level]
81
-
82
- # функция для предсказания результата - принимает введенные параметры, и выводит результат вместе с датафреймом параметров
83
- def predict(*params):
84
- # датафрейм параметров для отображения
85
- data_df = pd.DataFrame([dict(zip(features.values(), params))])
86
-
87
- # преобразовать все столбцы датафрейма к числам перед предиктом
88
- df_to_predict = data_df.copy()
89
- df_to_predict['Пол'] = gender_label_to_index[df_to_predict['Пол'][0]]
90
- df_to_predict['История курения'] = smok_label_to_index[df_to_predict['История курения'][0]]
91
-
92
- # сделать предсказание моделью - вероятность диабета
93
- diabetes_prob = model.predict_proba(df_to_predict.values)[0, 1]
94
- text_result = f'Вероятность диабета: {diabetes_prob:.2f}'
95
- # вернуть датафрейм с параметрами и результат - вероятность диабета
96
- return data_df, text_result
97
-
98
- # назначить прослушиватель событий - функция predict будет вызывыатся при изменени (change) любого из компонентов
99
- gr.on(
100
- triggers=[param.change for param in all_params],
101
- fn=predict,
102
- inputs=[*all_params],
103
- outputs=[dataframe, textbox],
104
- )
105
-
106
- # запуск приложения (убрать debug при деплое)
107
- demo.launch(debug=True)
108
-
109
- # чтобы сервер работал в докере нужно указать server_name='0.0.0.0'
110
  # demo.launch(server_name='0.0.0.0')
 
1
+ import pickle
2
+ import pandas as pd
3
+ import gradio as gr
4
+
5
+ # словарь с названиями признаков на русском для отображения в приложении
6
+ features = dict(
7
+ gender='Пол',
8
+ age='Возраст',
9
+ hypertension='Гипертония',
10
+ heart_disease='Заболевание сердца',
11
+ smoking_history='История курения',
12
+ bmi='Индекс массы тела',
13
+ HbA1c_level='Гемоглобин',
14
+ blood_glucose_level='Глюкоза',
15
+ )
16
+
17
+ # словари с названиями признаков и соответствующими индексами
18
+ gender_label_to_index = {'Female': 0, 'Male': 1}
19
+ smok_label_to_index = {
20
+ 'Нет информации': 0,
21
+ 'Курю': 1,
22
+ 'Курил когда-либо': 2,
23
+ 'Не курю (курил)': 3,
24
+ 'Никогда не курил': 4,
25
+ 'Бросил курить': 5,
26
+ }
27
+
28
+ # загрузка модели
29
+ model_path = 'model.pkl'
30
+ with open(model_path, 'rb') as f:
31
+ model = pickle.load(f)
32
+
33
+ # изменить ширину всего приложения (через css можно настраивать любые компоненты)
34
+ css = '.gradio-container {width: 80% !important}'
35
+
36
+ # интерфейс приложения
37
+ with gr.Blocks(css=css) as demo:
38
+ # приветсвенное сообщение
39
+ gr.HTML(
40
+ """
41
+ <div style="text-align: center;">
42
+ <h2 style="color: green; font-weight: bold; font-style: italic;">Диагностика диабета</h2>
43
+ <h6>Введите ваши данные и получите результат</h6>
44
+ </div>
45
+ """
46
+ )
47
+ # строка в которой будут два столбца - 1) параметры ввода 2) картинка, датафрейм с введенными данными и результаты
48
+ with gr.Row():
49
+ # столбец с параметрами (scale между столбцами устанавливаем 1 к 3)
50
+ with gr.Column(scale=1):
51
+ # элементы параметров ввода данных пользователя (компоненты Gradio)
52
+ gender = gr.Radio(gender_label_to_index.keys(), value='Male', label=features['gender'])
53
+ with gr.Row():
54
+ hypertension = gr.Checkbox(value=False, label=features['hypertension'])
55
+ heart_disease = gr.Checkbox(value=False, label=features['heart_disease'])
56
+ smoking_history = gr.Radio(smok_label_to_index.keys(), value='Нет информации', label=features['smoking_history'])
57
+ age = gr.Slider(minimum=11, maximum=80, value=45, step=1, label=features['age'])
58
+ bmi = gr.Slider(minimum=10.0, maximum=60.0, value=30.0, step=0.1, label=features['bmi'])
59
+ HbA1c_level = gr.Slider(minimum=3.5, maximum=9.0, value=5.5, step=0.01, label=features['HbA1c_level'])
60
+ blood_glucose_level = gr.Slider(minimum=80, maximum=300, value=138, step=1, label=features['blood_glucose_level'])
61
+
62
+ # стобец с картинкой, датафреймом с введенными данными и результатом
63
+ with gr.Column(scale=3):
64
+
65
+ # отобразить картинку через через gr.Image()
66
+ gr.Image('main_page_image.jpg', height=460)
67
+ # датафрейм для отображения введенных данных
68
+ dataframe = gr.DataFrame(
69
+ value=pd.DataFrame(columns=features.values()), # пустой датафрейм с нашими названиями столбцов
70
+ label='Ваши данные',
71
+ row_count=1,
72
+ column_widths='50%',
73
+ height=100,
74
+ # type='pandas',
75
+ )
76
+ # текстовое поле для результата
77
+ textbox = gr.Textbox(label='Результат')
78
+
79
+ # для удобства входные параметры о пользователе собираем в список
80
+ all_params = [gender, age, hypertension, heart_disease, smoking_history, bmi, HbA1c_level, blood_glucose_level]
81
+
82
+ # функция для предсказания результата - принимает введенные параметры, и выводит результат вместе с датафреймом параметров
83
+ def predict(*params):
84
+ # датафрейм параметров для отображения
85
+ data_df = pd.DataFrame([dict(zip(features.values(), params))])
86
+
87
+ # преобразовать все столбцы датафрейма к числам перед предиктом
88
+ df_to_predict = data_df.copy()
89
+ df_to_predict['Пол'] = gender_label_to_index[df_to_predict['Пол'][0]]
90
+ df_to_predict['История курения'] = smok_label_to_index[df_to_predict['История курения'][0]]
91
+
92
+ # сделать предсказание моделью - вероятность диабета
93
+ diabetes_prob = model.predict_proba(df_to_predict.values)[0, 1]
94
+ text_result = f'Вероятность диабета: {diabetes_prob:.2f}'
95
+ # вернуть датафрейм с параметрами и результат - вероятность диабета
96
+ return data_df, text_result
97
+
98
+ # назначить прослушиватель событий - функция predict будет вызывыатся при изменени (change) любого из компонентов
99
+ gr.on(
100
+ triggers=[param.change for param in all_params],
101
+ fn=predict,
102
+ inputs=[*all_params],
103
+ outputs=[dataframe, textbox],
104
+ )
105
+
106
+ # запуск приложения (убрать debug при деплое)
107
+ demo.launch(debug=True)
108
+
109
+ # чтобы сервер работал в докере нужно указать server_name='0.0.0.0'
110
  # demo.launch(server_name='0.0.0.0')