import streamlit as st import requests, os st.set_page_config( page_title="ChildCare Revenue Predictor", page_icon="๐Ÿซ", layout="wide", ) st.title("๐Ÿซ ChildCare Facility Revenue Predictor") st.markdown(""" Predict the **monthly revenue** a child will generate for a day care facility, based on child profile, program enrolment, and facility characteristics. Fill in the details below and click **Predict Revenue**. """) BACKEND_URL = os.environ.get( "BACKEND_URL", "https://ramzai9-childcareprediction.hf.space" ) with st.sidebar: st.header("โ„น๏ธ How to Use") st.markdown(""" 1. Enter the child's details in the **Child Profile** section. 2. Enter the facility details in the **Facility Details** section. 3. Click **Predict Revenue** to get the model's estimate. **Field Guide:** - **Child Age** โ€“ child's current age in months (6 = 6 months, 60 = 5 years) - **Care Program** โ€“ Full Day covers 8+ hours; Half Day covers 4โ€“5 hours; After School is 3โ€“4 hours after school - **Attendance Rate** โ€“ proportion of days the child attends (1.0 = never absent) - **Monthly Fee** โ€“ the fee charged per month in USD - **Child ID Prefix** โ€“ two-letter code derived from program (FD, HD, AS) - **Activity Category** โ€“ primary activity type the child is enrolled in """) st.divider() st.markdown("**Backend API:**") st.code(BACKEND_URL, language=None) col1, col2 = st.columns(2) with col1: st.subheader("๐Ÿ‘ถ Child Profile") child_age = st.number_input( "Child Age (months)", min_value=0.0, max_value=120.0, value=36.0, step=1.0, help="Enter the child's age in months. E.g. 24 = 2 years old.", ) care_program = st.selectbox( "Care Program", options=["Full Day", "Half Day", "After School"], help="Full Day (8+ hrs), Half Day (4โ€“5 hrs), After School (3โ€“4 hrs after school).", ) attendance_rate = st.slider( "Attendance Rate", min_value=0.50, max_value=1.00, value=0.85, step=0.01, help="Proportion of scheduled days the child attends. 1.0 = 100% attendance.", ) monthly_fee = st.number_input( "Monthly Fee ($)", min_value=0.0, max_value=10000.0, value=2000.0, step=50.0, help="The monthly fee charged for the child's enrolment, in USD.", ) child_id_char = st.selectbox( "Child ID Prefix", options=["FD", "HD", "AS"], help="FD = Full Day, HD = Half Day, AS = After School.", ) activity_category = st.selectbox( "Activity Type Category", options=["Academic", "Creative", "Wellness"], help="Academic: Reading, Math, STEM. Creative: Arts, Music, Dance. Wellness: PE, Yoga, Outdoor Play.", ) with col2: st.subheader("๐Ÿข Facility Details") facility_size = st.selectbox( "Facility Size", options=["Small", "Medium", "Large"], help="Small (<30 children), Medium (30โ€“80 children), Large (80+ children).", ) city_type = st.selectbox( "City Type", options=["Tier 1", "Tier 2", "Tier 3"], help="Tier 1 = major metropolitan area. Tier 2 = mid-sized city. Tier 3 = small town or rural.", ) facility_type = st.selectbox( "Facility Type", options=["Full-Service Center", "Montessori School", "Home Daycare", "Corporate Daycare"], help="Type of facility offering child care services.", ) facility_year = st.number_input( "Facility Establishment Year", min_value=1900, max_value=2100, value=2005, step=1, help="The year the facility was established. Older facilities may have more established reputations.", ) st.divider() predict_btn = st.button("๐Ÿ”ฎ Predict Revenue", type="primary", use_container_width=True) if predict_btn: payload = { "Child_Age_Months": child_age, "Child_Care_Program": care_program, "Child_Attendance_Rate": attendance_rate, "Child_Monthly_Fee": monthly_fee, "Facility_Size": facility_size, "Facility_Location_City_Type": city_type, "Facility_Type": facility_type, "Child_Id_char": child_id_char, "Facility_Establishment_Year": facility_year, "Activity_Type_Category": activity_category, } with st.spinner("Contacting the prediction API..."): try: resp = requests.post( f"{BACKEND_URL}/v1/predict", json=payload, timeout=30, ) if resp.status_code == 200: revenue = resp.json().get("Revenue", "N/A") st.success(f"### ๐Ÿ’ฐ Predicted Monthly Revenue: **${revenue:,.2f}**") st.balloons() with st.expander("๐Ÿ“‹ Input Summary"): st.json(payload) else: st.error(f"API Error ({resp.status_code}): {resp.json().get('error', resp.text)}") except requests.exceptions.Timeout: st.error("โฑ๏ธ Request timed out. The backend may be starting up โ€” please try again in 30 seconds.") except requests.exceptions.ConnectionError: st.error("๐Ÿ”Œ Could not connect to the backend. Please verify the BACKEND_URL environment variable.") except Exception as e: st.error(f"Unexpected error: {e}") st.divider() st.caption("Built with XGBoost + Flask + Streamlit ยท Deployed on Hugging Face Spaces")