Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -196,9 +196,9 @@ def df_centered_rounded(df: pd.DataFrame, hide_index=True):
|
|
| 196 |
numcols = out.select_dtypes(include=[np.number]).columns
|
| 197 |
styler = (
|
| 198 |
out.style
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
)
|
| 203 |
st.dataframe(styler, use_container_width=True, hide_index=hide_index)
|
| 204 |
|
|
@@ -352,7 +352,6 @@ except AttributeError:
|
|
| 352 |
return wrapper
|
| 353 |
return deco
|
| 354 |
|
| 355 |
-
@dialog("Preview data")
|
| 356 |
def preview_modal(book: dict[str, pd.DataFrame]):
|
| 357 |
if not book:
|
| 358 |
st.info("No data loaded yet."); return
|
|
@@ -418,6 +417,7 @@ st.session_state.setdefault("dev_file_name","")
|
|
| 418 |
st.session_state.setdefault("dev_file_bytes",b"")
|
| 419 |
st.session_state.setdefault("dev_file_loaded",False)
|
| 420 |
st.session_state.setdefault("dev_preview",False)
|
|
|
|
| 421 |
|
| 422 |
# =========================
|
| 423 |
# Branding in Sidebar
|
|
@@ -489,7 +489,7 @@ if st.session_state.app_step == "dev":
|
|
| 489 |
st.sidebar.caption(f"**Data loaded:** {st.session_state.dev_file_name} • {df0.shape[0]} rows × {df0.shape[1]} cols")
|
| 490 |
|
| 491 |
if st.sidebar.button("Preview data", use_container_width=True, disabled=not st.session_state.dev_file_loaded):
|
| 492 |
-
|
| 493 |
st.session_state.dev_preview = True
|
| 494 |
|
| 495 |
run = st.sidebar.button("Run Model", type="primary", use_container_width=True)
|
|
@@ -566,7 +566,7 @@ if st.session_state.app_step == "validate":
|
|
| 566 |
df0 = next(iter(book.values()))
|
| 567 |
st.sidebar.caption(f"**Data loaded:** {up.name} • {df0.shape[0]} rows × {df0.shape[1]} cols")
|
| 568 |
if st.sidebar.button("Preview data", use_container_width=True, disabled=(up is None)):
|
| 569 |
-
|
| 570 |
go_btn = st.sidebar.button("Predict", type="primary", use_container_width=True)
|
| 571 |
if st.sidebar.button("⬅ Back to Case Building", use_container_width=True): st.session_state.app_step="dev"; st.rerun()
|
| 572 |
if st.sidebar.button("Proceed to Prediction ▶", use_container_width=True): st.session_state.app_step="predict"; st.rerun()
|
|
@@ -607,7 +607,7 @@ if st.session_state.app_step == "validate":
|
|
| 607 |
with col_cross:
|
| 608 |
st.pyplot(
|
| 609 |
cross_plot_static(st.session_state.results["Validate"][TARGET],
|
| 610 |
-
|
| 611 |
use_container_width=True
|
| 612 |
)
|
| 613 |
with col_track:
|
|
@@ -634,7 +634,7 @@ if st.session_state.app_step == "predict":
|
|
| 634 |
df0 = next(iter(book.values()))
|
| 635 |
st.sidebar.caption(f"**Data loaded:** {up.name} • {df0.shape[0]} rows × {df0.shape[1]} cols")
|
| 636 |
if st.sidebar.button("Preview data", use_container_width=True, disabled=(up is None)):
|
| 637 |
-
|
| 638 |
go_btn = st.sidebar.button("Predict", type="primary", use_container_width=True)
|
| 639 |
if st.sidebar.button("⬅ Back to Case Building", use_container_width=True): st.session_state.app_step="dev"; st.rerun()
|
| 640 |
|
|
@@ -668,11 +668,11 @@ if st.session_state.app_step == "predict":
|
|
| 668 |
table = pd.DataFrame({
|
| 669 |
"Metric": ["# points","Pred min","Pred max","Pred mean","Pred std","OOR %"],
|
| 670 |
"Value": [sv["n"],
|
| 671 |
-
|
| 672 |
-
|
| 673 |
-
|
| 674 |
-
|
| 675 |
-
|
| 676 |
})
|
| 677 |
st.success("Predictions ready ✓")
|
| 678 |
df_centered_rounded(table, hide_index=True)
|
|
@@ -683,6 +683,47 @@ if st.session_state.app_step == "predict":
|
|
| 683 |
use_container_width=True, config={"displayModeBar": False, "scrollZoom": True}
|
| 684 |
)
|
| 685 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 686 |
# =========================
|
| 687 |
# Footer
|
| 688 |
# =========================
|
|
|
|
| 196 |
numcols = out.select_dtypes(include=[np.number]).columns
|
| 197 |
styler = (
|
| 198 |
out.style
|
| 199 |
+
.format({c: "{:.2f}" for c in numcols})
|
| 200 |
+
.set_properties(**{"text-align": "center"})
|
| 201 |
+
.set_table_styles(TABLE_CENTER_CSS)
|
| 202 |
)
|
| 203 |
st.dataframe(styler, use_container_width=True, hide_index=hide_index)
|
| 204 |
|
|
|
|
| 352 |
return wrapper
|
| 353 |
return deco
|
| 354 |
|
|
|
|
| 355 |
def preview_modal(book: dict[str, pd.DataFrame]):
|
| 356 |
if not book:
|
| 357 |
st.info("No data loaded yet."); return
|
|
|
|
| 417 |
st.session_state.setdefault("dev_file_bytes",b"")
|
| 418 |
st.session_state.setdefault("dev_file_loaded",False)
|
| 419 |
st.session_state.setdefault("dev_preview",False)
|
| 420 |
+
st.session_state.setdefault("show_preview_modal", False) # New state variable
|
| 421 |
|
| 422 |
# =========================
|
| 423 |
# Branding in Sidebar
|
|
|
|
| 489 |
st.sidebar.caption(f"**Data loaded:** {st.session_state.dev_file_name} • {df0.shape[0]} rows × {df0.shape[1]} cols")
|
| 490 |
|
| 491 |
if st.sidebar.button("Preview data", use_container_width=True, disabled=not st.session_state.dev_file_loaded):
|
| 492 |
+
st.session_state.show_preview_modal = True # Set state to show modal
|
| 493 |
st.session_state.dev_preview = True
|
| 494 |
|
| 495 |
run = st.sidebar.button("Run Model", type="primary", use_container_width=True)
|
|
|
|
| 566 |
df0 = next(iter(book.values()))
|
| 567 |
st.sidebar.caption(f"**Data loaded:** {up.name} • {df0.shape[0]} rows × {df0.shape[1]} cols")
|
| 568 |
if st.sidebar.button("Preview data", use_container_width=True, disabled=(up is None)):
|
| 569 |
+
st.session_state.show_preview_modal = True # Set state to show modal
|
| 570 |
go_btn = st.sidebar.button("Predict", type="primary", use_container_width=True)
|
| 571 |
if st.sidebar.button("⬅ Back to Case Building", use_container_width=True): st.session_state.app_step="dev"; st.rerun()
|
| 572 |
if st.sidebar.button("Proceed to Prediction ▶", use_container_width=True): st.session_state.app_step="predict"; st.rerun()
|
|
|
|
| 607 |
with col_cross:
|
| 608 |
st.pyplot(
|
| 609 |
cross_plot_static(st.session_state.results["Validate"][TARGET],
|
| 610 |
+
st.session_state.results["Validate"]["UCS_Pred"]),
|
| 611 |
use_container_width=True
|
| 612 |
)
|
| 613 |
with col_track:
|
|
|
|
| 634 |
df0 = next(iter(book.values()))
|
| 635 |
st.sidebar.caption(f"**Data loaded:** {up.name} • {df0.shape[0]} rows × {df0.shape[1]} cols")
|
| 636 |
if st.sidebar.button("Preview data", use_container_width=True, disabled=(up is None)):
|
| 637 |
+
st.session_state.show_preview_modal = True # Set state to show modal
|
| 638 |
go_btn = st.sidebar.button("Predict", type="primary", use_container_width=True)
|
| 639 |
if st.sidebar.button("⬅ Back to Case Building", use_container_width=True): st.session_state.app_step="dev"; st.rerun()
|
| 640 |
|
|
|
|
| 668 |
table = pd.DataFrame({
|
| 669 |
"Metric": ["# points","Pred min","Pred max","Pred mean","Pred std","OOR %"],
|
| 670 |
"Value": [sv["n"],
|
| 671 |
+
round(sv["pred_min"],2),
|
| 672 |
+
round(sv["pred_max"],2),
|
| 673 |
+
round(sv["pred_mean"],2),
|
| 674 |
+
round(sv["pred_std"],2),
|
| 675 |
+
f'{sv["oor"]:.1f}%']
|
| 676 |
})
|
| 677 |
st.success("Predictions ready ✓")
|
| 678 |
df_centered_rounded(table, hide_index=True)
|
|
|
|
| 683 |
use_container_width=True, config={"displayModeBar": False, "scrollZoom": True}
|
| 684 |
)
|
| 685 |
|
| 686 |
+
# =========================
|
| 687 |
+
# Run preview modal after all other elements
|
| 688 |
+
# =========================
|
| 689 |
+
if st.session_state.show_preview_modal:
|
| 690 |
+
# Get the correct book based on the current app step
|
| 691 |
+
book_to_preview = {}
|
| 692 |
+
if st.session_state.app_step == "dev":
|
| 693 |
+
book_to_preview = read_book_bytes(st.session_state.dev_file_bytes)
|
| 694 |
+
elif st.session_state.app_step in ["validate", "predict"] and up is not None:
|
| 695 |
+
book_to_preview = read_book_bytes(up.getvalue())
|
| 696 |
+
|
| 697 |
+
# Use a try-except block to handle cases where 'up' might be None
|
| 698 |
+
# and the logic tries to access its attributes.
|
| 699 |
+
try:
|
| 700 |
+
if st.session_state.app_step == "validate" and up is not None:
|
| 701 |
+
book_to_preview = read_book_bytes(up.getvalue())
|
| 702 |
+
elif st.session_state.app_step == "predict" and up is not None:
|
| 703 |
+
book_to_preview = read_book_bytes(up.getvalue())
|
| 704 |
+
except NameError:
|
| 705 |
+
book_to_preview = {}
|
| 706 |
+
|
| 707 |
+
with st.expander("Preview data", expanded=True):
|
| 708 |
+
if not book_to_preview:
|
| 709 |
+
st.info("No data loaded yet.")
|
| 710 |
+
else:
|
| 711 |
+
names = list(book_to_preview.keys())
|
| 712 |
+
tabs = st.tabs(names)
|
| 713 |
+
for t, name in zip(tabs, names):
|
| 714 |
+
with t:
|
| 715 |
+
df = book_to_preview[name]
|
| 716 |
+
t1, t2 = st.tabs(["Tracks", "Summary"])
|
| 717 |
+
with t1:
|
| 718 |
+
st.pyplot(preview_tracks(df, FEATURES), use_container_width=True)
|
| 719 |
+
with t2:
|
| 720 |
+
tbl = (df[FEATURES]
|
| 721 |
+
.agg(['min','max','mean','std'])
|
| 722 |
+
.T.rename(columns={"min":"Min","max":"Max","mean":"Mean","std":"Std"}))
|
| 723 |
+
df_centered_rounded(tbl.reset_index(names="Feature"))
|
| 724 |
+
# Reset the state variable after the modal is displayed
|
| 725 |
+
st.session_state.show_preview_modal = False
|
| 726 |
+
|
| 727 |
# =========================
|
| 728 |
# Footer
|
| 729 |
# =========================
|