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.
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 ?
.
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
Glad you got it working. It’s been a while since I looked at this.
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
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.