Data analytics and ecommerce for modern brands. MBA in data analytics, in progress. Building a portfolio of data engineering work, shipping projects as they're done.
I'm a data analytics and ecommerce professional with a passion for turning complex datasets into clear, actionable strategies. Currently pursuing my MBA with a concentration in Data Analytics, I bring a blend of analytical rigor and creative thinking to every project.
With roots in Seal Beach, California, I've built my career at the intersection of data science and digital commerce, helping brands scale smarter, not just bigger. From inventory optimization to customer behavior analysis, I love uncovering the stories hidden in the numbers. Sports girly at heart: if it's not money analytics, it's sports stats.
Outside of work, I'm a Southern California native and never too far from the ocean. Most days you'll find me with my red merle Australian Shepherd, River, my kids, and a half-formed plan, usually involving trails, beaches, or both.
Statistical analysis, visualization, and predictive modeling. Making the complex beautifully simple, and actionable.
Product management, inventory systems, conversion optimization, and customer lifecycle strategy. Growth that holds up.
Reports and forecasting models that empower teams to make confident, data-backed decisions at every level.
In progress, more shipping soon
Built for portfolio purposes. The data shown is synthetic or sourced from public data, for demonstration purposes only. Any projects for clients or employers remain private.
End-to-end cloud data pipeline pulling live stock data, processing it through AI, and visualizing trends in a Delta Lake data lakehouse.
Why this oneStock analytics is the classic first-portfolio project. This one goes further: it's wired on production cloud infrastructure end-to-end, uses an LLM (Claude via AWS Bedrock) for the analysis layer, and stores data in a real lakehouse with ACID transactions, not a local CSV.
Python pulls 6 months of daily price data for AAPL, TSLA, AMZN, GOOGL, MSFT via Yahoo Finance API. Cleaned, normalized, uploaded to S3 as structured CSV.
Lambda triggers on new S3 data. Reads CSV, sends to Claude via AWS Bedrock for pattern analysis, writes AI-generated insights back to S3.
Data loaded into Databricks and saved as a Delta Lake table with ACID transactions, schema enforcement, and time travel. Every version recoverable.
Databricks SQL surfaces monthly trends, price ranges, best and worst trading days, year-over-year comparisons. Rendered as interactive dashboards.
Probabilistic CLV predictions for a synthetic golf ecommerce retailer. Turned 65,000 transactions into per-customer 12-month revenue forecasts using RFM features and BG/NBD + Gamma-Gamma models.
Built a realistic golf ecommerce dataset in Python. 65,000 transactions across 5,000 customers and six behavioral segments, with seasonality, churn patterns, and upgrade cycles baked in.
Raw transactions uploaded to S3 and loaded into Databricks as a Delta table with schema enforcement, time travel, and ACID transactions.
SQL aggregations turn raw orders into per-customer Recency, Frequency, and Monetary features. Silver layer table, one row per customer, ready for modeling.
Industry-standard probabilistic CLV models. BG/NBD predicts future transaction counts. Gamma-Gamma predicts order value. Combined, they output expected 12-month revenue per customer.
Tour Enthusiasts outspend Weekend Golfers by 11.7x in predicted lifetime value. Same acquisition cost, dramatically different returns.
The top two segments drive 70% of forecasted revenue despite being only 32% of the customer base.
Predicted next-12-month revenue, calculated one customer at a time. Drives acquisition budget and retention priorities.
A personal 5-year DCF valuation of Lululemon Athletica (NASDAQ: LULU), pulled from live SEC EDGAR filings and current market data. Built as a real data engineering pipeline through medallion architecture, SQL window functions, and a reverse DCF that backs out what the market is pricing in.
Why this oneThe valuation could be done in Excel in an afternoon. The portfolio value is in the pipeline: Lambda-shaped Python pulling raw XBRL from SEC, normalized through bronze/silver/gold layers, queried with SQL window functions in DuckDB (portable to Databricks SQL warehouse), then valued with a base case + bear/bull sensitivity. Live yfinance integration anchors the reverse DCF to the current market price.
Python pulls every XBRL fact Lululemon has ever reported from SEC EDGAR in a single API call. Filtered to the 25 line items the model needs, landed in S3 Bronze. Lambda-ready for scheduled refreshes.
Pandas parser normalizes XBRL tag variants into clean column names. Handles old vs. new accounting standards, so the same parser works for Nike, Adidas, and Under Armour without edits. Output: 16 years of typed financial data as Parquet.
DuckDB runs SQL window functions over the silver table to compute YoY growth, 5-year rolling CAGR, margin compression vs peak, and FCF conversion. Same SQL ports to a Databricks SQL warehouse with a one-line connection swap.
5-year free cash flow projection, discounted at the cost of equity, with a Gordon-growth terminal value. Reverse DCF backs out the growth, margin, and discount rate that the current market price implies.
Three sets of growth and margin assumptions run through the same model. Output is a side-by-side valuation, with explicit assumptions instead of hidden ones.
Base-case intrinsic value of $179 per share against a $134 market price. A meaningful discount if you believe growth recovers even partially.
Implied revenue growth at the current price. The market is pricing in five years of revenue decline, alongside margin compression and a distressed-company discount rate.
Long-term debt on the balance sheet. Lululemon runs net cash, so the model simplifies to equity-only valuation with operating leases as the only meaningful obligation.
A focused, quick-to-build forecasting and decision tool for a multi-channel DTC wellness brand. A brief KPI overview frames the operating context, revenue, units, top movers, and a five-state reorder engine turns it into a concrete daily action list.
Why this oneTight scope, shipped fast. The math behind reorder timing usually lives in a spreadsheet and breaks the moment a SKU goes seasonal or a second sales channel is added. This replaces that. A recency-weighted velocity model handles trend and noise. An explicit five-state machine (reorder_now / soon / healthy / slow / dead, plus an on_order override) makes every decision auditable. A brief KPI overview at the top, revenue, units, average daily sales, SKUs in scope, reorder count, gives the operator the surrounding context they need to trust each recommendation. Underneath: two sales channels reconciled into a single per-SKU view, with vendor lead times and outstanding POs joined in. Built as a Streamlit application, not a notebook.
Python pulls daily orders from Shopify Admin API and Square API, normalizes both into a single (sku, date, units, revenue) schema with a source column, and stores 365 days of rolling history.
Products, vendors, settings, purchase log, and forecast log live in a normalized schema with foreign keys and indexes. Schema enforces that every SKU has a vendor, lead time, MOQ, and unit cost, making downstream math defensible.
90-day rolling-average sales velocity per SKU, with linear recency weighting and an optional per-SKU growth factor. Handles cold-start and dead SKUs as explicit cases, not silent zeros.
Days of supply is on_hand divided by velocity. Compared against target cover days plus vendor lead time to produce one of reorder_now, reorder_soon, healthy, slow, or dead. Outstanding POs override to on_order. Recommended quantity respects vendor MOQ.
Six-page application: Overview KPIs, Reorder Alerts, All Products, Forecast Detail per SKU, Purchase Log, Vendors. Filters cascade across pages. Writes a forecast_log row on every refresh for historical audit.
Every recommendation can be opened to its inputs. The Forecast Detail view shows the velocity model, the rolling window, the days-of-supply calculation, and the recommended quantity formula side by side. Operators question a number and get the answer in one click, no spreadsheet archaeology required.
SKUs flagged reorder_now this cycle. A tight, prioritized morning queue lets operators act in minutes instead of auditing the full 200-SKU catalog by hand.
Velocity spread between top-quartile and bottom-quartile SKUs. The recency-weighted model captures this gap so fast-movers reorder ahead of slow-movers, even when their on-hand counts look the same.
Recommended purchase-order value surfaced this cycle, grouped by vendor with MOQ already applied. Operators copy the per-vendor list straight into the PO email.
Started at an MMA gear manufacturer selling into Tillys, moved to an MMA startup, then joined a small ecommerce team at a 7-figure MMA gear company back when ecommerce was in its infancy. Also worked on the creative side for action-sports brands that sold into Tillys, Pac Sun, and major department stores.
A slight detour into education, managing data and ensuring state compliance for schools in California.
Led ecommerce and data initiatives in automotive and Home, Lawn & Garden, managing complex catalogs and varied vendor requirements.
Provided strategy, data management, and operational expertise to bicycle companies, tattoo shops, events, and other independent businesses throughout my career.
past experience, current direct affiliation may not apply
In progress
In progress
In progress
* Also certified in personal training and nutrition.
Want to talk data, ecommerce, or just nerd out about analytics? I'm always down.