# streamlit_app.py import os import joblib import pandas as pd import streamlit as st # ----------------- Paths ----------------- BASE_PATH = "src" ADMISSION_CSV = os.path.join(BASE_PATH, "admission_data.csv") VISA_CSV = os.path.join(BASE_PATH, "visa_data.csv") ADMISSION_MODEL_FILE = os.path.join(BASE_PATH, "admission_model_rf.pkl") VISA_MODEL_FILE = os.path.join(BASE_PATH, "visa_model_tuned_gb.pkl") # ----------------- Helpers ----------------- @st.cache_data(show_spinner=False) def load_csv_safe(path): if os.path.exists(path): try: return pd.read_csv(path) except Exception as e: st.warning(f"Could not read {path}: {e}") return None return None @st.cache_resource(show_spinner=False) def load_models_safe(): admission_model = visa_model = None if os.path.exists(ADMISSION_MODEL_FILE): try: admission_model = joblib.load(ADMISSION_MODEL_FILE) except Exception as e: st.warning(f"Failed to load admission model: {e}") if os.path.exists(VISA_MODEL_FILE): try: visa_model = joblib.load(VISA_MODEL_FILE) except Exception as e: st.warning(f"Failed to load visa model: {e}") return {"admission_model": admission_model, "visa_model": visa_model} def prepare_and_predict(model, input_df): """Runs prediction only (no probability)""" try: pred = model.predict(input_df) pred_label = pred[0] if hasattr(pred, "__len__") else pred except Exception as e: st.error(f"Model prediction failed: {e}") return None return pred_label # ----------------- Load data and models ----------------- models = load_models_safe() admission_df = load_csv_safe(ADMISSION_CSV) visa_df = load_csv_safe(VISA_CSV) # ----------------- Page config ----------------- st.set_page_config(page_title="Admission & Visa Predictor", page_icon="🎓", layout="centered") st.title("✨ Admission & Visa Predictor – Plan Your Future") # ----------------- Admission Inputs ----------------- st.subheader("Admission — Step 1") gre_score = st.number_input("GRE Score", min_value=0, max_value=340, value=300) toefl_score = st.number_input("TOEFL Score", min_value=0, max_value=120, value=100) university_rating = st.selectbox("University Rating (1-5)", [1, 2, 3, 4, 5], index=2) sop = st.slider("SOP Strength (1.0 - 5.0)", 1.0, 5.0, 3.0, step=0.5) lor = st.slider("LOR Strength (1.0 - 5.0)", 1.0, 5.0, 3.0, step=0.5) cgpa = st.number_input("CGPA (0.0 - 10.0)", min_value=0.0, max_value=10.0, value=8.0, format="%.2f") research = st.selectbox("Research (0 = No, 1 = Yes)", [0, 1], index=0) admission_input_df = pd.DataFrame([{ "gre_score": gre_score, "toefl_score": toefl_score, "university_rating": university_rating, "sop": sop, "lor": lor, "cgpa": cgpa, "research": research }]) # --- Admission Button --- if st.button("Check Admission", key="admission_btn"): # Clear old results st.session_state.pop("admitted", None) st.session_state.pop("visa_ok", None) if models["admission_model"] is None: st.error("Admission model not found in `src/`.") else: admitted = prepare_and_predict(models["admission_model"], admission_input_df) if admitted is None: st.error("Could not predict admission result.") else: st.session_state["admitted"] = bool(admitted) if not admitted: st.error("Admission result: Not admitted. You cannot proceed to visa check.") else: st.success("Admission result: Admitted! Please scroll down to Visa check.") # ----------------- Visa Section ----------------- if st.session_state.get("admitted", False): st.subheader("Visa — Step 2") interview_location = st.selectbox( "Interview Location", visa_df["Interview Location"].dropna().unique().tolist() if visa_df is not None else ["Islamabad", "Karachi", "Other"] ) program = st.selectbox( "Program", visa_df["Program"].dropna().unique().tolist() if visa_df is not None else ["Masters", "PhD", "MBA", "Other"] ) degree_level = st.selectbox( "Degree Level", visa_df["Degree Level"].dropna().unique().tolist() if visa_df is not None else ["Bachelors", "Masters", "PhD"] ) university = st.selectbox( "University", visa_df["University"].dropna().unique().tolist() if visa_df is not None else ["Harvard", "MIT", "Other"] ) universities_applied = st.number_input("Number of Universities Applied", min_value=1, value=3) sponsor = st.selectbox( "Sponsor", visa_df["Sponsor"].dropna().unique().tolist() if visa_df is not None else ["Self", "Parents", "Scholarship", "Other"] ) scholarship = st.selectbox( "Scholarship", visa_df["Scholarship"].dropna().unique().tolist() if visa_df is not None else ["Yes", "No"] ) relatives_us = st.selectbox( "Relatives in US", visa_df["Relatives in US"].dropna().unique().tolist() if visa_df is not None else ["Yes", "No"] ) visa_attempts = st.selectbox( "Visa Attempts", visa_df["Visa Attempts"].dropna().unique().tolist() if visa_df is not None else ["First", "Second", "More"] ) visa_input_df = pd.DataFrame([{ "Interview Location": interview_location, "Program": program, "Degree Level": degree_level, "University": university, "Universities Applied": universities_applied, "Sponsor": sponsor, "Scholarship": scholarship, "Relatives in US": relatives_us, "Visa Attempts": visa_attempts }]) # --- Visa Button --- if st.button("Check Visa Approval", key="visa_btn"): # Clear old Visa result before predicting again st.session_state.pop("visa_ok", None) if models["visa_model"] is None: st.error("Visa model not found in `src/`.") else: visa_ok = prepare_and_predict(models["visa_model"], visa_input_df) if visa_ok is None: st.error("Could not predict visa approval result.") else: st.session_state["visa_ok"] = bool(visa_ok) # --- Display final result --- if "visa_ok" in st.session_state: visa_ok = st.session_state["visa_ok"] if visa_ok: st.balloons() st.success("🎉 Final Result: Admission + Visa likely approved.") else: st.warning("⚠️ Final Result: Admission accepted, but visa approval looks unlikely.")