Spaces:
Paused
Paused
Create simulator_module.py
Browse files- simulator_module.py +71 -0
simulator_module.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
|
| 3 |
+
def run_simulator(
|
| 4 |
+
site_name: str,
|
| 5 |
+
visitor_count: int,
|
| 6 |
+
current_risk: float,
|
| 7 |
+
improvement_pct: float # 0-100, do user kΓ©o slider
|
| 8 |
+
) -> tuple[str, pd.DataFrame]:
|
| 9 |
+
|
| 10 |
+
improvement = improvement_pct / 100
|
| 11 |
+
new_risk = round(max(0.0, current_risk * (1 - improvement)), 3)
|
| 12 |
+
|
| 13 |
+
# ββ TΓnh toΓ‘n TRΖ―α»C βββββββββββββββββββββββββββββββββββ
|
| 14 |
+
waste_total = visitor_count * 0.5
|
| 15 |
+
unmanaged_now = waste_total * current_risk
|
| 16 |
+
water_now = round(unmanaged_now * 0.15, 2)
|
| 17 |
+
co2_now = round(unmanaged_now * 2.5, 2) if current_risk > 0.5 else 0.0
|
| 18 |
+
cost_now = round(unmanaged_now * 1.5, 1)
|
| 19 |
+
|
| 20 |
+
# ββ TΓnh toΓ‘n SAU βββββββββββββββββββββββββββββββββββββ
|
| 21 |
+
unmanaged_new = waste_total * new_risk
|
| 22 |
+
water_new = round(unmanaged_new * 0.15, 2)
|
| 23 |
+
co2_new = round(unmanaged_new * 2.5, 2) if new_risk > 0.5 else 0.0
|
| 24 |
+
cost_new = round(unmanaged_new * 1.5, 1)
|
| 25 |
+
good_cost = round(waste_total * 0.4, 1)
|
| 26 |
+
|
| 27 |
+
daily_save = round(max(cost_now - cost_new, 0), 1)
|
| 28 |
+
annual_save = int(daily_save * 365)
|
| 29 |
+
|
| 30 |
+
# ββ Trust grade βββββββββββββββββββββββββββββββββββββββ
|
| 31 |
+
def grade(r):
|
| 32 |
+
if r < 0.2: return "A π"
|
| 33 |
+
if r < 0.4: return "B β
"
|
| 34 |
+
if r < 0.6: return "C β οΈ"
|
| 35 |
+
if r < 0.8: return "D π©"
|
| 36 |
+
return "F π¨"
|
| 37 |
+
|
| 38 |
+
# ββ DataFrame cho bar chart βββββββββββββββββββββββββββ
|
| 39 |
+
chart_df = pd.DataFrame({
|
| 40 |
+
"Scenario": ["Current", "After Improvement", "Current", "After Improvement", "Current", "After Improvement"],
|
| 41 |
+
"Metric": ["Unmanaged Waste (kg/day)", "Unmanaged Waste (kg/day)",
|
| 42 |
+
"CO2 Emission (kg/day)", "CO2 Emission (kg/day)",
|
| 43 |
+
"Daily Cost (USD)", "Daily Cost (USD)"],
|
| 44 |
+
"Value": [unmanaged_now, unmanaged_new, co2_now, co2_new, cost_now, cost_new]
|
| 45 |
+
})
|
| 46 |
+
|
| 47 |
+
# ββ Text output βββββββββββββββββββββββββββββββββββββββ
|
| 48 |
+
output = f"""## π Before / After Simulator β {site_name}
|
| 49 |
+
|
| 50 |
+
**Improvement Applied: {improvement_pct:.0f}%**
|
| 51 |
+
| | Before | After | Change |
|
| 52 |
+
|--|--------|-------|--------|
|
| 53 |
+
| Risk Score | {current_risk:.2f} | {new_risk:.2f} | {"β " + str(round((current_risk - new_risk)*100)) + "%" if new_risk < current_risk else "β"} |
|
| 54 |
+
| Trust Grade | {grade(current_risk)} | {grade(new_risk)} | {"β¬οΈ Improved" if new_risk < current_risk else "β"} |
|
| 55 |
+
| Unmanaged Waste | {unmanaged_now:.1f} kg/day | {unmanaged_new:.1f} kg/day | β {round(unmanaged_now - unmanaged_new, 1)} kg |
|
| 56 |
+
| Water Pollution | {water_now} kg BOD | {water_new} kg BOD | β {round(water_now - water_new, 2)} kg |
|
| 57 |
+
| COβ Emission | {co2_now} kg/day | {co2_new} kg/day | β {round(co2_now - co2_new, 1)} kg |
|
| 58 |
+
| Daily Cost | ${cost_now} | ${cost_new} | β ${daily_save} |
|
| 59 |
+
| **Annual Savings** | β | β | **${annual_save:,}/year** |
|
| 60 |
+
|
| 61 |
+
---
|
| 62 |
+
|
| 63 |
+
### π‘ What {improvement_pct:.0f}% improvement means in practice:
|
| 64 |
+
- Reduce unmanaged waste by **{round(unmanaged_now - unmanaged_new, 1)} kg every day**
|
| 65 |
+
- Save **${annual_save:,} USD per year**
|
| 66 |
+
- Protect **{int((water_now - water_new) * 1000 * 365):,} liters** of clean water annually
|
| 67 |
+
- Avoid **{round((co2_now - co2_new) * 365, 1)} kg COβ** per year
|
| 68 |
+
|
| 69 |
+
> π See bar chart below for visual comparison
|
| 70 |
+
"""
|
| 71 |
+
return output, chart_df
|