import streamlit as st
import joblib, json, pandas as pd, time
from datetime import datetime
from io import BytesIO
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import letter
st.set_page_config(page_title="Stroke Risk Predictor", page_icon="icon2.png", layout="centered")
# ---------- SESSION ----------
if "show_reset" not in st.session_state:
st.session_state.show_reset = False
# ---------- STYLE ----------
st.markdown("""
""", unsafe_allow_html=True)
# ---------- HEADER ----------
st.markdown("""
', unsafe_allow_html=True)
st.subheader("π§ Personal Details")
gender = st.selectbox("Gender", ["Male","Female","Other"])
age = st.slider("Age", 1, 100, 45)
ever_married = st.checkbox("Married")
st.markdown('
', unsafe_allow_html=True)
st.markdown('', unsafe_allow_html=True)
st.subheader("π©Ί Health Info")
hypertension = st.checkbox("Hypertension")
heart_disease = st.checkbox("Heart Disease")
avg_glucose = st.slider("Average Glucose", 40.0, 300.0, 100.0)
bmi = st.slider("BMI", 10.0, 60.0, 24.0)
st.markdown('
', unsafe_allow_html=True)
st.markdown('', unsafe_allow_html=True)
st.subheader("π‘ Lifestyle")
work_type = st.radio("Work", ["Private","Self-employed","Govt_job","child","Never_worked"], horizontal=True)
res_type = st.radio("Residence", ["Urban","Rural"], horizontal=True)
smoking = st.radio("Smoking", ["never smoked","formerly smoked","smokes","Unknown"], horizontal=True)
colA, colB = st.columns(2)
with colA:
predict_btn = st.button("β¨ Check Risk")
# show reset as soon as prediction is attempted
if predict_btn:
st.session_state.show_reset = True
with colB:
reset_btn = None
if st.session_state.show_reset:
st.markdown('
', unsafe_allow_html=True)
reset_btn = st.button(" Reset ", key="reset", help="Clear all inputs")
st.markdown('
', unsafe_allow_html=True)
# ---------- RESET ----------
if reset_btn:
st.session_state.clear()
st.rerun()
# ---------- CONVERT ----------
ever_married = "Yes" if ever_married else "No"
hypertension = 1 if hypertension else 0
heart_disease = 1 if heart_disease else 0
# ===============================
# RESULT
# ===============================
if predict_btn:
data = {
"gender": gender,
"age": age,
"hypertension": hypertension,
"heart_disease": heart_disease,
"ever_married": ever_married,
"work_type": work_type,
"Residence_type": res_type,
"avg_glucose_level": avg_glucose,
"bmi": bmi,
"smoking_status": smoking
}
prob, pred = predict(data)
percent = round(prob * 100, 1)
with st.spinner("Analyzingβ¦"):
time.sleep(0.8)
st.divider()
st.markdown('
π Summary
', unsafe_allow_html=True)
c1, c2 = st.columns(2)
with c1:
st.write(f"**Gender:** {gender}")
st.write(f"**Age:** {age}")
st.write(f"**Married:** {ever_married}")
st.write(f"**Residence:** {res_type}")
with c2:
st.write(f"**Hypertension:** {hypertension}")
st.write(f"**Heart Disease:** {heart_disease}")
st.write(f"**Glucose:** {avg_glucose}")
st.write(f"**BMI:** {bmi}")
st.markdown(f"""
Estimated Risk
{percent}%
""", unsafe_allow_html=True)
bar = st.progress(0)
for i in range(int(percent)):
time.sleep(0.01)
bar.progress(i + 1)
# ---------- SMART SUGGESTIONS ----------
reasons, tips = [], []
if avg_glucose > 125: reasons.append("High glucose increases stroke risk"); tips.append("Reduce sugar and walk daily.")
if bmi >= 30: reasons.append("High BMI strains the heart"); tips.append("Aim gradual weight loss.")
if hypertension: reasons.append("Blood pressure increases stroke risk"); tips.append("Reduce salt β monitor BP.")
if heart_disease: reasons.append("Heart disease increases clot risk"); tips.append("Follow cardiac treatment regularly.")
if smoking == "smokes": reasons.append("Smoking damages blood vessels"); tips.append("Quitting sharply reduces risk.")
if not reasons: reasons.append("Fewer major risk factors detected"); tips.append("Maintain activity, diet, and checkups.")
st.markdown('
π§ͺ Why this score?
', unsafe_allow_html=True)
for r in reasons:
st.write("π " + r)
st.markdown('
π‘ Suggestions
', unsafe_allow_html=True)
for t in tips:
st.write("β
" + t)
if pred:
st.warning("β οΈ Higher risk β please consult a medical professional.")
else:
st.success("π Lower risk β keep following healthy habits.")
# ---------- PDF ----------
def create_pdf():
buffer = BytesIO()
styles = getSampleStyleSheet()
doc = SimpleDocTemplate(buffer, pagesize=letter)
content = [
Paragraph("
Stroke Risk Report", styles["Title"]),
Spacer(1, 10),
Paragraph(f"Risk: {percent}%", styles["Normal"]),
Paragraph(f"Gender: {gender}", styles["Normal"]),
Paragraph(f"Age: {age}", styles["Normal"]),
Paragraph(f"Glucose: {avg_glucose}", styles["Normal"]),
Paragraph(f"BMI: {bmi}", styles["Normal"]),
Spacer(1, 10),
Paragraph("
Recommendations:", styles["Heading2"]),
]
for t in tips:
content.append(Paragraph("β’ " + t, styles["Normal"]))
doc.build(content)
buffer.seek(0)
return buffer
st.download_button(
"π Download Report (PDF)",
create_pdf(),
file_name="stroke_report.pdf",
mime="application/pdf"
)