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)