Spaces:
Sleeping
Sleeping
import gradio as gr | |
import matplotlib | |
matplotlib.use("Agg") | |
import matplotlib.pyplot as plt | |
import numpy as np | |
import pandas as pd | |
import seaborn as sns | |
def hazard_predictor(gender, age, bmi, diabetes_type, spb, dbp, hba1c, smoking, marital_status): | |
# Dummy hazard function with a limit of 0.95 (95%) | |
hazard_ratio = min((age / 50) * (bmi / 25) * (spb / 120) * (dbp / 80), 0.92) | |
return {'Hazard Ratio': hazard_ratio} | |
def plot_chart(hazard_ratio, age): | |
age_range = np.linspace(18, 100, 500) | |
hazard_ratio_line = [] | |
for a in age_range: | |
if a <= age: | |
hazard_ratio_line.append(a / age * hazard_ratio) | |
else: | |
hazard_ratio_line.append(hazard_ratio) | |
# Create a dataframe for Seaborn plotting | |
data = {'Age': age_range, 'Hazard Ratio': hazard_ratio_line} | |
df = pd.DataFrame(data) | |
# Create the Seaborn line plot | |
sns_plot = sns.lineplot(x="Age", y="Hazard Ratio", data=df) | |
# Set plot labels and limits | |
sns_plot.set(xlabel='Age', ylabel='Hazard Ratio', ylim=(0, 1)) | |
# Save the plot as an image | |
chart_filepath = "chart.png" | |
plt.savefig(chart_filepath, dpi=150) | |
plt.close() # Close the plot to free up the memory | |
return chart_filepath | |
def output_function(gender, age, bmi, diabetes_type, spb, dbp, hba1c, smoking, marital_status): | |
hazard_ratio = hazard_predictor(gender, age, bmi, diabetes_type, spb, dbp, hba1c, smoking, marital_status)['Hazard Ratio'] | |
output_label = f"Hazard Ratio: {hazard_ratio}" | |
chart_filepath = plot_chart(hazard_ratio, age) | |
return output_label, chart_filepath | |
# Save the chart as an image | |
chart_filepath = "chart.png" | |
chart.savefig(chart_filepath, dpi=150) | |
return output_label, chart_filepath | |
# Gradio user interface components | |
gender_radio = gr.inputs.Radio(choices=['Female', 'Male'], label="Gender") | |
age_slider = gr.inputs.Slider(minimum=18, maximum=100, step=1, default=50, label="Age") | |
bmi_slider = gr.inputs.Slider(minimum=15, maximum=50, step=0.1, default=25, label="BMI") | |
diabetes_type_radio = gr.inputs.Radio(choices=['Type 1', 'Type 2', 'Gestational'], label="Diabetes Type") | |
spb_slider = gr.inputs.Slider(minimum=90, maximum=200, step=1, default=120, label="Systolic Blood Pressure (SPB)") | |
dbp_slider = gr.inputs.Slider(minimum=60, maximum=120, step=1, default=80, label="Diastolic Blood Pressure (DBP)") | |
hba1c_slider = gr.inputs.Slider(minimum=100, maximum=400, step=1, default=200, label="Hemoglobin A1c value (mg/dL)") | |
smoking_radio = gr.inputs.Radio(choices=['Non-smoker', 'Smoker'], label="Smoking History") | |
marital_status_dropdown = gr.inputs.Dropdown(choices=['Single', 'Married', 'Widowed', 'Divorced'], label="Marital Status") | |
output_text = gr.outputs.Textbox(label="Hazard Ratio") | |
output_chart = gr.outputs.Image(type='filepath') | |
# Creating Gradio interface | |
interface = gr.Interface(fn=output_function, | |
inputs=[gender_radio, age_slider, bmi_slider, diabetes_type_radio, spb_slider, dbp_slider, hba1c_slider, smoking_radio, marital_status_dropdown], | |
outputs=[output_text, output_chart], | |
title="Diabetes Cox Proportional Hazard Predictor", | |
submit_button="Predict") | |
interface.launch(debug=True) |