Kickboxing Workout Dashboard
I regularly take kickboxing classes at Fly Kickboxing. A workout summary is then sent to my email following each class. I log this data and track my performance over time using the dashboard below.
Data Notes:
The source data for this dashboard is provided from two systems:
Mindbody class registration data: This data source provides the core dimensional data - coach, class type, class date and time.
Impact Wrap class metrics: This data source provides the primary metric data - impact score, strike count, and overall score per class.
A data architecture diagram is presented below to show how the data goes from raw input to dashboard.
The source data is loaded into two separate tables in a Snowflake database via a Streamlit webform. A view in the database joins the data from the two tables based on an imputed timestamp for each class. The timestamp from Impact Wrap is rounded off to the nearest half-hour as the raw start time in the Impact Wrap system is based on when the class actually starts - typically a few minutes after the scheduled start time. In addition, a table in the database stores coach information - the coach information is then joined to the view in Tableau.
A script in Hex reads the view and the coach table, and pushes those into a Google Docs spreadsheet. This allows Tableau Public to read 'live' data and I do not need to republish each time there is an update.
As an API is not yet available to automate the data pull from each source, manual logging is necessary.
Why didn't I just write the data into Google Sheets? I am trying to show more of a business case value of using Streamlit, Snowflake, and Hex. The business cases I am thinking of include:
Slowly changing dimensions: Using Streamlit as a webform to log specific events or dimensional data updates.
Data movement: While I am using Hex to move data from Snowflake to Google Sheets, there are many other directions and destinations for the data to move.
Data visualization & analysis: While the dashboard isn't showing revenue cycles or marketing spend, I tried to present the data in a way that allows the end user to see change over time, draw insights and correlations, and obverse different descriptive statistics.
I may end up pushing the dashboard to Tableau Cloud, connect directly to Snowflake, and using the Tableau Embedding API to push the dashboard here.
To learn more about Fly Kickboxing, visit their website. Better yet - sign up for a class! See you there!
Data Architecture Diagram:
To do list:
Buy a heart rate monitor? It would be fun to log heart rate/calories burned on here.
I bought a heart rate monitor - so I should re-build this to incorporate that data.
Include a drop down option to show the last 100 classes - the issue with this is that introduces some table calcs so I would have to refactor all the stats throughout the dashboard.
While I don't think my average class impact has enough variability for this, I might try to do some basic regression modeling around impact/strike count/overall score. A simple scatter plot really shows that there is nearly a 1:1 correlation between strike count and overall score, but I may want to quantify how much of an impact the impact score has on overall score.
Incorporate box-and-whisker plots for strike impact and employ a t-test (but do so without using the R connection) to determine if there is a statistically significant difference in strike impact between class types/coaches.
Create an External Function (GCP) to write directly to Google Sheets (eliminate Hex) upon submit of workout.
Write a script to read the registration emails (mindbody) and workout summary emails (impact wrap) and parse the data needed and write that to Snowflake (and then upon writing, call the external function).
Longer term - push the viz to Tableau Cloud and use the embedding API to fully integrate with a web framework (need a JWT generator - possibly from Hex?).
When the dashboard is more "final", reproduce in Power BI and Sigma.