naitik991 commited on
Commit
9098000
·
verified ·
1 Parent(s): ffc8bd4

Upload 6 files

Browse files
Files changed (6) hide show
  1. README.md +15 -0
  2. app.py +37 -0
  3. final_gbm_model_all_metals.pkl +3 -0
  4. model.py +12 -0
  5. requirements.txt +7 -0
  6. utils.py +21 -0
README.md ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ ---
3
+ title: Heavy Metal Predictor
4
+ emoji: 🌎
5
+ colorFrom: indigo
6
+ colorTo: blue
7
+ sdk: streamlit
8
+ sdk_version: "1.30.0"
9
+ app_file: app.py
10
+ pinned: false
11
+ ---
12
+
13
+ # Environmental Contamination Predictor
14
+
15
+ Click on a map and indicate whether stormwater runoff is present. The app will predict concentrations (ppm) of heavy metals — Fe, Cr, Mn, Mo, In, Ta — and assess risk levels based on EPA thresholds.
app.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import streamlit as st
3
+ from streamlit_folium import st_folium
4
+ import folium
5
+ from model import predict_metals
6
+ from utils import get_epa_warnings, calculate_risk_score
7
+
8
+ st.set_page_config(page_title="Heavy Metal Predictor", layout="wide")
9
+ st.title("🌍 Environmental Heavy Metal Risk Predictor")
10
+
11
+ st.markdown("Click a location on the map and indicate whether stormwater runoff is present.")
12
+
13
+ m = folium.Map(location=[33.4484, -112.0740], zoom_start=10) # Phoenix default
14
+ click_info = st_folium(m, height=500, width=700)
15
+
16
+ lat = click_info.get("last_clicked", {}).get("lat", None)
17
+ lon = click_info.get("last_clicked", {}).get("lng", None)
18
+
19
+ storm = st.radio("Stormwater Runoff Present?", ("Yes", "No"))
20
+ stormwater_val = 1 if storm == "Yes" else 0
21
+
22
+ if lat and lon:
23
+ st.success(f"Selected Location: ({lat:.4f}, {lon:.4f})")
24
+
25
+ if st.button("Predict Contamination"):
26
+ pred = predict_metals(lat, lon, stormwater_val)
27
+ epa_flags = get_epa_warnings(pred)
28
+ risk = calculate_risk_score(pred)
29
+
30
+ st.subheader("Predicted Heavy Metal Concentrations (ppm):")
31
+ for metal, val in pred.items():
32
+ warn = "⚠️" if epa_flags[metal] else "✅"
33
+ st.write(f"- **{metal}**: {val:.3f} ppm {warn}")
34
+
35
+ st.markdown(f"### 🧪 Risk Score: `{risk}` (higher = more hazardous)")
36
+ else:
37
+ st.info("Please click on the map to choose a location.")
final_gbm_model_all_metals.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b814725d28bce1d3f4e90e11397a6203a1ec4ffd8b1a224c398b0a2ee84c757d
3
+ size 611611
model.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import joblib
3
+ import numpy as np
4
+
5
+ MODEL_PATH = "final_gbm_model_all_metals.pkl"
6
+ model = joblib.load(MODEL_PATH)
7
+
8
+ def predict_metals(latitude, longitude, stormwater):
9
+ X_input = np.array([[latitude, longitude, stormwater]])
10
+ predictions = model.predict(X_input)[0]
11
+ metals = ["Fe", "Cr", "Mn", "Mo", "In", "Ta"]
12
+ return dict(zip(metals, predictions))
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ streamlit==1.30.0
2
+ folium==0.15.1
3
+ streamlit-folium==0.12.0
4
+ scikit-learn
5
+ joblib
6
+ p
7
+ pandas
utils.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ EPA_THRESHOLDS_PPM = {
3
+ "Fe": 300,
4
+ "Cr": 0.1,
5
+ "Mn": 0.05,
6
+ "Mo": 0.1,
7
+ "In": 0.05,
8
+ "Ta": 0.01
9
+ }
10
+
11
+ def get_epa_warnings(predicted):
12
+ warnings = {}
13
+ for metal, value in predicted.items():
14
+ threshold = EPA_THRESHOLDS_PPM.get(metal, float("inf"))
15
+ warnings[metal] = value > threshold
16
+ return warnings
17
+
18
+ def calculate_risk_score(predicted):
19
+ weights = {"Fe": 1.2, "Cr": 2.5, "Mn": 1.0, "Mo": 1.8, "In": 3.0, "Ta": 2.2}
20
+ score = sum(predicted[m] * weights.get(m, 1) for m in predicted)
21
+ return round(score / len(predicted), 2)