import pandas as pd def run_simulator( site_name: str, visitor_count: int, current_risk: float, improvement_pct: float # 0-100, do user kéo slider ) -> tuple[str, pd.DataFrame]: improvement = improvement_pct / 100 new_risk = round(max(0.0, current_risk * (1 - improvement)), 3) # ── Tính toán TRƯỚC ─────────────────────────────────── waste_total = visitor_count * 0.5 unmanaged_now = waste_total * current_risk water_now = round(unmanaged_now * 0.15, 2) co2_now = round(unmanaged_now * 2.5, 2) if current_risk > 0.5 else 0.0 cost_now = round(unmanaged_now * 1.5, 1) # ── Tính toán SAU ───────────────────────────────────── unmanaged_new = waste_total * new_risk water_new = round(unmanaged_new * 0.15, 2) co2_new = round(unmanaged_new * 2.5, 2) if new_risk > 0.5 else 0.0 cost_new = round(unmanaged_new * 1.5, 1) good_cost = round(waste_total * 0.4, 1) daily_save = round(max(cost_now - cost_new, 0), 1) annual_save = int(daily_save * 365) # ── Trust grade ─────────────────────────────────────── def grade(r): if r < 0.2: return "A 🌟" if r < 0.4: return "B ✅" if r < 0.6: return "C ⚠️" if r < 0.8: return "D 🚩" return "F 🚨" # ── DataFrame cho bar chart ─────────────────────────── chart_df = pd.DataFrame({ "Scenario": ["Current", "After Improvement", "Current", "After Improvement", "Current", "After Improvement"], "Metric": ["Unmanaged Waste (kg/day)", "Unmanaged Waste (kg/day)", "CO2 Emission (kg/day)", "CO2 Emission (kg/day)", "Daily Cost (USD)", "Daily Cost (USD)"], "Value": [unmanaged_now, unmanaged_new, co2_now, co2_new, cost_now, cost_new] }) # ── Text output ─────────────────────────────────────── output = f"""## 🔄 Before / After Simulator — {site_name} **Improvement Applied: {improvement_pct:.0f}%** | | Before | After | Change | |--|--------|-------|--------| | Risk Score | {current_risk:.2f} | {new_risk:.2f} | {"↓ " + str(round((current_risk - new_risk)*100)) + "%" if new_risk < current_risk else "—"} | | Trust Grade | {grade(current_risk)} | {grade(new_risk)} | {"⬆️ Improved" if new_risk < current_risk else "—"} | | Unmanaged Waste | {unmanaged_now:.1f} kg/day | {unmanaged_new:.1f} kg/day | ↓ {round(unmanaged_now - unmanaged_new, 1)} kg | | Water Pollution | {water_now} kg BOD | {water_new} kg BOD | ↓ {round(water_now - water_new, 2)} kg | | CO₂ Emission | {co2_now} kg/day | {co2_new} kg/day | ↓ {round(co2_now - co2_new, 1)} kg | | Daily Cost | ${cost_now} | ${cost_new} | ↓ ${daily_save} | | **Annual Savings** | — | — | **${annual_save:,}/year** | --- ### 💡 What {improvement_pct:.0f}% improvement means in practice: - Reduce unmanaged waste by **{round(unmanaged_now - unmanaged_new, 1)} kg every day** - Save **${annual_save:,} USD per year** - Protect **{int((water_now - water_new) * 1000 * 365):,} liters** of clean water annually - Avoid **{round((co2_now - co2_new) * 365, 1)} kg CO₂** per year > 📊 See bar chart below for visual comparison """ return output, chart_df