UCS2014 commited on
Commit
07af81f
·
verified ·
1 Parent(s): cc91bfb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -15
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, mean_absolute_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
- "MAE": mean_absolute_error(tr["GR_Actual"], tr["GR_Pred"])
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
- "MAE": mean_absolute_error(te["GR_Actual"], te["GR_Pred"])
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 (3 decimals here) --------
744
  def _dev_block(df, m):
745
  c1, c2, c3 = st.columns(3)
746
- c1.metric("R", f"{m['R']:.3f}")
747
- c2.metric("RMSE", f"{m['RMSE']:.3f}")
748
- c3.metric("MAE", f"{m['MAE']:.3f}")
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>MAE:</strong> Mean Absolute Error
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
- "MAE": mean_absolute_error(df["GR_Actual"], df["GR_Pred"])
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", f"{m['R']:.2f}")
842
- c2.metric("RMSE", f"{m['RMSE']:.2f}")
843
- c3.metric("MAE", f"{m['MAE']:.2f}")
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>MAE:</strong> Mean Absolute Error
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)