Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,11 +1,3 @@
|
|
1 |
-
# -*- coding: utf-8 -*-
|
2 |
-
"""
|
3 |
-
Created on Wed Apr 23 22:57:11 2025
|
4 |
-
|
5 |
-
@author: wIN 10
|
6 |
-
"""
|
7 |
-
|
8 |
-
# app.py
|
9 |
import streamlit as st
|
10 |
import pandas as pd
|
11 |
import numpy as np
|
@@ -13,35 +5,37 @@ from datetime import date
|
|
13 |
from sklearn.ensemble import RandomForestClassifier
|
14 |
from catboost import CatBoostClassifier
|
15 |
from sklearn.preprocessing import MinMaxScaler
|
16 |
-
from sklearn.metrics import classification_report
|
17 |
from imblearn.under_sampling import RandomUnderSampler
|
18 |
import matplotlib.pyplot as plt
|
19 |
import os
|
20 |
|
21 |
-
# Load
|
22 |
DATA_PATH = "updated_dataset.csv"
|
23 |
if os.path.exists(DATA_PATH):
|
24 |
df = pd.read_csv(DATA_PATH)
|
25 |
else:
|
26 |
-
st.error("Dataset not found. Please upload
|
27 |
|
28 |
features = ['Temperature (Β°C)', 'Humidity (%)', 'Air Pressure (kPa)', 'Wind Speed (m/s)', 'Wind Direction (Β°)']
|
29 |
target = 'Rain_Label'
|
30 |
df = df[~(df[features] == -999).any(axis=1)]
|
|
|
|
|
31 |
scaler = MinMaxScaler()
|
32 |
df[features] = scaler.fit_transform(df[features])
|
33 |
|
34 |
X = df[features]
|
35 |
y = df[target]
|
36 |
-
|
37 |
-
X_bal, y_bal = rus.fit_resample(X, y)
|
38 |
|
|
|
39 |
rf = RandomForestClassifier(n_estimators=100, random_state=42).fit(X_bal, y_bal)
|
40 |
cat = CatBoostClassifier(verbose=0, random_state=42).fit(X_bal, y_bal)
|
41 |
|
42 |
-
#
|
43 |
st.title("π§ Rainfall Early Warning System")
|
44 |
-
st.markdown("
|
45 |
|
46 |
st.sidebar.header("Weather Input")
|
47 |
temp = st.sidebar.slider("Temperature (Β°C)", 10.0, 50.0, 30.0)
|
@@ -52,7 +46,6 @@ wind_dir = st.sidebar.slider("Wind Direction (Β°)", 0, 360, 180)
|
|
52 |
rain_label = st.sidebar.selectbox("Did it Rain Today?", ["No", "Yes"])
|
53 |
rain_val = 1 if rain_label == "Yes" else 0
|
54 |
|
55 |
-
# Input Data
|
56 |
input_row = {
|
57 |
'Temperature (Β°C)': temp,
|
58 |
'Humidity (%)': humidity,
|
@@ -60,42 +53,31 @@ input_row = {
|
|
60 |
'Wind Speed (m/s)': wind_speed,
|
61 |
'Wind Direction (Β°)': wind_dir,
|
62 |
'Rainfall (mm)': 0.0,
|
63 |
-
'Rain_Label': rain_val
|
|
|
64 |
}
|
65 |
|
66 |
-
scaled_input = scaler.transform(pd.DataFrame([input_row])[features])
|
67 |
-
|
68 |
# Predict
|
|
|
69 |
rf_pred = rf.predict(scaled_input)[0]
|
70 |
cat_pred = cat.predict(scaled_input)[0]
|
71 |
rf_prob = rf.predict_proba(scaled_input)[0][1]
|
72 |
cat_prob = cat.predict_proba(scaled_input)[0][1]
|
73 |
|
74 |
-
|
75 |
-
st.subheader("π Prediction")
|
76 |
st.markdown(f"**Random Forest:** {'π§ Rain' if rf_pred == 1 else 'βοΈ No Rain'} (Prob: {rf_prob:.2f})")
|
77 |
st.markdown(f"**CatBoost:** {'π§ Rain' if cat_pred == 1 else 'βοΈ No Rain'} (Prob: {cat_prob:.2f})")
|
78 |
|
79 |
-
|
80 |
-
def warning(prob):
|
81 |
if prob < 0.1: return "β
No Rain"
|
82 |
elif prob < 0.5: return "π¦ Light Rain"
|
83 |
elif prob < 0.8: return "π§ Moderate Rain"
|
84 |
else: return "π§π§ Heavy Rain"
|
85 |
|
86 |
-
st.success(f"π’ Early Warning: {
|
87 |
-
|
88 |
-
# --- Real-Time Submission ---
|
89 |
-
st.subheader("π₯ Submit Todayβs Weather Data")
|
90 |
-
if st.button("β Add to Dataset"):
|
91 |
-
input_row["Date"] = str(date.today())
|
92 |
-
df_new = pd.read_csv(DATA_PATH)
|
93 |
-
df_new = pd.concat([df_new, pd.DataFrame([input_row])], ignore_index=True)
|
94 |
-
df_new.to_csv(DATA_PATH, index=False)
|
95 |
-
st.success("β
Today's data added successfully!")
|
96 |
|
97 |
-
#
|
98 |
-
st.subheader("π Evaluation
|
99 |
rf_preds = rf.predict(X)
|
100 |
cat_preds = cat.predict(X)
|
101 |
st.markdown("**Random Forest:**")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import streamlit as st
|
2 |
import pandas as pd
|
3 |
import numpy as np
|
|
|
5 |
from sklearn.ensemble import RandomForestClassifier
|
6 |
from catboost import CatBoostClassifier
|
7 |
from sklearn.preprocessing import MinMaxScaler
|
8 |
+
from sklearn.metrics import classification_report
|
9 |
from imblearn.under_sampling import RandomUnderSampler
|
10 |
import matplotlib.pyplot as plt
|
11 |
import os
|
12 |
|
13 |
+
# Load dataset (use relative path)
|
14 |
DATA_PATH = "updated_dataset.csv"
|
15 |
if os.path.exists(DATA_PATH):
|
16 |
df = pd.read_csv(DATA_PATH)
|
17 |
else:
|
18 |
+
st.error("β Dataset 'updated_dataset.csv' not found. Please upload it.")
|
19 |
|
20 |
features = ['Temperature (Β°C)', 'Humidity (%)', 'Air Pressure (kPa)', 'Wind Speed (m/s)', 'Wind Direction (Β°)']
|
21 |
target = 'Rain_Label'
|
22 |
df = df[~(df[features] == -999).any(axis=1)]
|
23 |
+
|
24 |
+
# Normalize
|
25 |
scaler = MinMaxScaler()
|
26 |
df[features] = scaler.fit_transform(df[features])
|
27 |
|
28 |
X = df[features]
|
29 |
y = df[target]
|
30 |
+
X_bal, y_bal = RandomUnderSampler(random_state=42).fit_resample(X, y)
|
|
|
31 |
|
32 |
+
# Train models
|
33 |
rf = RandomForestClassifier(n_estimators=100, random_state=42).fit(X_bal, y_bal)
|
34 |
cat = CatBoostClassifier(verbose=0, random_state=42).fit(X_bal, y_bal)
|
35 |
|
36 |
+
# Streamlit UI
|
37 |
st.title("π§ Rainfall Early Warning System")
|
38 |
+
st.markdown("Predict rainfall using daily weather inputs. Submit values below to simulate forecasting.")
|
39 |
|
40 |
st.sidebar.header("Weather Input")
|
41 |
temp = st.sidebar.slider("Temperature (Β°C)", 10.0, 50.0, 30.0)
|
|
|
46 |
rain_label = st.sidebar.selectbox("Did it Rain Today?", ["No", "Yes"])
|
47 |
rain_val = 1 if rain_label == "Yes" else 0
|
48 |
|
|
|
49 |
input_row = {
|
50 |
'Temperature (Β°C)': temp,
|
51 |
'Humidity (%)': humidity,
|
|
|
53 |
'Wind Speed (m/s)': wind_speed,
|
54 |
'Wind Direction (Β°)': wind_dir,
|
55 |
'Rainfall (mm)': 0.0,
|
56 |
+
'Rain_Label': rain_val,
|
57 |
+
'Date': str(date.today())
|
58 |
}
|
59 |
|
|
|
|
|
60 |
# Predict
|
61 |
+
scaled_input = scaler.transform(pd.DataFrame([input_row])[features])
|
62 |
rf_pred = rf.predict(scaled_input)[0]
|
63 |
cat_pred = cat.predict(scaled_input)[0]
|
64 |
rf_prob = rf.predict_proba(scaled_input)[0][1]
|
65 |
cat_prob = cat.predict_proba(scaled_input)[0][1]
|
66 |
|
67 |
+
st.subheader("π Prediction Results")
|
|
|
68 |
st.markdown(f"**Random Forest:** {'π§ Rain' if rf_pred == 1 else 'βοΈ No Rain'} (Prob: {rf_prob:.2f})")
|
69 |
st.markdown(f"**CatBoost:** {'π§ Rain' if cat_pred == 1 else 'βοΈ No Rain'} (Prob: {cat_prob:.2f})")
|
70 |
|
71 |
+
def warning_label(prob):
|
|
|
72 |
if prob < 0.1: return "β
No Rain"
|
73 |
elif prob < 0.5: return "π¦ Light Rain"
|
74 |
elif prob < 0.8: return "π§ Moderate Rain"
|
75 |
else: return "π§π§ Heavy Rain"
|
76 |
|
77 |
+
st.success(f"π’ Early Warning: {warning_label((rf_prob + cat_prob) / 2)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
|
79 |
+
# (Optional) Show evaluation
|
80 |
+
st.subheader("π Model Evaluation")
|
81 |
rf_preds = rf.predict(X)
|
82 |
cat_preds = cat.predict(X)
|
83 |
st.markdown("**Random Forest:**")
|