from scripts.model_training import model_training import pandas as pd import streamlit as st st.set_page_config( page_title="Cardiovascular-Disease App", page_icon="🧊", layout="wide", initial_sidebar_state="expanded" ) def user_input_features(): age = st.sidebar.slider('Возраст', min_value=10, max_value=100, step=1, ) gender= st.sidebar.selectbox('Пол', options=('ΠœΡƒΠΆΡΠΊΠΎΠΉ', 'ЖСнский'), ) height = st.sidebar.slider('Рост (см)', min_value=100, max_value=200, value=150, step=1, ) weight = st.sidebar.slider('ВСс (ΠΊΠ³)', min_value=30, max_value=200, value=70, step=1, ) ap_hi = st.sidebar.slider('БистоличСскоС Π°Ρ€Ρ‚Π΅Ρ€ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅', min_value=50, max_value=200, value=120, step=1, ) ap_lo = st.sidebar.slider('ДиастоличСскоС Π°Ρ€Ρ‚Π΅Ρ€ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅', min_value=50, max_value=200, value=80, step=1, ) cholesterol = st.sidebar.selectbox('ΠžΠ±Ρ‰ΠΈΠΉ холСстСрин (ммоль/Π».)', options=('<5','5-63', '>6.3'), ) gluc = st.sidebar.selectbox('Π“Π»ΡŽΠΊΠΎΠ·Π° (ммоль/Π».)', options=('3.5β€”5.5','5.6-9', '>9'), ) smoke = st.sidebar.selectbox('ΠšΡƒΡ€Π΅Π½ΠΈΠ΅', options=('Π”Π°','НСт'), ) alco = st.sidebar.selectbox('Π£ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ алкоголя', options=('Π”Π°','НСт'), ) active = st.sidebar.selectbox('ЀизичСская Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ', options=('Π”Π°','НСт'), ) def map_gluc(gluc): if gluc == '3.5β€”5.5': return '1' elif gluc == '5.6-9': return '2' else: return '3' def map_cholesterol(cholesterol): if cholesterol == '<5': return '1' elif cholesterol == '5-63': return '2' else: return '3' age = age * 365 data = {'age': age, 'gender': '1' if gender == 'ЖСнский' else '0', 'height': height, 'weight': weight, 'ap_hi': ap_hi, 'ap_lo': ap_lo, 'cholesterol': map_cholesterol(cholesterol), 'gluc': map_gluc(gluc), 'smoke': '1' if smoke == 'Π”Π°' else '0', 'alco': '1' if alco == 'Π”Π°' else '0', 'active': '1' if active == 'Π”Π°' else '0', } features = pd.DataFrame(data, index=[0]) return features @st.cache_data() def get_model(): model, metric = model_training() model_json = {'model': model, 'metric': metric} return model_json def main(): st.write(""" # ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для опрСдСлСния наличия сСрдСчно-сосудистого заболСвания (Π‘Π‘Π—) :heartpulse: """) st.sidebar.header("ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Π²ΠΎΠ΄Π°") st.divider() user_data = user_input_features() st.write(" # Π’Π°ΡˆΠΈ Π΄Π°Π½Π½Ρ‹Π΅") new_column_names = {'age': 'Возраст (Π΄Π½Π΅ΠΉ)', 'gender': 'Пол', 'height': 'Рост (см)' , 'weight': 'ВСс (ΠΊΠ³)', 'ap_hi': 'БистоличСскоС Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅', 'ap_lo': 'ДиастоличСскоС Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅', 'cholesterol': 'ΠžΠ±Ρ‰ΠΈΠΉ холСстСрин', 'gluc': 'Π“Π»ΡŽΠΊΠΎΠ·Π°', 'smoke': 'ΠšΡƒΡ€Π΅Π½ΠΈΠ΅', 'alco': 'Алкоголь', 'active': 'ЀизичСская Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ', 'cardio': 'x', } user_data_rus = user_data.rename(columns=new_column_names) st.dataframe(user_data_rus) with st.spinner('Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ ...'): model = get_model() st.success('МодСль Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π°!') st.divider() diag_btn = st.button("Диагностика", type="primary") if diag_btn == True: result = ' '.join(map(str, model['model'].predict(user_data))) result = "ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ" if result == "positive" else "ΠžΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ" metric = model['metric'] col1, col2 = st.columns(2) col1.metric(label=" # :heartpulse: Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚", value=result, ) col2.metric(label=" # ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ°", value=str(metric), ) if __name__ == "__main__": main()