Select a project below to jump straight to the technical breakdown and interactive report.
Serverless GCP + Gemini AI pipeline turning raw photos into structured eBay listings.

Interactive Power BI dashboard tracking 8.3M+ financial complaints.
Power BI report on 40K+ public CFPB complaints about Chase, built around customer-journey friction and peer benchmarks.

Power BI dashboard tracking 52K+ calls against Service-Level targets.

Multivariate Python analysis of 100K+ passengers to find what actually drives loyalty.
Serverless Data Engineering & Applied AI
Databricks
Streamlit
Power BI
An end-to-end e-commerce data pipeline that turns raw, unsorted product photography into ready-to-list eBay inventory with no manual data entry involved. Photos are batched, segmented, and sent through a serverless AI service that writes the SEO title, condition, description, and pricing for every item automatically.
Photos sync to a Google Cloud Storage bucket and are picked up every minute by a Python service running on Google Cloud Run. Items are separated automatically by detecting a "blackout" divider photo (the lens covered by hand between items) using image-brightness detection. Each item's photos are sent to the Gemini API, which returns a structured listing (title, condition, description, and estimated value/shipping) as clean JSON. The finished listings are then loaded into a Databricks SQL warehouse, managed day-to-day through a custom Streamlit terminal, and tracked in Power BI to compare AI-estimated pricing against what items actually sell for.
Interactive Power BI Dashboard
Databricks API
Power BI
This dashboard provides a comprehensive visual analysis of over 8.3 million consumer complaints filed with the Consumer Financial Protection Bureau (CFPB) between January 2025 and July 2026. By structuring and visualizing this massive dataset, the report identifies systemic issues, geographic pain points, and company-specific trends within the financial sector.
This isn't a one-time export — the report is wired directly into a live data pipeline. New complaint data is pulled from a Databricks workspace via a scheduled API call, then automatically transformed and loaded into the reporting layer. That means the numbers above refresh on their own, with no manual downloads or file handling required to keep the dashboard current.
Interactive Power BI Dashboard
Power BI
This report analyzes 40,529 public CFPB complaints about Chase from January 2025 to July 2026. I grouped the CFPB's 75 issue labels (68 distinct issues once I merged the ones the CFPB renamed mid-period) into 10 customer-journey friction themes, then benchmarked how complaints get resolved against five peer banks. The goal is to find where customers hit friction, size it, and point to what a team could test first.
Complaints were pulled month by month from the CFPB API, then cleaned and normalized in Python (deduplicating, harmonizing issue names the CFPB changed mid-period, and mapping states to regions). Friction themes and customer segments were engineered in pandas, and the Power BI model was built as a version-controlled project, with every measure validated against the Python numbers before publishing.
Note: this is public complaint data, not call-center telephony. It shows where friction escalates, not call volume or containment.
Interactive Power BI Dashboard
Power BI
This dashboard tracks Service-Level Agreement (SLA) performance across a contact center's 52,000+ customer calls in 2021. It gives leadership a clear, day-by-day view of how consistently the team is meeting its response and handling targets, and points to where call length is putting that performance at risk.
Unlike the CFPB report above, which pulls automatically from a cloud data platform, this pipeline runs entirely locally, end to end. Raw call records are extracted, cleaned, and loaded using a custom Python-built ELT process into a local database, then modeled and published into Power BI. Without a managed cloud platform doing the heavy lifting, this required hands-on engineering at every stage: scripting the extraction and transformation logic, managing the local database, and scheduling the refresh process — the kind of ground-up pipeline work that goes into building reliable reporting from scratch.
Python / Jupyter Data Analysis
A multivariate exploration of the Airline Passenger Satisfaction dataset (Kaggle), covering 103,904 passenger records across 23 variables. The analysis applies a lens shaped by years of contact center CX work, loyal customers vs. one-and-done customers, what actually separates them, testing service ratings, trip context, and delays against loyalty to see which dimensions actually move the needle.
Built entirely in a Jupyter notebook with pandas, matplotlib, and seaborn for exploration, the analysis works through the data in layers rather than jumping straight to a model: first checking whether loyalty simply tracks who's flying, then ranking all 14 service-rating dimensions by the gap between loyal and disloyal customers, then testing operational reliability, before finally training a Random Forest classifier to weigh every factor together. The model reached 94.6% accuracy separating loyal from disloyal passengers.