divya55's picture
Update src/streamlit_app.py
1bf2783 verified
Raw History Blame Contribute Delete
6.62 kB
# 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.")