import streamlit as st
from PIL import Image
from chest_utils import predict_chest, condition_questions
from heart_utils import predict_heart
st.set_page_config(page_title="đŠē Disease Prediction App", layout="centered")
# Initialize session state
if "page" not in st.session_state:
st.session_state.page = "heart"
st.title("đŠē Disease Prediction App")
st.markdown("Follow the steps to assess your Heart, Chest, and Combined Health Risk.")
# Custom styled result display
def styled_result(label, result, icon, disease_detected):
if disease_detected:
bg = "#f8d7da" # light red
color = "#a94442"
else:
bg = "#d4edda" # light green
color = "#155724"
st.markdown(
f'''
{icon} {label}: {result}
''',
unsafe_allow_html=True
)
# âââââââââââââ Step 1: Heart Disease Prediction âââââââââââââ #
if st.session_state.page == "heart":
# Common Inputs
st.session_state.age = st.slider("Age", 1, 100, 30)
gender = st.selectbox("Gender", ["Male", "Female"])
st.session_state.gender = gender
st.session_state.sex = 1 if gender == "Male" else 0
st.header("â¤ī¸ Step 1: Heart Disease Prediction")
# Heart-related Inputs
st.session_state.cp = st.selectbox("Chest Pain Type", [0, 1, 2, 3])
st.session_state.trestbps = st.number_input("Resting Blood Pressure", min_value=80, max_value=200, value=120)
st.session_state.chol = st.number_input("Serum Cholesterol (mg/dl)", min_value=100, max_value=600, value=200)
st.session_state.fbs = st.selectbox("Fasting Blood Sugar > 120 mg/dl", [1, 0])
st.session_state.restecg = st.selectbox("Resting ECG", [0, 1, 2])
st.session_state.thalach = st.number_input("Max Heart Rate Achieved", min_value=60, max_value=220, value=150)
st.session_state.exang = st.selectbox("Exercise Induced Angina", [1, 0])
st.session_state.oldpeak = st.number_input("ST Depression", min_value=0.0, max_value=6.0, value=1.0)
st.session_state.slope = st.selectbox("Slope of ST Segment", [0, 1, 2])
st.session_state.ca = st.selectbox("Number of Major Vessels", [0, 1, 2, 3])
st.session_state.thal = st.selectbox("Thalassemia", [1, 2, 3])
if st.button("Next â Chest Symptoms"):
st.session_state.heart_result = predict_heart(
st.session_state.age, st.session_state.sex, st.session_state.cp, st.session_state.trestbps,
st.session_state.chol, st.session_state.fbs, st.session_state.restecg, st.session_state.thalach,
st.session_state.exang, st.session_state.oldpeak, st.session_state.slope,
st.session_state.ca, st.session_state.thal
)
# Show heart prediction immediately before proceeding
styled_result("Heart Disease Prediction", st.session_state.heart_result, "â¤ī¸", st.session_state.heart_result == "Heart Disease Detected")
st.session_state.page = "chest"
st.rerun()
# âââââââââââââ Step 2: Chest Disease Symptoms âââââââââââââ #
elif st.session_state.page == "chest":
st.header("đĢ Step 2: Chest Disease Symptoms")
st.markdown(f"âšī¸ Using Age:â¯**{st.session_state.age}**, Gender:â¯**{st.session_state.gender}**")
st.session_state.position = st.selectbox("View Position", ["PA", "AP"])
uploaded_file = st.file_uploader("Upload Chest X-ray", type=["jpg", "jpeg", "png"])
if uploaded_file:
st.session_state.image = Image.open(uploaded_file)
st.image(st.session_state.image, caption="Uploaded Chest X-ray", use_container_width=True)
st.subheader("Answer the following clinical questions:")
st.session_state.conditions = []
for question in condition_questions:
st.session_state.conditions.append(1 if st.checkbox(question) else 0)
if st.button("Next â Combined Prediction"):
if uploaded_file:
st.session_state.page = "combined"
st.rerun()
else:
st.warning("â ī¸ Please upload a chest X-ray to continue.")
# âââââââââââââ Step 3: Combined Prediction Results âââââââââââââ #
elif st.session_state.page == "combined":
st.header("đ Step 3: Combined Prediction Results")
chest_result = predict_chest(
st.session_state.age,
st.session_state.gender,
st.session_state.position,
st.session_state.conditions
)
heart_result = st.session_state.heart_result
st.image(st.session_state.image, caption="Uploaded Chest X-ray", use_container_width=True)
styled_result("Chest Disease Prediction", chest_result, "đĢ", chest_result == "Chest Disease Detected")
styled_result("Heart Disease Prediction", heart_result, "â¤ī¸", heart_result == "Heart Disease Detected")
# Combined risk display
if "Detected" in chest_result or "Detected" in heart_result:
st.markdown(
'''
â ī¸ Combined Risk: High â Immediate attention recommended.
''',
unsafe_allow_html=True
)
else:
st.markdown(
'''
â
Combined Risk: Low â You seem to be in good health.4
''',
unsafe_allow_html=True
)
if st.button("đ Start Over"):
st.session_state.clear()
st.rerun()