End-to-End Tennis Data Engineering & Analytics Dashboard
Built with Python, SQL Server & Streamlit
This project is a full-stack data analytics solution that integrates the SportRadar API with a relational database and an interactive Streamlit dashboard to analyze tennis competitions, venues, and player rankings.
The system demonstrates:
- API data ingestion
- Relational database design
- SQL-based analytical querying
- Data transformation using Pandas
- Interactive dashboard visualization
- Dynamic filtering with real-time updates
It follows a modular architecture separating API, database, query logic, and presentation layers.
SportRadar API
│
▼
JSON Extraction Layer (api/)
│
▼
Data Processing & Cleaning (scripts/)
│
▼
SQL Server Database (Normalized Schema)
│
▼
Query Layer (queries/)
│
▼
Streamlit Analytics Dashboard (app.py)
The database is designed using normalized relational principles.
| Table Name | Description |
|---|---|
| Categories | Stores competition categories |
| Competitions | Tournament-level details |
| Complexes | Tennis complexes information |
| Venues | Individual playing venues |
| Competitors | Player profile information |
| Competitor_Rankings | Weekly player ranking statistics |
- Composite Primary Key on
Competitor_Rankings:(competitor_id, type_id, year, week) - Foreign key relationships between competitions, venues, and competitors
- Structured for analytical querying (grouping, filtering, aggregation)
- Total competitions KPI
- Category distribution
- Type distribution (Singles / Doubles)
- Gender-based breakdown
- Parent & sub-competition mapping
- SQL-driven dynamic queries
- Complex-to-venue relationship mapping
- Venue distribution by city and country
- Country-wise venue count visualization
- Timezone insights
- Interactive filtering
- Rank range filtering (1–500)
- Competitor-specific drill-down
- Country-based filtering
KPI Metrics:
- Total Players
- Highest Points
- Lowest Rank
- Average Points
Additional Insights:
- Top 10 by Rank
- Top 10 by Points
- Movement classification (Improved, Dropped, Unchanged)
The dashboard supports global filtering across modules:
- Year / Season
- Country
- Gender
- Category
- Competition
- City
- Complex
- Venue
- Rank Range
- Competitor
All filters dynamically update tables, KPIs, and charts in real-time.
| Layer | Technology |
|---|---|
| Programming | Python 3.10 |
| Frontend | Streamlit |
| Visualization | Plotly |
| Data Handling | Pandas |
| Database | SQL Server |
| API Integration | SportRadar API |
| Environment Config | python-dotenv |
| Version Control | Git |
game-analytics-tennis/
│
├── api/
│ ├── competitions_api.py
│ ├── complexes_api.py
│ └── rankings_api.py
│
├── data/raw/
│ ├── competitions.json
│ ├── complexes.json
│ └── double_rankings.json
│
├── database/
│ ├── db_connection.py
│ ├── schema.py
│
├── queries/
│ ├── competition_queries.py
│ ├── ranking_queries.py
│ └── venue_queries.py
│
├── scripts/
│ └── insert_data.py
│
├── app.py
├──tennis_db.sqlite
├── requirements.txt
└── .env
git clone https://github.com/Nihaa-20/Tennis-Game-Analysis
cd game-analytics-tennispython -m venv venv
venv\Scripts\activatepip install -r requirements.txtCreate a .env file:
DB_SERVER=your_server
DB_DATABASE=tennis_db
DB_USERNAME=your_username
DB_PASSWORD=your_password
python database/schema.pypython scripts/insert_data.pystreamlit run app.py- Aggregation queries (COUNT, SUM, AVG)
- Grouping by category, type, gender
- Ranking comparison analysis
- Movement trend categorization
- Top-N analysis
- Drill-down competitor filtering
- API data ingestion & JSON handling
- Database schema design
- SQL analytical query writing
- Data cleaning & transformation
- Dashboard UX structuring
- Modular project architecture
- Error handling & data validation
- Live API auto-refresh scheduling
- Player head-to-head comparison module
- Tournament bracket visualization
- Deployment on Streamlit Cloud / Azure
- Authentication & role-based access
Fathima Niha
BCA Graduate | Data Analytics Enthusiast
Data sourced from SportRadar API for academic and analytical purposes.