import pickle import streamlit as st from streamlit_option_menu import option_menu # ================== PAGE CONFIG ================== st.set_page_config( page_title="Smart Health AI", page_icon="🧠", layout="wide", ) # ================== LOAD MODELS ================== def load_model(file): try: return pickle.load(open(file, "rb")) except: st.error(f"❌ Could not load model: {file}") return None diabetes_model = load_model("src/models/diabetes_model.sav") heart_model = load_model("src/models/heart_model.sav") parkinson_model = load_model("src/models/parkinsons_model.sav") # ================== SIDEBAR MENU ================== with st.sidebar: st.title("🩺 Smart Health AI") selected = option_menu( "Main Menu", ["Diabetes Prediction", "Heart Disease Prediction", "Parkinson's Prediction"], icons=["activity", "heart", "person"], default_index=0 ) # ================== INPUT FUNCTIONS ================== # --------- Diabetes Inputs --------- def get_diabetes_input(): col1, col2, col3 = st.columns(3) Pregnancies = col1.number_input('Pregnancies', 0) Glucose = col2.number_input('Glucose Level', 0.0) BloodPressure = col3.number_input('Blood Pressure', 0.0) SkinThickness = col1.number_input('Skin Thickness', 0.0) Insulin = col2.number_input('Insulin Level', 0.0) BMI = col3.number_input('BMI', 0.0) DPF = col1.number_input('Diabetes Pedigree Function', 0.0) Age = col2.number_input('Age', 0) return [Pregnancies, Glucose, BloodPressure, SkinThickness, Insulin, BMI, DPF, Age] # --------- Heart Inputs --------- def get_heart_input(): cols = st.columns(4) age = cols[0].number_input("Age", 0) sex = cols[1].selectbox("Sex", [0,1]) cp = cols[2].selectbox("Chest Pain Type (0–3)", [0,1,2,3]) trestbps = cols[3].number_input("Resting Blood Pressure", 0) chol = cols[0].number_input("Cholesterol", 0) fbs = cols[1].selectbox("Fasting Sugar > 120 mg/dl", [0,1]) restecg = cols[2].selectbox("Rest ECG", [0,1,2]) thalach = cols[3].number_input("Max Heart Rate", 0) exang = cols[0].selectbox("Exercise Angina", [0,1]) oldpeak = cols[1].number_input("ST Depression", 0.0) slope = cols[2].selectbox("Slope", [0,1,2]) ca = cols[3].selectbox("Number of Major Vessels (0–4)", [0,1,2,3,4]) thal = cols[0].selectbox("Thal", [0,1,2,3]) return [age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca, thal] # --------- Parkinson Inputs --------- def get_parkinson_input(): params = [ "MDVP:Fo(Hz)", "MDVP:Fhi(Hz)", "MDVP:Flo(Hz)", "MDVP:Jitter(%)", "MDVP:Jitter(Abs)", "MDVP:RAP", "MDVP:PPQ", "Jitter:DDP", "MDVP:Shimmer", "MDVP:Shimmer(dB)", "Shimmer:APQ3", "Shimmer:APQ5", "MDVP:APQ", "Shimmer:DDA", "NHR", "HNR", "RPDE", "DFA", "spread1", "spread2", "D2", "PPE" ] cols = st.columns(3) values = [] for i, p in enumerate(params): values.append(cols[i % 3].number_input(p, value=0.0)) return values # ================== PREDICT FUNCTION ================== def predict(model, data): return model.predict([data])[0] # ================== MAIN APP ================== if selected == "Diabetes Prediction": st.header("🩸 Diabetes Prediction") data = get_diabetes_input() if st.button("Predict"): result = predict(diabetes_model, data) if result == 1: st.error("⚠️ The person is diabetic.") else: st.success("✅ The person is not diabetic.") elif selected == "Heart Disease Prediction": st.header("❤️ Heart Disease Prediction") data = get_heart_input() if st.button("Predict Heart Disease"): result = predict(heart_model, data) if result == 1: st.error("⚠️ The patient is at risk of heart disease.") else: st.success("✅ The heart is healthy.") elif selected == "Parkinson's Prediction": st.header("🧠 Parkinson's Detection") data = get_parkinson_input() if st.button("Predict Parkinson's"): result = predict(parkinson_model, data) if result == 1: st.error("⚠️ Parkinson's Detected.") else: st.success("✅ No Parkinson's signs detected.") st.markdown("---") st.markdown("Developed by Eng Youssef Samy | AI Smart Health")