Importing five months of Push Strength VBT workout data into JMP

I began using a Push Strength band during my weight workouts back in mid-May. If you’ve read earlier entries on this blog here and here, seen my Fitness and Food series on the JMP blog, or checked out Discovery 2015 9-19-15 for community, then you know that I’ve been collecting weight training data for many years in notebooks. It’s only recently that I have begun to transition my written workout data into analysis-ready files.

I began exploring wearable devices for strength training in the hopes of being able to reduce my future data entry burden while improving the scope and resolution of the data I collect on my workout sessions. I am also motivated to train smarter in the weight room as I age and hopefully avoid future injuries. I don’t compete in any particular athletic event, so my training is less about sports performance and more about maintaining my health and a body shape and size that I prefer. Fortunately these goals go hand in hand.

VBT vs. PBT training philosophy

As I wrote in an earlier blog here, the Push band is designed to assist athletes using a velocity based training (VBT) approach. What is VBT, anyway? In short, it is a training approach that uses the velocity of the bar (or your body) to guide load selection. There are a lot of great resources out there on this topic, and you can learn much more from podcasts and articles by experts like Bryan Mann who has been coaching with VBT technology for 15 years, so I’ll only include a quick summary here. The VBT concept seems easiest to explain when I contrast it with more traditional percentage based training (PBT) approach to lifting that I learned in middle and high school. For an in-depth article on the difference between PBT and VBT, check out this article on the Push site.

A traditional PBT approach might involve choosing a weight to lift and number of reps to perform based on percentages of a 1 rep max, with the underlying assumption that this max weight is a constant that can be adjusted upon re-testing. For example, if I can press 125 lbs once but can’t lift more, then that number is my bench press max, and I might perform sets of different numbers of reps at various percentages of that weight depending on my goals. I might do more reps at a lower percentage of my max to work on conditioning and fewer reps at higher percentages to work on strength.

Push includes the following graphic to illustrate some commonly used percentages for different training goals and their inverse relationship with bar velocity.

PBT curve Push

Photo credit: Push Strength website

On the other hand, VBT assumes that the maximum weight an athlete is capable of lifting varies from day to day based on many factors, like stress, health, recovery from recent training sessions, etc. Imagine that I was able to test my 1 RM for a given exercise every few days. I would likely find that the maximum weight I was capable of lifting was not the same each day. My 1 RM measurements would probably fall within a distribution with some mean and variance, and my daily weight selection would be ideal if it was tailored to my potential capacity on that particular day.

Fortunately, with VBT, I don’t need to do a 1 RM test regularly to determine how much weight I should lift to be within certain training ranges. On a given day, to train for a particular goal, I can adjust the load for an exercise to hit a specific velocity range. I first complete a set of an exercise with the intent of lifting as fast as I can and assesses my average velocity. Depending on what numbers I see, I may want to adjust my weights up or down so that I am working within a velocity range appropriate for my goals on that day. A VBT training curve similar to the PBT one above would show velocity ranges rather than 1 RM percentage ranges. By looking at rep velocities measured during sets, I can get immediate feedback on whether I should adjust a weight up or down for the next set.

VBT curve Push

Photo credit: Push Strength website

Both PBT and velocity curves can also be used to estimate 1 RM, if you’re interested in tracking that metric without actually doing a 1 RM test. This isn’t something I’ve done personally, but if you want more details, you can check out this link for some ideas.

Adopting the Push device and becoming aware of the concepts behind velocity based training (VBT) has certainly changed how I train. As expected, adopting the Push band has improved my criteria for load selection, the amount of weight that I choose for an exercise. Before I began paying attention to rep velocity, I was probably selecting too much weight when doing certain exercises, likely increasing my risk of new injuries and aggravating a chronic injury I have been dealing with for a while now. This became apparent to me when I saw that I was working down in the max strength velocity zone for certain exercises. I am being more careful now to choose a lower weight/higher velocity range more often and for more exercises. However, if I happen to have a workout or an area where I am working on strength, I choose a heavier weight and look for a velocity profile that indicates velocity fall off throughout the set to help confirm that I am challenging myself with the weight I choose.

Using the Push band has had a bit of a negative impact on my exercise selection, however. Only a subset of the exercises in my repertoire are supported by the Push band and app. One arm rows, dumbbell and barbell rows are supported, while seated cable rows are not. Shoulder presses and bicep curls are each individually supported but the combined movement of curl and press is not. When my notebook is not in front of me, I tend to choose supported exercises for ease of tracking my data. Some exercise movements the band does support (e.g., pullups) have movement patterns that are similar enough to detect reps for non-supported exercises (e.g., DB pullovers), but finding out these similarities takes some trial and error. It doesn’t upset me to tweak a program as written to substitute a different exercise, but I do hope Push continues to add common exercises over time.


Exporting data from the Push portal

After collecting data for several months using the armband, I decided it was time to work through the details of exporting all my data from the Push portal and importing it into JMP. I’ve detailed a number of the issues I ran into on the Push forum in the form of feature requests for the future, but I think it’s worth discussing them here in case you are evaluating this tool and thinking of exporting your data to an external analysis tool. Before I get into these issues, I’d like to state that I do like many of the features and graphical views offered by the Push app and portal. These views summarize your data at various levels and over workouts and they’ll probably be plenty for most users. They’re especially helpful for coaches who have multiple athletes to manage and don’t have time to deal with exporting data to other tools. Obviously, I’m not on a team so the only data I have to deal with is mine. Here are some examples of the types of graphics the Push portal offers. If you were coaching a team, you’d be looking at them for one athlete at a time.

