| import gradio as gr |
| import random, json, os |
| import pandas as pd |
| import joblib |
| from huggingface_hub import hf_hub_download |
|
|
| REPO_ID = "DetectiveShadow/Entrepreneurial_predictor" |
|
|
| |
| regressor = None |
| FEATURE_COLUMNS = None |
| try: |
| reg_path = hf_hub_download(REPO_ID, "regressor.pkl") |
| feat_path = hf_hub_download(REPO_ID, "feature_columns.json") |
| regressor = joblib.load(reg_path) |
| with open(feat_path, "r") as f: |
| FEATURE_COLUMNS = json.load(f) |
| except Exception as e: |
| print("⚠️ Could not load regressor from Hub; will use heuristic. Error:", e) |
|
|
| def confidence_to_bonus(conf): |
| return {"Low": 0, "Medium": 5, "High": 10}.get(conf, 5) |
|
|
| def heuristic_score(profile): |
| |
| disposable = profile["income"] - profile["bills"] - profile["entertainment"] |
| score = ( |
| (profile["savings"] + profile["assets"]) / 1000 |
| + disposable / 500 |
| + profile["sales_skills"] * 2 |
| + profile["idea_level"] * 3 |
| + profile["entrepreneurial_experience"] * 2 |
| + confidence_to_bonus(profile["confidence"]) |
| - profile["dependents"] |
| + (40 - abs(35 - profile["age"])) / 5 |
| ) |
| return max(0, min(100, score)) |
|
|
| def level_from_score(score): |
| if score < 30: return "Low" |
| if score < 60: return "Moderate" |
| return "High" |
|
|
| def build_features_df(profile): |
| |
| base = pd.DataFrame([[ |
| profile["savings"], profile["income"], profile["bills"], profile["entertainment"], |
| profile["assets"], profile["sales_skills"], profile["confidence"], profile["dependents"], |
| profile["age"], profile["idea_level"], profile["entrepreneurial_experience"] |
| ]], columns=[ |
| "savings","income","bills","entertainment","assets", |
| "sales_skills","confidence","dependents","age", |
| "idea_level","entrepreneurial_experience" |
| ]) |
| df = pd.get_dummies(base, columns=["confidence"]) |
| if FEATURE_COLUMNS is not None: |
| |
| for col in FEATURE_COLUMNS: |
| if col not in df.columns: |
| df[col] = 0 |
| df = df[FEATURE_COLUMNS] |
| return df |
|
|
| def compute_score(profile): |
| if regressor is not None and FEATURE_COLUMNS is not None: |
| X = build_features_df(profile) |
| try: |
| pred = float(regressor.predict(X)[0]) |
| return max(0, min(100, pred)) |
| except Exception as e: |
| print("⚠️ Regressor prediction failed, fallback to heuristic:", e) |
| return heuristic_score(profile) |
|
|
| |
| def random_profile(): |
| return { |
| "savings": random.randint(0, 20000), |
| "income": random.randint(1500, 10000), |
| "bills": random.randint(500, 8000), |
| "entertainment": random.randint(0, 1500), |
| "assets": random.randint(0, 60000), |
| "sales_skills": random.randint(1, 5), |
| "confidence": random.choice(["Low", "Medium", "High"]), |
| "dependents": random.randint(0, 6), |
| "age": random.randint(18, 64), |
| "idea_level": random.randint(1, 10), |
| "entrepreneurial_experience": random.randint(0, 10), |
| } |
|
|
| def profile_to_story(p): |
| |
| parts = [] |
| parts.append(f"{p['age']}-year-old aspiring founder with {p['dependents']} dependents.") |
| parts.append(f"Savings of ${p['savings']:,} and assets totaling ${p['assets']:,}.") |
| parts.append(f"Monthly income ${p['income']:,}, bills ${p['bills']:,}, entertainment ${p['entertainment']:,}.") |
| parts.append(f"Sales skills rated {p['sales_skills']}/5 and confidence **{p['confidence']}**.") |
| parts.append(f"Business idea quality {p['idea_level']}/10 and entrepreneurial experience {p['entrepreneurial_experience']} year(s).") |
| return " ".join(parts) |
|
|
| |
| def new_scenario(): |
| p = random_profile() |
| story = profile_to_story(p) |
| true_score = round(compute_score(p), 2) |
| true_level = level_from_score(true_score) |
| |
| return story, 50, {"profile": p, "score": true_score, "level": true_level} |
|
|
| def check_guess(guess, state): |
| if not state or "score" not in state: |
| return {"error": "No scenario generated yet. Click '🎲 New Scenario' first."} |
| true_score = state["score"] |
| true_level = state["level"] |
| delta = round(abs(true_score - float(guess)), 2) |
| verdict = "✅ Great guess!" if delta <= 5 else ("🟡 Close!" if delta <= 10 else "❌ Not quite.") |
| return { |
| "Your Guess": float(guess), |
| "Actual Score": true_score, |
| "Readiness Level": true_level, |
| "Off by": delta, |
| "Verdict": verdict |
| } |
|
|
| with gr.Blocks() as demo: |
| gr.Markdown("# 🎯 Guess the Entrepreneurial Readiness") |
| gr.Markdown( |
| "I’ll generate a random founder profile. **You guess the readiness score (0–100)**, " |
| "then we’ll reveal the actual score and level." |
| ) |
|
|
| state = gr.State() |
|
|
| with gr.Row(): |
| with gr.Column(scale=3): |
| scenario_md = gr.Markdown("Click **New Scenario** to start.") |
| with gr.Row(): |
| new_btn = gr.Button("🎲 New Scenario", variant="primary") |
| guess = gr.Slider(0, 100, value=50, step=1, label="Your Guess (0–100)") |
| reveal_btn = gr.Button("🔍 Check My Guess") |
| with gr.Column(scale=2): |
| result = gr.JSON(label="Result") |
|
|
| |
| new_btn.click(fn=new_scenario, inputs=None, outputs=[scenario_md, guess, state]) |
| reveal_btn.click(fn=check_guess, inputs=[guess, state], outputs=result) |
|
|
| demo.launch() |
|
|