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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +16 -25
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)
@@ -77,7 +77,7 @@ st.markdown("""
77
  section[data-testid="stFileUploader"] div[data-testid="stMarkdownContainer"]{display:none !important;}
78
  section[data-testid="stFileUploader"] [data-testid="stFileUploaderDropzone"] > div:first-child{display:none !important;}
79
  section[data-testid="stFileUploader"] [data-testid="stFileUploaderInstructions"]{display:none !important;}
80
- section[data-testid="stFileUploader"] p, section[data-testid="stFileUploader"] small{display:none !important;}
81
  </style>
82
  """, unsafe_allow_html=True)
83
 
@@ -167,13 +167,6 @@ def pearson_r(y_true, y_pred) -> float:
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,31 +728,31 @@ if st.session_state.app_step == "dev":
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,
@@ -813,7 +806,7 @@ if st.session_state.app_step == "validate":
813
  st.markdown('<div class="st-message-box st-error">Missing required feature columns.</div>', unsafe_allow_html=True)
814
  st.stop()
815
 
816
- pred_raw = model.predict(df[FEATURES])
817
  df["GR_Pred"] = inverse_target(np.asarray(pred_raw, dtype=float), TARGET_TRANSFORM)
818
  try:
819
  df["GR_Actual"] = to_actual_series(df, TARGET, ACTUAL_COL, TARGET_TRANSFORM)
@@ -837,7 +830,7 @@ if st.session_state.app_step == "validate":
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,14 +838,14 @@ if st.session_state.app_step == "validate":
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,9 +891,7 @@ if st.session_state.app_step == "predict":
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
 
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)
 
77
  section[data-testid="stFileUploader"] div[data-testid="stMarkdownContainer"]{display:none !important;}
78
  section[data-testid="stFileUploader"] [data-testid="stFileUploaderDropzone"] > div:first-child{display:none !important;}
79
  section[data-testid="stFileUploader"] [data-testid="stFileUploaderInstructions"]{display:none !important;}
80
+ section[data-testid="stFileUploader"] p, section[data-testid="stFileUploader"] small{display:none !重要;}
81
  </style>
82
  """, unsafe_allow_html=True)
83
 
 
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
  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,
 
806
  st.markdown('<div class="st-message-box st-error">Missing required feature columns.</div>', unsafe_allow_html=True)
807
  st.stop()
808
 
809
+ pred_raw = model.predict(df[FEATURES]) # <-- fixed here
810
  df["GR_Pred"] = inverse_target(np.asarray(pred_raw, dtype=float), TARGET_TRANSFORM)
811
  try:
812
  df["GR_Actual"] = to_actual_series(df, TARGET, ACTUAL_COL, TARGET_TRANSFORM)
 
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
  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
  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