Skip to content

Commit 36a22bc

Browse files
committed
feat: QuantLabs reorg — quant-led featured grid + Half-baked category
2 parents 632c654 + 23e401f commit 36a22bc

2 files changed

Lines changed: 62 additions & 46 deletions

File tree

dashboard/lib/projects.py

Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class Project:
103103
),
104104
],
105105

106-
"Stocks & markets": [
106+
"Quantitative finance & markets": [
107107
Project(
108108
key="stock_tracker",
109109
label="Stock Tracker",
@@ -118,13 +118,6 @@ class Project:
118118
tech=["Python", "yfinance", "pandas", "Plotly"],
119119
page_link="pages/22_Stock_Analysis.py",
120120
),
121-
Project(
122-
key="stock_prediction",
123-
label="Stock Prediction",
124-
description="Feature engineering and regression for price forecasting",
125-
tech=["Python", "scikit-learn", "Plotly"],
126-
page_link="pages/38_Stock_Prediction.py",
127-
),
128121
Project(
129122
key="portfolio_optimization",
130123
label="Portfolio Optimization",
@@ -177,7 +170,7 @@ class Project:
177170
),
178171
],
179172

180-
"Analytics & Fintech": [
173+
"Data science & analytics": [
181174
Project(
182175
key="benchmark_rates",
183176
label="Benchmark Rates",
@@ -206,6 +199,40 @@ class Project:
206199
tech=["Python", "yfinance", "VADER", "Plotly"],
207200
page_link="pages/39_Market_Insights.py",
208201
),
202+
],
203+
204+
"Tech demos & references": [
205+
Project(
206+
key="big_o",
207+
label="Big O Notation",
208+
description="Same problem, different complexities — log-log curves of Fibonacci and Pair-sum",
209+
tech=["Python", "Plotly", "pytest"],
210+
page_link="pages/60_Big_O.py",
211+
),
212+
Project(
213+
key="etymology",
214+
label="Etymology",
215+
description="Force-directed graph of English word roots — Greek, Latin, and Proto-Indo-European",
216+
tech=["D3.js", "vanilla JS", "YAML"],
217+
page_link="pages/50_Etymology.py",
218+
),
219+
Project(
220+
key="plotting_libraries",
221+
label="Plotting Libraries Compared",
222+
description="Same data rendered in Plotly, Matplotlib, Altair, and Bokeh side-by-side",
223+
tech=["Python", "Plotly", "Matplotlib", "Altair", "Bokeh"],
224+
page_link="pages/41_Plotting_Libraries.py",
225+
),
226+
],
227+
228+
"Half-baked": [
229+
Project(
230+
key="stock_prediction",
231+
label="Stock Prediction",
232+
description="Feature engineering and regression for price forecasting",
233+
tech=["Python", "scikit-learn", "Plotly"],
234+
page_link="pages/38_Stock_Prediction.py",
235+
),
209236
Project(
210237
key="esg_tracker",
211238
label="ESG Tracker",
@@ -235,46 +262,22 @@ class Project:
235262
page_link="pages/26_Financial_Reporting.py",
236263
),
237264
],
238-
239-
"Tech demos & references": [
240-
Project(
241-
key="big_o",
242-
label="Big O Notation",
243-
description="Same problem, different complexities — log-log curves of Fibonacci and Pair-sum",
244-
tech=["Python", "Plotly", "pytest"],
245-
page_link="pages/60_Big_O.py",
246-
),
247-
Project(
248-
key="etymology",
249-
label="Etymology",
250-
description="Force-directed graph of English word roots — Greek, Latin, and Proto-Indo-European",
251-
tech=["D3.js", "vanilla JS", "YAML"],
252-
page_link="pages/50_Etymology.py",
253-
),
254-
Project(
255-
key="plotting_libraries",
256-
label="Plotting Libraries Compared",
257-
description="Same data rendered in Plotly, Matplotlib, Altair, and Bokeh side-by-side",
258-
tech=["Python", "Plotly", "Matplotlib", "Altair", "Bokeh"],
259-
page_link="pages/41_Plotting_Libraries.py",
260-
),
261-
],
262265
}
263266

264267

265268
# FEATURED_KEYS drives two things:
266269
# 1. The "Featured" grid on the /QuantLabs Welcome tab (top 3 shown)
267270
# 2. The order of cards on the /QuantLabs All projects tab — featured
268271
# first in this order, everything else alphabetical after
269-
# To reshuffle the "funnest on top" ordering, just rearrange this list.
272+
# To reshuffle the ordering, just rearrange this list.
270273
FEATURED_KEYS = [
271-
"global_contagion", # flagship: 3D globe + timeline + (soon) gestures
272-
"etymology", # force-directed word graph
273-
"london_house_prices", # geo maps of 10 years of Land Registry data
274-
"big_o", # live algorithm runner + log-log plots
275-
"rent_vs_buy", # interactive calculator + scenario charts
276-
"portfolio_optimization",
277-
"plotting_libraries",
274+
"stock_risk_scanner", # capstone: full-stack, FastAPI, Postgres, Claude API
275+
"var_cvar", # core risk metric
276+
"portfolio_optimization", # efficient frontier, max Sharpe
277+
"time_series", # decomposition, ACF
278+
"algo_trading", # backtesting with equity curves
279+
"global_contagion", # flagship: 3D globe + bond-yield contagion
280+
"london_house_prices", # geo maps of 10 years of Land Registry data
278281
]
279282

280283

dashboard/pages/0_QuantLabs.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,12 @@ def _page_url(page_link: str) -> str:
102102
# back to neutral grey so new categories don't need a palette update before
103103
# they render.
104104
_CAT_CHIP_PALETTE = {
105-
"Geopolitics & risk": {"bg": "#fee2e2", "fg": "#991b1b"},
106-
"Personal finance & property":{"bg": "#dcfce7", "fg": "#166534"},
107-
"Stocks & markets": {"bg": "#dbeafe", "fg": "#1e40af"},
108-
"Analytics & Fintech": {"bg": "#f3e8ff", "fg": "#6b21a8"},
109-
"Tech demos & references": {"bg": "#fef3c7", "fg": "#92400e"},
105+
"Geopolitics & risk": {"bg": "#fee2e2", "fg": "#991b1b"},
106+
"Personal finance & property": {"bg": "#dcfce7", "fg": "#166534"},
107+
"Quantitative finance & markets": {"bg": "#dbeafe", "fg": "#1e40af"},
108+
"Data science & analytics": {"bg": "#f3e8ff", "fg": "#6b21a8"},
109+
"Tech demos & references": {"bg": "#fef3c7", "fg": "#92400e"},
110+
"Half-baked": {"bg": "#f4f4f4", "fg": "#6b6b6b"},
110111
}
111112
_CAT_CHIP_FALLBACK = {"bg": "#f4f4f4", "fg": "#6b6b6b"}
112113
_CARD_CTA_STYLE = (
@@ -334,6 +335,18 @@ def _ql_html(html: str) -> None:
334335
# Tech marquee — rendered via components.html so @keyframes survives
335336
components.html(_build_marquee_html(), height=90, scrolling=False)
336337

338+
# About paragraph
339+
_ql_html(
340+
'<p style="font-family:\'Inter\',system-ui,sans-serif;font-size:0.95rem;'
341+
'line-height:1.7;color:#4a4a4a;max-width:680px;margin:1.5rem 0 2rem;">'
342+
"Two threads run through these projects: risk and pricing — VaR, portfolio "
343+
"optimisation, Monte Carlo simulation, full-stack risk pipelines — and market "
344+
"data engineering — time series decomposition, anomaly detection, benchmark "
345+
"rate feeds. Everything is built in Python, deployed on Streamlit Cloud and "
346+
"Render, with source on GitHub."
347+
"</p>"
348+
)
349+
337350
# Featured grid
338351
st.markdown('<h2 class="ql-section-heading">Featured</h2>', unsafe_allow_html=True)
339352
featured_html = (

0 commit comments

Comments
 (0)