Case study
One dashboard joining four disconnected systems
Descriptive Analysis: Daily resort operations from lift scans and downtime
A live, interactive dashboard and the ETL pipeline behind it, unifying lift-ticket visitation, weather/snow conditions, lift downtime, and staffing for an independent ski resort into one recurring view.
- Data Pipeline
- ETL
- Dashboard Design
- Reconciliation
Most independent ski resorts run visitation, weather/snow, lift status, and staffing as four disconnected systems, checked separately every morning. This piece builds a Python ETL pipeline that cleans and joins those four sources into one daily-operations fact table, and the live dashboard below, which the operations team can check in one place every morning. Full methodology in the PDF below; every number on this page is fully synthetic.
Total Season Visitors
157,752
152 operating days
Avg. Daily Visitors
1,038
Peak: 2,354 on Feb 16
Avg. Lift Uptime
98.3%
Across 6 lifts, cleaned downtime log
Avg. Staffing Ratio
26.7:1
Visitors per staff, peak-concurrent
Total Downtime
124 hrs
Season total, all lifts
Daily Visitation vs. Staffing
Unique visitors (left axis) and total peak-concurrent staffing (right axis) across the full season.
Season-Total Downtime by Lift
Cleaned downtime minutes (bars) and cumulative share of total downtime (line).
Lift Utilization vs. Theoretical Max Capacity
Season-total gate scans as a % of what each lift could have carried running at full rated capacity, every seat full, every operating hour of the season. That baseline is a ceiling, not a realistic target, so the percentages are naturally low; the ranking across lifts is what matters.
Snowfall vs. Daily Visitation
r = 0.108 between snowfall and daily visitation (0 is no linear relationship, 1 is perfect).
The Problem
- An operations team checks 3-4 disconnected systems every morning: ticket/gate scans, a weather feed, a lift-status log, and a staffing spreadsheet.
- None of those systems agree on basic questions: total visitation, whether staffing matches expected demand, or which lift drives most downtime.
- A one-time report can't solve this: the answer needs to keep working every operating day of the season.
What Was Built
- Generated four fabricated raw source files reproducing the real reconciliation problems a unified pipeline has to solve.
- Built a Python ETL pipeline: de-duplicate and merge the downtime log, reconcile lift scans against true unique visitation, aggregate shift-level staffing to daily headcount.
- Joined all four sources into one daily-operations fact table plus dashboard-ready aggregates.
- Built the dashboard from reusable chart/KPI components (Apache ECharts) so new metrics can be added without rebuilding the interface.
What It Found
- 98.3% mean lift uptime across 6 lifts, after cleaning 45 duplicate and 30 adjacent downtime-log entries a naive total would have double-counted.
- Normalizing gate scans by rated capacity flips the naive read: the beginner carpet has the lowest raw scan count of all six lifts but the highest capacity utilization, while the six-pack chair has the second-highest raw count but the lowest utilization.
- Snowfall and daily visitation correlate at r = 0.108 (0 is no linear relationship, 1 is perfect), so snowfall accounts for 1.2% of day-to-day variation in visitation in this synthetic data.
- One daily view designed to replace four separate morning checks, built to extend as new lifts, departments, or metrics are added.
Stack
- Python
- pandas
- NumPy
- Next.js
- React
- TypeScript
- Apache ECharts
The Analysis, in Full
The full report opens as a PDF.
Download the PDF report