Spaces:
Sleeping
Sleeping
abraham9486937737 commited on
Commit Β·
588dcba
1
Parent(s): fea11b3
Embed logo base64 fallback and fix revenue distribution
Browse files- streamlit_app/app.py +30 -10
streamlit_app/app.py
CHANGED
|
@@ -18,6 +18,10 @@ warnings.filterwarnings('ignore')
|
|
| 18 |
project_root = Path(__file__).parent.parent
|
| 19 |
sys.path.insert(0, str(project_root))
|
| 20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
from config.settings import *
|
| 22 |
from src.generate_powerpoint_report import PowerPointReportGenerator
|
| 23 |
|
|
@@ -262,7 +266,11 @@ with st.sidebar:
|
|
| 262 |
try:
|
| 263 |
st.image(hf_logo_url, use_container_width=True)
|
| 264 |
except Exception:
|
| 265 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 266 |
except Exception as e:
|
| 267 |
st.markdown("<h1 style='text-align: center; font-size: 80px;'>π¨</h1>", unsafe_allow_html=True)
|
| 268 |
|
|
@@ -468,17 +476,29 @@ if page == "π Overview":
|
|
| 468 |
st.subheader("Revenue Distribution")
|
| 469 |
revenue_candidates = [
|
| 470 |
col for col in df_filtered.columns
|
| 471 |
-
if any(k in col.lower() for k in ['amount', 'revenue', 'total', 'rate', 'price'])
|
| 472 |
]
|
| 473 |
-
|
| 474 |
-
|
| 475 |
-
|
| 476 |
-
|
| 477 |
-
|
|
|
|
|
|
|
| 478 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 479 |
|
| 480 |
-
if
|
| 481 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 482 |
if not revenue_values.empty:
|
| 483 |
fig = px.histogram(
|
| 484 |
revenue_values,
|
|
@@ -486,7 +506,7 @@ if page == "π Overview":
|
|
| 486 |
title="Revenue Distribution",
|
| 487 |
color_discrete_sequence=['#636EFA']
|
| 488 |
)
|
| 489 |
-
fig.update_layout(height=400, xaxis_title=
|
| 490 |
st.plotly_chart(fig, use_container_width=True)
|
| 491 |
else:
|
| 492 |
st.info("No revenue values available for the current filters.")
|
|
|
|
| 18 |
project_root = Path(__file__).parent.parent
|
| 19 |
sys.path.insert(0, str(project_root))
|
| 20 |
|
| 21 |
+
LOGO_B64 = """
|
| 22 |
+
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
|
| 23 |
+
"""
|
| 24 |
+
|
| 25 |
from config.settings import *
|
| 26 |
from src.generate_powerpoint_report import PowerPointReportGenerator
|
| 27 |
|
|
|
|
| 266 |
try:
|
| 267 |
st.image(hf_logo_url, use_container_width=True)
|
| 268 |
except Exception:
|
| 269 |
+
try:
|
| 270 |
+
logo_b64 = "".join(LOGO_B64.split())
|
| 271 |
+
st.image(f"data:image/png;base64,{logo_b64}", use_container_width=True)
|
| 272 |
+
except Exception:
|
| 273 |
+
st.markdown("<h1 style='text-align: center; font-size: 80px;'>π¨</h1>", unsafe_allow_html=True)
|
| 274 |
except Exception as e:
|
| 275 |
st.markdown("<h1 style='text-align: center; font-size: 80px;'>π¨</h1>", unsafe_allow_html=True)
|
| 276 |
|
|
|
|
| 476 |
st.subheader("Revenue Distribution")
|
| 477 |
revenue_candidates = [
|
| 478 |
col for col in df_filtered.columns
|
| 479 |
+
if any(k in col.lower() for k in ['amount', 'revenue', 'total', 'rate', 'price', 'cost'])
|
| 480 |
]
|
| 481 |
+
best_col = None
|
| 482 |
+
best_score = 0
|
| 483 |
+
for col in revenue_candidates:
|
| 484 |
+
cleaned = (
|
| 485 |
+
df_filtered[col]
|
| 486 |
+
.astype(str)
|
| 487 |
+
.str.replace(r'[^0-9.-]', '', regex=True)
|
| 488 |
)
|
| 489 |
+
vals = pd.to_numeric(cleaned, errors='coerce')
|
| 490 |
+
score = vals.notna().sum()
|
| 491 |
+
if score > best_score and vals.sum(skipna=True) > 0:
|
| 492 |
+
best_score = score
|
| 493 |
+
best_col = col
|
| 494 |
|
| 495 |
+
if best_col:
|
| 496 |
+
cleaned = (
|
| 497 |
+
df_filtered[best_col]
|
| 498 |
+
.astype(str)
|
| 499 |
+
.str.replace(r'[^0-9.-]', '', regex=True)
|
| 500 |
+
)
|
| 501 |
+
revenue_values = pd.to_numeric(cleaned, errors='coerce').dropna()
|
| 502 |
if not revenue_values.empty:
|
| 503 |
fig = px.histogram(
|
| 504 |
revenue_values,
|
|
|
|
| 506 |
title="Revenue Distribution",
|
| 507 |
color_discrete_sequence=['#636EFA']
|
| 508 |
)
|
| 509 |
+
fig.update_layout(height=400, xaxis_title=best_col, yaxis_title="Count")
|
| 510 |
st.plotly_chart(fig, use_container_width=True)
|
| 511 |
else:
|
| 512 |
st.info("No revenue values available for the current filters.")
|