ecoverify-ai / simulator_module.py
lmcuong199's picture
Create simulator_module.py
21f9f1e verified
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