import gradio as gr import joblib import numpy as np # Load the models and scalers model_initial = joblib.load('model_initial.pkl') scaler_initial = joblib.load('scaler_initial.pkl') model_detailed = joblib.load('model_detailed.pkl') scaler_detailed = joblib.load('scaler_detailed.pkl') # Define risk thresholds globally very_high_risk_threshold = 0.75 high_risk_threshold = 0.50 moderate_risk_threshold = 0.15 def initial_risk_check(features, detailed): if detailed: # Use the detailed model features_scaled = scaler_detailed.transform([features]) prediction = model_detailed.predict_proba(features_scaled)[:, 1][0] else: # Use the initial model features_scaled = scaler_initial.transform([features[:3]]) # Only use the first three features prediction = model_initial.predict_proba(features_scaled)[:, 1][0] return prediction def update_output(family_history, personal_history, pregnancies, age, bmi, detailed, ogtt, sys_bp, hdl): if detailed: features = [pregnancies, age, bmi, ogtt, sys_bp, hdl] else: features = [pregnancies, age, bmi] prediction = initial_risk_check(features, detailed) # Adjust prediction based on the user's history if family_history: prediction *= 1.5 # Risk increases 1.5 times with a family history of diabetes if personal_history: prediction *= 2 # Risk increases 2 times with a personal history of GDM # Ensure prediction does not exceed 1 prediction = min(prediction, 1) # Determine risk level and recommendation if prediction >= very_high_risk_threshold: return f"**Very High risk ({prediction:.2%}). Please consult a doctor immediately.**" elif prediction >= high_risk_threshold: return f"**High risk ({prediction:.2%}). Please consult a doctor and follow a personalized training program.**" elif prediction >= moderate_risk_threshold: return f"**Moderate risk ({prediction:.2%}). Consider lifestyle changes and monitor your health closely.**" else: return f"**Low risk ({prediction:.2%}). Maintain a healthy lifestyle and schedule routine check-ups.**" def launch_interface(): with gr.Blocks(css=""" .gradio-container { font-family: Arial, sans-serif; background-color: #f9f9f9; color: #333; } .gr-button { background-color: #007bff; color: white; } .gr-button:hover { background-color: #0056b3; } .gr-textbox { margin-bottom: 1em; } .gr-markdown h1 { color: #007bff; } .gr-radio-group label { color: #007bff; } .gr-number, .gr-textbox, .gr-checkbox, .gr-radio-group { margin: 0.5em 0; } """) as app: gr.Markdown(""" # Gestational Diabetes Risk Calculator Welcome to our Gestational Diabetes Risk Calculator, designed to empower you with valuable insights about your health based on the latest NICE (National Institute for Health and Care Excellence) medical guidelines. By providing some key information, you can receive a personalized assessment of your risk level. If the system identifies a moderate or high risk, you will be guided to provide more detailed information for an accurate evaluation. ## How to Use the System 1. **Step 1**: Answer the questions about your family and personal history of diabetes. 2. **Step 2**: Enter your **Number of Pregnancies**, **Age**, and **BMI**. 3. **Step 3**: If the initial assessment indicates moderate or high risk, you will be prompted to provide additional details such as **OGTT**, **Systolic Blood Pressure**, and **HDL** levels. 4. **Step 4**: Click "Submit" to receive your risk assessment and personalized recommendations. ## Important Information - **Family History**: Women with a first-degree relative (parent or sibling) with diabetes have a higher risk of developing GDM. This can increase the risk by about 2 to 3 times. - **Personal History**: Women who have had GDM in a previous pregnancy have a 30% to 70% chance of developing GDM in subsequent pregnancies. ## Detailed Parameter Explanations - **Number of Pregnancies**: The number of times you have been pregnant. Multiple pregnancies can increase the risk of GDM. - **Age**: Your age in years. Advanced maternal age (over 25) is a risk factor for GDM. - **BMI**: Body Mass Index, a measure of body fat based on height and weight. A higher BMI is associated with an increased risk of GDM. - **OGTT**: Oral Glucose Tolerance Test, a test that measures the body's ability to use glucose. Higher values indicate greater risk. - **Systolic Blood Pressure**: The upper number in a blood pressure reading, indicating how much pressure your blood is exerting against your artery walls when the heart beats. Higher blood pressure can be a risk factor. - **HDL**: High-Density Lipoprotein, also known as 'good' cholesterol. Lower levels of HDL can indicate higher risk. """) # Initial inputs family_history = gr.Checkbox(label="Family history of diabetes", value=False) personal_history = gr.Checkbox(label="Personal history of GDM", value=False) pregnancies = gr.Number(label="Number of Pregnancies", info="The number of times you have been pregnant.") age = gr.Number(label="Age", info="Your age in years.") bmi = gr.Number(label="BMI", info="Body Mass Index, a measure of body fat based on height and weight.") detailed = gr.Checkbox(label="Check if you are at or above moderate risk for detailed input", value=False) # Detailed inputs ogtt = gr.Number(label="OGTT", visible=False, info="Oral Glucose Tolerance Test, a test that measures the body's ability to use glucose.") sys_bp = gr.Number(label="Systolic Blood Pressure", visible=False, info="The upper number in a blood pressure reading, indicating how much pressure your blood is exerting against your artery walls when the heart beats.") hdl = gr.Number(label="HDL", visible=False, info="High-Density Lipoprotein, also known as 'good' cholesterol.") # Output and button submit_button = gr.Button("Submit") output = gr.Markdown(label="Result") # Update output based on user input def update_output(family_history, personal_history, pregnancies, age, bmi, detailed, ogtt, sys_bp, hdl): if detailed: features = [pregnancies, age, bmi, ogtt, sys_bp, hdl] else: features = [pregnancies, age, bmi] prediction = initial_risk_check(features, detailed) # Adjust prediction based on the user's history if family_history: prediction *= 1.5 # Risk increases 1.5 times with a family history of diabetes if personal_history: prediction *= 2 # Risk increases 2 times with a personal history of GDM # Ensure prediction does not exceed 1 prediction = min(prediction, 1) # Determine risk level and recommendation if prediction >= very_high_risk_threshold: return f"**Very High risk ({prediction:.2%}). Please consult a doctor immediately.**" elif prediction >= high_risk_threshold: return f"**High risk ({prediction:.2%}). Please consult a doctor and follow a personalized training program.**" elif prediction >= moderate_risk_threshold: return f"**Moderate risk ({prediction:.2%}). Consider lifestyle changes and monitor your health closely.**" else: return f"**Low risk ({prediction:.2%}). Maintain a healthy lifestyle and schedule routine check-ups.**" # Toggle visibility of detailed inputs def toggle_visibility(detailed): return { ogtt: gr.update(visible=detailed), sys_bp: gr.update(visible=detailed), hdl: gr.update(visible=detailed) } # Change visibility of detailed inputs based on checkbox detailed.change( fn=toggle_visibility, inputs=[detailed], outputs=[ogtt, sys_bp, hdl] ) # Submit button functionality submit_button.click( fn=update_output, inputs=[family_history, personal_history, pregnancies, age, bmi, detailed, ogtt, sys_bp, hdl], outputs=[output] ) app.launch(share=True) if __name__ == "__main__": launch_interface()