World Wrestling Entertainment (WWE) gathering datasets to make a database - Final Project for EDS 213
A structured SQL database built from real WWE event and match rating data sourced from Cagematch.net and the Wrestling Observer Newsletter (WON). This project demonstrates end-to-end data engineering and analytics skills from schema design and data ingestion to SQL querying and Python visualization.
- Project Overview
- Dataset
- Schema Design
- Data Cleaning
- Analysis Questions
- Visualizations
- Tech Stack
- How to Run
- Limitations & Future Work
This project was built over 7 weeks as part of a database design course. The goal was to:
- Choose a real-world dataset
- Design a relational schema
- Clean and ingest data into a SQL database
- Write analytical SQL queries
- Visualize results in Python
- Document and present findings
The dataset covers 10 years of WWE programming (2015–2025), including televised shows, non-televised live events, and premium live events (PLEs/PPVs).
Source: Kaggle — WWE Events & Match Ratings (2015–2025)
| File | Rows | Description |
|---|---|---|
wwe_events.csv |
5,970 | Event-level data (show name, type, location) |
wwe_match_rating.csv |
8,101 | Match-level data with fan and critic ratings |
Rating Sources:
- CageMatch Rating — crowdsourced fan ratings from cagematch.net (6,235 matches rated)
- WON Star Rating — critic ratings from Dave Meltzer's Wrestling Observer Newsletter (2,171 matches rated)
Event Types:
| Type | Count |
|---|---|
| Televised | 3,261 |
| Non-Televised | 2,421 |
| PLE/PPV | 288 |
wwe_events — Event-level fact table
| Column | Type | Key |
|---|---|---|
| Date | DATE | PK |
| Promotion | TEXT | PK |
| Event | TEXT | |
| EventName | TEXT | |
| EventType | TEXT | |
| CityTown | TEXT | |
| StateProvince | TEXT | |
| Country | TEXT |
wwe_match_rating — Match-level fact table
| Column | Type | Key |
|---|---|---|
| Index | INTEGER | PK |
| Date | DATE | FK → wwe_events |
| Promotion | TEXT | FK → wwe_events |
| Match | TEXT | |
| CageMatchRating | DECIMAL | |
| CageMatchRatingVotes | INTEGER | |
| WONStarRating | DECIMAL | |
| Opponent1 | TEXT | |
| Opponent2 | TEXT |
tag_teams — Unpivoted tag team opponents
| Column | Type | Key |
|---|---|---|
| OpponentID | INTEGER | PK |
| MatchIndex | INTEGER | FK → wwe_match_rating |
| Team | TEXT |
superstars — Unique superstar lookup table
| Column | Type | Key |
|---|---|---|
| SuperstarID | INTEGER | PK |
| SuperstarName | TEXT |
Cleaning was performed in R using the tidyverse package.
Steps taken:
- Dates were already in
YYYY-MM-DDformat and loaded as proper date types, no reformatting needed - Numeric columns (
CageMatchRating,WONStarRating,CageMatchRatingVotes) contained no text or mixed values - Missing ratings represented as
NA(expected: not every match is rated by both sources) - Trailing commas removed from opponent strings (e.g.
"Raquel Rodriguez, Stephanie Vaquer,") - Tag teams extracted by detecting
&in opponent columns and pivoting to long format - 515 duplicates looking rows in
wwe_eventsare legitimate. WWE runs multiple house shows in different cities under the same event name on the same date
Known limitation: 81 match dates in wwe_match_rating have no corresponding row in wwe_events. These matches are excluded from any query that joins both tables.
- Line chart showing Cagematch rating votes by event type per year
- Visualizations: Horizontal bar chart of top 5 most voted events per event type
- Visualizations: Horizontal bar chart of top 20 highest rated WrestleMania superstars
- Visualizations: Line chart of John Cena's average match rating by year
- Visualizations: Violin/box plot of John Cena's ratings by career era
| Tool | Purpose |
|---|---|
| R / tidyverse | Data cleaning and ingestion |
| SQLite | Relational database |
| Python / pandas | Data manipulation |
| Python / matplotlib | Visualization |
| Kaggle | Data source |
- Download the CSVs from Kaggle
- Run the R cleaning script to generate cleaned tables
- Ingest CSVs into an SQL file using
wwe_databasescript to create tables - Run SQL queries against the database -
wwe_querieswas created to test queries and experiment - Run the Python visualization scripts to generate plots - These are in the
notebookfolder, each script creates one visualization using an Cursor Execute (cur.execute) method.
- No EventID — the join between events and matches relies on
Date + Promotion, which is imprecise. A properEventIDforeign key would make the schema more robust. - 81 unmatched match dates — some matches cannot be linked to an event and are excluded from joined queries.
- Superstar name inconsistencies — name variations (e.g. "Rey Mysterio" vs "Rey Mysterio Jr.") could cause duplicate entries in the superstars table. A fuzzy matching or manual deduplication step would improve accuracy.
- WON ratings are sparse — only 2,171 of 8,101 matches have a WON rating, limiting cross-rating comparisons.