Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -14,7 +14,7 @@ import matplotlib.pyplot as plt
|
|
| 14 |
from matplotlib.ticker import FuncFormatter
|
| 15 |
|
| 16 |
import plotly.graph_objects as go
|
| 17 |
-
from sklearn.metrics import mean_squared_error
|
| 18 |
|
| 19 |
# =========================
|
| 20 |
# Constants (GR)
|
|
@@ -167,6 +167,13 @@ def pearson_r(y_true, y_pred) -> float:
|
|
| 167 |
return float("nan")
|
| 168 |
return float(np.corrcoef(a, p)[0, 1])
|
| 169 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
@st.cache_resource(show_spinner=False)
|
| 171 |
def load_model(model_path: str):
|
| 172 |
return joblib.load(model_path)
|
|
@@ -728,31 +735,31 @@ if st.session_state.app_step == "dev":
|
|
| 728 |
st.session_state.results["m_train"]={
|
| 729 |
"R": pearson_r(tr["GR_Actual"], tr["GR_Pred"]),
|
| 730 |
"RMSE": rmse(tr["GR_Actual"], tr["GR_Pred"]),
|
| 731 |
-
"
|
| 732 |
}
|
| 733 |
st.session_state.results["m_test"]={
|
| 734 |
"R": pearson_r(te["GR_Actual"], te["GR_Pred"]),
|
| 735 |
"RMSE": rmse(te["GR_Actual"], te["GR_Pred"]),
|
| 736 |
-
"
|
| 737 |
}
|
| 738 |
|
| 739 |
tr_min = tr[FEATURES].min().to_dict(); tr_max = tr[FEATURES].max().to_dict()
|
| 740 |
st.session_state.train_ranges = {f:(float(tr_min[f]), float(tr_max[f])) for f in FEATURES}
|
| 741 |
st.markdown('<div class="st-message-box st-success">Case has been built and results are displayed below.</div>', unsafe_allow_html=True)
|
| 742 |
|
| 743 |
-
# -------- Metrics + Plots
|
| 744 |
def _dev_block(df, m):
|
| 745 |
c1, c2, c3 = st.columns(3)
|
| 746 |
-
c1.metric("R",
|
| 747 |
-
c2.metric("RMSE",
|
| 748 |
-
c3.metric("
|
| 749 |
|
| 750 |
st.markdown(
|
| 751 |
"""
|
| 752 |
<div style='text-align:left;font-size:0.8em;color:#6b7280;margin-top:-16px;margin-bottom:8px;'>
|
| 753 |
<strong>R:</strong> Pearson Correlation Coefficient<br>
|
| 754 |
<strong>RMSE:</strong> Root Mean Square Error<br>
|
| 755 |
-
<strong>
|
| 756 |
</div>
|
| 757 |
""",
|
| 758 |
unsafe_allow_html=True,
|
|
@@ -830,7 +837,7 @@ if st.session_state.app_step == "validate":
|
|
| 830 |
st.session_state.results["m_val"]={
|
| 831 |
"R": pearson_r(df["GR_Actual"], df["GR_Pred"]),
|
| 832 |
"RMSE": rmse(df["GR_Actual"], df["GR_Pred"]),
|
| 833 |
-
"
|
| 834 |
}
|
| 835 |
st.session_state.results["sv_val"]={"n":len(df),"pred_min":float(df["GR_Pred"].min()),"pred_max":float(df["GR_Pred"].max()),"oor":oor_pct}
|
| 836 |
st.session_state.results["oor_tbl"]=tbl
|
|
@@ -838,14 +845,14 @@ if st.session_state.app_step == "validate":
|
|
| 838 |
if "Validate" in st.session_state.results:
|
| 839 |
m = st.session_state.results["m_val"]
|
| 840 |
c1,c2,c3 = st.columns(3)
|
| 841 |
-
c1.metric("R",
|
| 842 |
-
c2.metric("RMSE",
|
| 843 |
-
c3.metric("
|
| 844 |
st.markdown("""
|
| 845 |
<div style='text-align:left;font-size:0.8em;color:#6b7280;margin-top:-16px;margin-bottom:8px;'>
|
| 846 |
<strong>R:</strong> Pearson Correlation Coefficient<br>
|
| 847 |
<strong>RMSE:</strong> Root Mean Square Error<br>
|
| 848 |
-
<strong>
|
| 849 |
</div>
|
| 850 |
""", unsafe_allow_html=True)
|
| 851 |
|
|
@@ -891,7 +898,9 @@ if st.session_state.app_step == "predict":
|
|
| 891 |
if not ensure_cols(df, FEATURES):
|
| 892 |
st.markdown('<div class="st-message-box st-error">Missing required feature columns.</div>', unsafe_allow_html=True)
|
| 893 |
st.stop()
|
| 894 |
-
pred_raw = model.predict(df[FEATURES])
|
|
|
|
|
|
|
| 895 |
df["GR_Pred"] = inverse_target(np.asarray(pred_raw, dtype=float), TARGET_TRANSFORM)
|
| 896 |
st.session_state.results["PredictOnly"]=df
|
| 897 |
ranges = st.session_state.train_ranges
|
|
@@ -1008,4 +1017,4 @@ st.markdown("""
|
|
| 1008 |
© 2025 Smart Thinking AI-Solutions Team. All rights reserved.<br>
|
| 1009 |
Website: <a href="https://smartthinking.com.sa" target="_blank" rel="noopener noreferrer">smartthinking.com.sa</a>
|
| 1010 |
</div>
|
| 1011 |
-
""", unsafe_allow_html=True)
|
|
|
|
| 14 |
from matplotlib.ticker import FuncFormatter
|
| 15 |
|
| 16 |
import plotly.graph_objects as go
|
| 17 |
+
from sklearn.metrics import mean_squared_error
|
| 18 |
|
| 19 |
# =========================
|
| 20 |
# Constants (GR)
|
|
|
|
| 167 |
return float("nan")
|
| 168 |
return float(np.corrcoef(a, p)[0, 1])
|
| 169 |
|
| 170 |
+
def mape(y_true, y_pred, eps: float = 1e-8) -> float:
|
| 171 |
+
"""Mean Absolute Percentage Error in percent; ignores near-zero actuals."""
|
| 172 |
+
a = np.asarray(y_true, dtype=float)
|
| 173 |
+
p = np.asarray(y_pred, dtype=float)
|
| 174 |
+
denom = np.where(np.abs(a) < eps, np.nan, np.abs(a))
|
| 175 |
+
return float(np.nanmean(np.abs(a - p) / denom) * 100.0)
|
| 176 |
+
|
| 177 |
@st.cache_resource(show_spinner=False)
|
| 178 |
def load_model(model_path: str):
|
| 179 |
return joblib.load(model_path)
|
|
|
|
| 735 |
st.session_state.results["m_train"]={
|
| 736 |
"R": pearson_r(tr["GR_Actual"], tr["GR_Pred"]),
|
| 737 |
"RMSE": rmse(tr["GR_Actual"], tr["GR_Pred"]),
|
| 738 |
+
"MAPE": mape(tr["GR_Actual"], tr["GR_Pred"])
|
| 739 |
}
|
| 740 |
st.session_state.results["m_test"]={
|
| 741 |
"R": pearson_r(te["GR_Actual"], te["GR_Pred"]),
|
| 742 |
"RMSE": rmse(te["GR_Actual"], te["GR_Pred"]),
|
| 743 |
+
"MAPE": mape(te["GR_Actual"], te["GR_Pred"])
|
| 744 |
}
|
| 745 |
|
| 746 |
tr_min = tr[FEATURES].min().to_dict(); tr_max = tr[FEATURES].max().to_dict()
|
| 747 |
st.session_state.train_ranges = {f:(float(tr_min[f]), float(tr_max[f])) for f in FEATURES}
|
| 748 |
st.markdown('<div class="st-message-box st-success">Case has been built and results are displayed below.</div>', unsafe_allow_html=True)
|
| 749 |
|
| 750 |
+
# -------- Metrics + Plots --------
|
| 751 |
def _dev_block(df, m):
|
| 752 |
c1, c2, c3 = st.columns(3)
|
| 753 |
+
c1.metric("R", f"{m['R']:.3f}")
|
| 754 |
+
c2.metric("RMSE", f"{m['RMSE']:.3f}")
|
| 755 |
+
c3.metric("MAPE (%)", f"{m['MAPE']:.2f}")
|
| 756 |
|
| 757 |
st.markdown(
|
| 758 |
"""
|
| 759 |
<div style='text-align:left;font-size:0.8em;color:#6b7280;margin-top:-16px;margin-bottom:8px;'>
|
| 760 |
<strong>R:</strong> Pearson Correlation Coefficient<br>
|
| 761 |
<strong>RMSE:</strong> Root Mean Square Error<br>
|
| 762 |
+
<strong>MAPE:</strong> Mean Absolute Percentage Error
|
| 763 |
</div>
|
| 764 |
""",
|
| 765 |
unsafe_allow_html=True,
|
|
|
|
| 837 |
st.session_state.results["m_val"]={
|
| 838 |
"R": pearson_r(df["GR_Actual"], df["GR_Pred"]),
|
| 839 |
"RMSE": rmse(df["GR_Actual"], df["GR_Pred"]),
|
| 840 |
+
"MAPE": mape(df["GR_Actual"], df["GR_Pred"])
|
| 841 |
}
|
| 842 |
st.session_state.results["sv_val"]={"n":len(df),"pred_min":float(df["GR_Pred"].min()),"pred_max":float(df["GR_Pred"].max()),"oor":oor_pct}
|
| 843 |
st.session_state.results["oor_tbl"]=tbl
|
|
|
|
| 845 |
if "Validate" in st.session_state.results:
|
| 846 |
m = st.session_state.results["m_val"]
|
| 847 |
c1,c2,c3 = st.columns(3)
|
| 848 |
+
c1.metric("R", f"{m['R']:.2f}")
|
| 849 |
+
c2.metric("RMSE", f"{m['RMSE']:.2f}")
|
| 850 |
+
c3.metric("MAPE (%)", f"{m['MAPE']:.2f}")
|
| 851 |
st.markdown("""
|
| 852 |
<div style='text-align:left;font-size:0.8em;color:#6b7280;margin-top:-16px;margin-bottom:8px;'>
|
| 853 |
<strong>R:</strong> Pearson Correlation Coefficient<br>
|
| 854 |
<strong>RMSE:</strong> Root Mean Square Error<br>
|
| 855 |
+
<strong>MAPE:</strong> Mean Absolute Percentage Error
|
| 856 |
</div>
|
| 857 |
""", unsafe_allow_html=True)
|
| 858 |
|
|
|
|
| 898 |
if not ensure_cols(df, FEATURES):
|
| 899 |
st.markdown('<div class="st-message-box st-error">Missing required feature columns.</div>', unsafe_allow_html=True)
|
| 900 |
st.stop()
|
| 901 |
+
pred_raw = model.predict(df[FEATURES"])
|
| 902 |
+
# Fix typo if occurred: ensure correct line in your code as:
|
| 903 |
+
# pred_raw = model.predict(df[FEATURES])
|
| 904 |
df["GR_Pred"] = inverse_target(np.asarray(pred_raw, dtype=float), TARGET_TRANSFORM)
|
| 905 |
st.session_state.results["PredictOnly"]=df
|
| 906 |
ranges = st.session_state.train_ranges
|
|
|
|
| 1017 |
© 2025 Smart Thinking AI-Solutions Team. All rights reserved.<br>
|
| 1018 |
Website: <a href="https://smartthinking.com.sa" target="_blank" rel="noopener noreferrer">smartthinking.com.sa</a>
|
| 1019 |
</div>
|
| 1020 |
+
""", unsafe_allow_html=True)
|