import streamlit as st import pandas as pd import joblib import os # Adjust paths based on container directory structure BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # one level up from src/ MODEL_PATH = os.path.join(BASE_DIR, "Hb_predict", "tuned_xgboost_model.pkl") SCALER_PATH = os.path.join(BASE_DIR, "Hb_predict", "scaler.pkl") # Load model and scaler model = joblib.load(MODEL_PATH) scaler = joblib.load(SCALER_PATH) st.title("Hemoglobin Level Predictor") st.markdown( """ ### Developed by Dr. Vinod Kumar Yata's research group School of Allied and Healthcare Sciences, Malla Reddy University, Hyderabad, India --- ⚠️ **Warning**: This is an experimental tool and should not be used for medical diagnosis. Always consult a licensed healthcare provider for medical advice. --- """ ) # User inputs age = st.number_input("Age", min_value=0, max_value=120, value=30) sbp = st.number_input("Systolic Blood Pressure (SBP)", min_value=50, max_value=200, value=120) dbp = st.number_input("Diastolic Blood Pressure (DBP)", min_value=30, max_value=130, value=80) heart_rate = st.number_input("Heart Rate", min_value=30, max_value=200, value=75) respiratory_rate = st.number_input("Respiratory Rate", min_value=5, max_value=60, value=18) temperature_c = st.number_input("Temperature (°C)", min_value=30.0, max_value=45.0, value=36.5, format="%.1f") oxygen_saturation = st.slider("Oxygen Saturation (%)", min_value=50.0, max_value=100.0, value=98.0) gender = st.selectbox("Gender", options=["Male", "Female"]) # Calculate derived features gender_encoded = 1 if gender == "Male" else 0 gender_male = gender_encoded pulse_pressure = sbp - dbp # Prepare input DataFrame matching model feature names exactly input_df = pd.DataFrame([{ "Age": age, "SBP": sbp, "DBP": dbp, "HeartRate": heart_rate, "RespiratoryRate": respiratory_rate, "TemperatureC": temperature_c, "OxygenSaturation(%)": oxygen_saturation, "Gender_Encoded": gender_encoded, "Pulse_Pressure": pulse_pressure, "Gender_Male": gender_male }]) # Predict on button click if st.button("Predict Hemoglobin Level"): try: input_scaled = scaler.transform(input_df) prediction = model.predict(input_scaled)[0] st.success(f"Predicted Hemoglobin Level: {prediction:.2f} g/dL") except Exception as e: st.error(f"Prediction failed: {e}")