Building the Power BI Strava custom data connector

This is the second Power BI data connector I have created, the first was for the Office of National Statistics.

As a keen runner I like the idea of viewing my running data on a dashboard and having it reload automatically.

Lucky for me a few people have already been down this road so I could borrow their code (see Kasperonbi link here). I suggest you read Kasper’s post if you want the background detail, I’m not going to repeat it here.

Unfortunately Strava changed their authenticaiton method, meaning the code would only allow you to be authenticated a six hours. (Not much good if you want to schedule this reload on the Power BI Portal.)

I have amended the code to use a refresh token (see this link for more background reading). Including a new refresh funciton (see below).

TokenMethod = (code) =>
    let
        Response = Web.Contents("https://www.strava.com/oauth/token", [                                         // Step 2 - Token Exchange (Get access token)
            Content = Text.ToBinary(Uri.BuildQueryString([
                client_id = client_id,
                client_secret = client_secret,
                code = code,                            
                //redirect_uri = redirect_uri                // Removed as not required
                grant_type = "authorization_code"            // Added this as missing
                ])),
            Headers=[#"Content-type" = "application/x-www-form-urlencoded",#"Accept" = "application/json"]]), 
        Parts = Json.Document(Response)
    in
        Parts;                                                                                                   


Refresh = (code,refresh_token) =>      
    let
        Response = Web.Contents("https://www.strava.com/oauth/token", [                                    
            Content = Text.ToBinary(Uri.BuildQueryString([
                client_id = client_id,
                client_secret = client_secret,
                 code = code,                            
                 grant_type = "refresh_token",
                 refresh_token = refresh_token])),
            Headers=[#"Content-type" = "application/x-www-form-urlencoded",#"Accept" = "application/json"]]), 
        Parts = Json.Document(Response)
    in
        Parts;             

*All the data connector code is available on my github: https://github.com/mrsheraton/PowerBIStravaConnector

The resulting dashboard can be seen on my website: https://www.blueoceanweb.co.uk/strava-powerbi-dataconnector/

*Bear iin mind the Strava API limits users to 600 calls every 15 minutes.

Displaying Maps with Strava Data

I also wanted to display my route maps in Power BI, which I achieved, see below:

To achieve this I converted Polylines to longatitude and Lattitude pairs, using the following Python script:

# 'dataset' holds the input data for this script

import pandas as pd

def decode_polyline(polyline_str):
    index, lat, lng = 0, 0, 0

    # list
    coordinates = []

    # Set
    changes = {'latitude': 0, 'longitude': 0}

    while index < len(polyline_str):
        # Gather lat/lon changes, store them in a dictionary to apply them later
        for unit in ['latitude', 'longitude']:
            shift, result = 0, 0

            while True:
                byte = ord(polyline_str[index]) - 63
                index += 1
                result |= (byte & 0x1f) << shift
                shift += 5
                if not byte >= 0x20:
                    break

            if (result & 1):
                changes[unit] = ~(result >> 1)
            else:
                changes[unit] = (result >> 1)

        lat += changes['latitude']
        lng += changes['longitude']

        coordinates.append((lat / 100000.0, lng / 100000.0))
    return coordinates




dataset['latlong'] = dataset['Polyline'].apply(decode_polyline)
dataset= dataset.set_index(['id', 'Polyline']).explode('latlong').reset_index()
dataset['latitude'], dataset['longitude'] = zip(*dataset['latlong'])

print(dataset)

Then loaded the longatiude and lattitude pairs into the the route map visualuation.

I’ve not gone into a massive amount of detail, but if you have any quesitons or commnts please leave them below.

This Post Has 5 Comments

  1. Filip

    I’ve been able to load my Strava data into PowerBI using your code.
    I’m now trying to add the map visual, but on trying to convert the polygon using the Python script,
    I get an TypeError: object of type ‘float’ has no len()
    It seems Polyline is loaded as float i.s.o. string.
    What conversions did you apply on the Polyline colum ?
    .

    1. Filip

      For some activities the polyline contains null
      which causes the apply to fail.

      I’ve filtered out the rows with polyline null, and the script works

      1. admin

        Glad you got it working. It’s been a while since I looked at this.

  2. J C

    Is a sample .pbix file available for your report? I’m struggling to get the python script to run and would love to see your table structure. thanks

    1. admin

      I’ll send you the .pbix file to your hotmail address. I’ve not really looked at this for a while but hope it’s useful.

Leave a Reply