The session review graph allows you to select an exercise and view its velocity profile over various sets in a workout. The green bars display the average velocity of each rep in a set, and the grey area displays the load for that set. In my workout from last Friday shown below, I was using 20 lb dumbbells for the first two 21-rep sets of DB bench press, then used 32.5 lb dumbbells for several sets of 10-12 reps. When I’m working out, I look to see a general declining velocity trend over sets. On another note, with DB bench press, I find I have to work with very light weights to get my velocity up higher, and it doesn’t feel like I’m working the area, so I tend to work in the middle of my strength range for that exercise. The heaviest I’ve gone in recent memory for this exercise was 55 lbs for 5 reps, but I’ll talk in my next blog about how I think that contributed to an injury that negatively impacted my training. I rarely work with dumbbells over 40 lbs now for DB bench press as a result.

Session review

In addition to reviewing data for a specific exercise within a workout, I can also review data for exercises across workouts, as I did for DB bent over rows below. This graph shows green bars corresponding to my average rep velocity and a grey area corresponding to load for that exercise during each workout. This gives me an idea of how my mean velocity changed over a period of time and how velocity varies across different loads I select.

Performance review

Finally, the training volume graphs show total work and average load over past sessions. The green bars below summarize total workand average load by day

Training volume

Changing work to load volume in this graph provides a view of total pounds lifted during workouts over time. I like this and the previous graph for showing workout frequency.

Training load

The portal graphs are useful, but for all my various quantified self data sets, I prefer to visualize, filter, and screen through my data in JMP. This lets me do things I can’t do using pre-built graphics from apps or websites, like create custom views and combine my data with other data sets. One rather trivial example of a useful feature is the ability to exclude questionable reps. Once I’ve reviewed and finalized a set, I can’t exclude oddball reps from appearing in Push graphics-but I can hide and exclude them from my JMP data table. Exporting my data and bringing it into JMP allows me complete flexibility for visualizing and filtering. Also, I can’t adjust load once a set is complete, so I can’t fix data entry mistakes after the fact except after exporting my data.

Early in my Push usage, I exported a workout or two and played around with JMP’s data filter and column switcher to make graphs of the various metrics in my table. I decided to return to my export exercise once I had more workouts tracked. With various other things going on over the last few months, I had over 60 workouts completed by the time I got around to exporting my workout files. Now the complexities of working with this data set became much more apparent.

Issue #1: I had to export each of my workouts into a separate file. In some ways, it would have been easier if I could have exported my whole workout history to a single file. Fortunately, the individual files were saved as CSV, so although it was time-consuming to save them one by one, at least there was no PDF parsing involved. I could easily concatenate my files in JMP interactively or using a script I had written for a previous project. If you were working in Excel, you could combine your csv files using a command line call as recommended in this link, and import the combined csv file into Excel.

Issue #2: File names didn’t include the workout name unless I had pre-scheduled the workout through the portal. It was helpful that each file name included the workout date, but I discovered that if I had used the Free Mode setting in the app (which I almost always do), even if I renamed my workout from the default “Free Mode” name and it showed up in the portal so named, the updated name wouldn’t export in the csv file name. I ended up manually updating each file name to include the correct workout name.

Issue #3: Workout date, workout name, start time, end time, duration, and working time were not exported as columns in my exported tables. I consider these variables to be critical workout metadata and I always include them in my tables. Although set start time and set end time were exported, I had to manually update the tables to include the other information. I spent a few hours on the plane ride to and from JMP Discovery Summit 2015 in San Diego updating my files to include missing workout metadata. I am hoping to create a more elegant solution through scripting at some point so that I can keep up with my data export task on a regular basis.

Issue #4: The rep level resolution of the Push data means that the format is quite different from my other historical weight training data. I must therefore summarize my data by set to combine it with my historical data. In JMP, I can summarize my metrics at the set level if I have a unique set ID. Which brings me to the next related issue…

Issue #5: My data lacks a unique set ID variable. I want to see data for reps nested within ordered sets. However, I don’t currently log into the portal to create templates for all my workout programs because they change frequently and even may change after I get to the gym depending on equipment availability. I have therefore made extensive use of the app’s ability to quickly start up a workout in Free Mode and bookmark exercises so that I can quickly switch between exercises in a superset or change exercises if needed. Working this way makes it easy to choose the number of sets as I work, adding or deleting a set in a way that isn’t possible when working with a template.

However, when working in Free mode and doing supersets, repeated sets of the same exercise are interleaved with other exercises, so each set number appears as 1 when I export my data. This means that the set identifier Push exports is not unique. I tried a few approaches to solve this issue.  First, I created a unique set ID in my exported data table using the set start time variable so that I could summarize my data by set. Eventually I will probably script a better option so that I have a unique set ID that matches my other data sources with the format 1, 2, 3, etc.


Final thoughts about data preparation

Overall, I was disappointed at the amount of manual work I had to do to export and prepare my files to include all the information that I wanted. Before I adopted the Push band, I had used the Full Fitness workout app, and it offered the option to email myself my workout history in CSV format right from my phone. Granted, it did not collect rep-level data since it was not connected to a device, but it did export set-level data (exercise name, weight, reps, and set #)  by date of workout. The resulting table was easily imported into JMP . The one weakness I noted with Full Fitness was that the order in which the exercises appeared didn’t usually match the order in which I had completed them. Since I like to retain an order variable for exercises within my workout, I had to add it after the fact to put the exercises in the right order.

I’ve solved other challenges with my PUSH data using similar approaches I also applied to my historical work out logs-for example, I updated a script that recodes similar exercise names consistently and grouped exercises into primary body part groupings. If you’re combining training records gathered using multiple devices or apps, this kind of recoding step is absolutely necessary to being able to see patterns over time.

In my next blog, I’ll share some observations I’ve made about my training patterns from the data I’ve collected and visualized.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s