Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -414,7 +414,6 @@ def preview_tracks(df: pd.DataFrame, cols: list[str]):
|
|
| 414 |
if i == 0: ax.set_ylabel(y_label)
|
| 415 |
else: ax.tick_params(labelleft=False); ax.set_ylabel("")
|
| 416 |
fig.tight_layout(); return fig
|
| 417 |
-
|
| 418 |
# =========================
|
| 419 |
# Load models + metas
|
| 420 |
# =========================
|
|
@@ -446,31 +445,54 @@ def _try_load_or_explain(p: Path, name: str):
|
|
| 446 |
try:
|
| 447 |
return load_model(str(p))
|
| 448 |
except Exception as e:
|
| 449 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 450 |
st.stop()
|
| 451 |
|
| 452 |
-
|
| 453 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 454 |
|
| 455 |
-
|
| 456 |
-
|
| 457 |
-
if hasattr(model_bo, "feature_names_in_"):
|
| 458 |
-
FEATURES = [str(x) for x in model_bo.feature_names_in_]
|
| 459 |
-
elif meta_bo.get("features"):
|
| 460 |
-
FEATURES = [str(x) for x in meta_bo["features"]]
|
| 461 |
-
elif meta_bd.get("features"):
|
| 462 |
-
FEATURES = [str(x) for x in meta_bd["features"]]
|
| 463 |
-
else:
|
| 464 |
-
FEATURES = FEATURES_DEFAULT[:]
|
| 465 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 466 |
TARGET_BO = str(meta_bo.get("target") or TARGET_BO_DEFAULT)
|
| 467 |
TARGET_BD = str(meta_bd.get("target") or TARGET_BD_DEFAULT)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 468 |
|
| 469 |
-
X_UNITS = str(meta_bo.get("units") or meta_bd.get("units") or "MW (pcf)")
|
| 470 |
-
st.session_state["FEATURES"] = FEATURES
|
| 471 |
-
st.session_state["TARGET_BO"] = TARGET_BO
|
| 472 |
-
st.session_state["TARGET_BD"] = TARGET_BD
|
| 473 |
-
st.session_state["X_UNITS"] = X_UNITS
|
| 474 |
|
| 475 |
# =========================
|
| 476 |
# Session state
|
|
|
|
| 414 |
if i == 0: ax.set_ylabel(y_label)
|
| 415 |
else: ax.tick_params(labelleft=False); ax.set_ylabel("")
|
| 416 |
fig.tight_layout(); return fig
|
|
|
|
| 417 |
# =========================
|
| 418 |
# Load models + metas
|
| 419 |
# =========================
|
|
|
|
| 445 |
try:
|
| 446 |
return load_model(str(p))
|
| 447 |
except Exception as e:
|
| 448 |
+
# Prefer BO meta versions if available, else BD
|
| 449 |
+
want_np = (meta_bo.get("versions",{}) or meta_bd.get("versions",{})).get("numpy", "N/A")
|
| 450 |
+
want_skl = (meta_bo.get("versions",{}) or meta_bd.get("versions",{})).get("scikit_learn", "N/A")
|
| 451 |
+
st.error(
|
| 452 |
+
f"Failed to load {name} at {p}.\n\n{e}\n\n"
|
| 453 |
+
f"If this mentions `numpy._core` or versions, install:\n"
|
| 454 |
+
f" • numpy {want_np}\n • scikit-learn {want_skl}"
|
| 455 |
+
)
|
| 456 |
st.stop()
|
| 457 |
|
| 458 |
+
# Unwrap payload-style joblibs: {"model": pipeline, "model_info": {...}}
|
| 459 |
+
def _unwrap(payload):
|
| 460 |
+
if isinstance(payload, dict) and "model" in payload:
|
| 461 |
+
return payload["model"], payload.get("model_info", {})
|
| 462 |
+
# Fallback: estimator saved bare or custom object
|
| 463 |
+
return payload, getattr(payload, "model_info", {})
|
| 464 |
+
|
| 465 |
+
payload_bo = _try_load_or_explain(bo_model_path, "BO model")
|
| 466 |
+
payload_bd = _try_load_or_explain(bd_model_path, "BD model")
|
| 467 |
|
| 468 |
+
model_bo, info_bo = _unwrap(payload_bo)
|
| 469 |
+
model_bd, info_bd = _unwrap(payload_bd)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 470 |
|
| 471 |
+
# Resolve features per model (prefer model_info → meta → fallback)
|
| 472 |
+
features_bo = list((info_bo.get("features")
|
| 473 |
+
or meta_bo.get("features")
|
| 474 |
+
or FEATURES_DEFAULT))
|
| 475 |
+
features_bd = list((info_bd.get("features")
|
| 476 |
+
or meta_bd.get("features")
|
| 477 |
+
or FEATURES_DEFAULT))
|
| 478 |
+
|
| 479 |
+
# Use the UNION so BD's 'Depth (ft)' is required and both models can run from one input
|
| 480 |
+
# Order: keep BO order, then append BD-only columns in order
|
| 481 |
+
features_union = list(dict.fromkeys(features_bo + [c for c in features_bd if c not in features_bo]))
|
| 482 |
+
|
| 483 |
+
# Resolve targets / units
|
| 484 |
TARGET_BO = str(meta_bo.get("target") or TARGET_BO_DEFAULT)
|
| 485 |
TARGET_BD = str(meta_bd.get("target") or TARGET_BD_DEFAULT)
|
| 486 |
+
X_UNITS = str(meta_bo.get("units") or meta_bd.get("units") or "MW (pcf)")
|
| 487 |
+
|
| 488 |
+
# Stash in session
|
| 489 |
+
st.session_state["FEATURES_BO"] = features_bo
|
| 490 |
+
st.session_state["FEATURES_BD"] = features_bd
|
| 491 |
+
st.session_state["FEATURES"] = features_union # strict check uses the union
|
| 492 |
+
st.session_state["TARGET_BO"] = TARGET_BO
|
| 493 |
+
st.session_state["TARGET_BD"] = TARGET_BD
|
| 494 |
+
st.session_state["X_UNITS"] = X_UNITS
|
| 495 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 496 |
|
| 497 |
# =========================
|
| 498 |
# Session state
|