import streamlit as st import pandas as pd import numpy as np from joblib import load # Load the model clf = load("SVC()13.joblib") # Helper functions for feature engineering def encode(data): data['work_type'] = data['work_type'].replace({'Goverment job': 'Govt_job', "Never worked": "Never_worked", "Self-employed": "Self-employed"}) data_jobs = ['Govt_job', 'Never_worked', 'Private', 'Self-employed'] for job in data_jobs: data[job] = (data['work_type'] == job).astype(int) return data def replace_with_numeric_one_patient(data): data['ever_married'] = data['ever_married'].replace({'Yes': 1, 'No': 0}) data['residence_type'] = data['residence_type'].replace({'Urban': 1, 'Rural': 0}) data['smoking_status'] = data['smoking_status'].replace({'Never smoked': 0, 'Formerly smoked': 1, 'Smokes': 2}) data['gender'] = data['gender'].replace({'Male': -1, 'Female': 1, 'Other': 1}) data['avg_glucose_level'] = data['avg_glucose_level'].replace({"Normal (<100 mg/dL)": 0, "Prediabetes (<100, 125> mg/dL)": 1, "Diabetes (>125 mg/dL)": 2}) data['bmi'] = data['bmi'].replace({"Underweight (<18.4)": 0, "Normal (<18.5, 24.9>)": 1, "Overweight (<25, 29.9>)": 2, "Obese (>29.9)": 3}) return data def predict_stroke_from_one_patient(gender, age, hypertension, heartDisease, everMarried, residenceType, averageGlucoseLevel, bmi, smokingStatus, employementType): # Create DataFrame for prediction d = {'gender': [gender], 'age': [age], 'hypertension': [hypertension], 'heart_disease': [heartDisease], 'ever_married': [everMarried], 'residence_type': [residenceType], 'avg_glucose_level': [averageGlucoseLevel], 'bmi': [bmi], 'smoking_status': [smokingStatus], 'bmi_was_missing': [bmi is None], 'work_type': [employementType]} data = pd.DataFrame(data=d) # Feature engineering data = encode(data) data = replace_with_numeric_one_patient(data) data = data.drop("work_type", axis=1) # Ensure all expected features are present for feature in ['gender', 'age', 'hypertension', 'heart_disease', 'ever_married', 'residence_type', 'avg_glucose_level', 'bmi', 'smoking_status', 'bmi_was_missing']: if feature not in data.columns: data[feature] = 0 # Predict y_predicted = clf.predict(data) return 'stroke' if y_predicted == 1 else 'no stroke' # Streamlit interface st.title("Stroke Prediction") st.markdown(""" This predictive model uses various health and demographic features to estimate the likelihood of having a stroke. The model has been trained on historical health data and can assist in identifying individuals at risk based on their inputs. """) st.sidebar.header("Input Parameters") gender = st.sidebar.radio("Gender", ["Male", "Female"]) age = st.sidebar.slider("Age", 40, 90, value=40, step=1) hypertension = st.sidebar.checkbox("Hypertension") heartDisease = st.sidebar.checkbox("Heart Disease") everMarried = st.sidebar.checkbox("Is/Was Married?") residenceType = st.sidebar.radio("Residence Type", ["Urban", "Rural"]) averageGlucoseLevel = st.sidebar.selectbox("Average Glucose Level", ["Normal (<100 mg/dL)", "Prediabetes (<100, 125> mg/dL)", "Diabetes (>125 mg/dL)"]) bmi = st.sidebar.selectbox("BMI", ["Underweight (<18.4)", "Normal (<18.5, 24.9>)", "Overweight (<25, 29.9>)", "Obese (>29.9)"]) smokingStatus = st.sidebar.selectbox("Smoking Status", ["Never smoked", "Formerly smoked", "Smokes"]) employementType = st.sidebar.selectbox("Employment Type", ["Goverment job", "Never worked", "Private", "Self-employed"]) if st.sidebar.button("Predict"): prediction = predict_stroke_from_one_patient(gender, age, hypertension, heartDisease, everMarried, residenceType, averageGlucoseLevel, bmi, smokingStatus, employementType) st.sidebar.write(f"Prediction: {prediction}") # Reference table for standard values st.markdown("## Reference Table") reference_data = { "Feature": ["Gender", "Age", "Hypertension", "Heart Disease", "Ever Married", "Residence Type", "Average Glucose Level", "BMI", "Smoking Status", "Employment Type"], "Typical Value (Stroke)": ["Female", "65-75", "Yes", "Yes", "Yes", "Urban", "Diabetes (>125 mg/dL)", "Obese (>29.9)", "Smokes", "Self-employed"], "Typical Value (No Stroke)": ["Male", "40-50", "No", "No", "No", "Rural", "Normal (<100 mg/dL)", "Normal (<18.5, 24.9>)", "Never smoked", "Govt_job"] } df_reference = pd.DataFrame(reference_data) st.table(df_reference) # Determine the current Streamlit theme (light or dark) theme = st.get_option("theme.base") # Define button styling based on theme if theme == "light": button_bg_color = "#2c2e35" button_border_color = "1px solid black" button_text_color = "black" else: button_bg_color = "#2c2e35" button_border_color = "1px solid #fff" button_text_color = "#fff" # Rounded button-like element with dynamic styling st.markdown(f"""
Created by: Samuel Ameyaw
""", unsafe_allow_html=True)