{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Getting data from Strava\n", "\n", "https://pythonhosted.org/stravalib/api.html#stravalib.client.Client.get_activity_streams" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import settings\n", "from stravalib.client import Client\n", "\n", "client = Client(access_token = settings.STRAVA_ACCESS_TOKEN)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on method get_activities in module stravalib.client:\n", "\n", "get_activities(before=None, after=None, limit=None) method of stravalib.client.Client instance\n", " Get activities for authenticated user sorted by newest first.\n", " \n", " http://strava.github.io/api/v3/activities/\n", " \n", " \n", " :param before: Result will start with activities whose start date is\n", " before specified date. (UTC)\n", " :type before: datetime.datetime or str or None\n", " \n", " :param after: Result will start with activities whose start date is after\n", " specified value. (UTC)\n", " :type after: datetime.datetime or str or None\n", " \n", " :param limit: How many maximum activities to return.\n", " :type limit: int or None\n", " \n", " :return: An iterator of :class:`stravalib.model.Activity` objects.\n", " :rtype: :class:`BatchedResultsIterator`\n", "\n" ] } ], "source": [ "help(client.get_activities)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(client.get_activities(after='2018-07-28', before='2018-07-29'))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "types = ['time', 'distance', 'latlng', 'altitude', 'velocity_smooth', 'moving', 'grade_smooth']\n", "streams = client.get_activity_streams(1732801109, types=types)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualizing elevation" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker as ticker\n", "\n", "fig, ax = plt.subplots()\n", "ax.plot(streams['distance'].data, streams['altitude'].data)\n", "\n", "ax.set(xlabel='distance (km)', ylabel='altititude (m)')\n", "ax.grid()\n", "\n", "ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x/1000)))\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Group data to smoothen the visualization" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "locations = streams['latlng'].data\n", "velocities = streams['velocity_smooth'].data\n", "\n", "data = zip(locations, velocities)\n", "\n", "groups = []\n", "\n", "last_velocity = None\n", "for location, velocity in data:\n", " if not last_velocity or abs(abs(last_velocity) - abs(velocity)) > 0.4:\n", " groups.append({'velocity': velocity, 'velocities': [], 'locations': []})\n", " groups[-1:][0]['locations'].append(location)\n", " groups[-1:][0]['velocities'].append(velocity)\n", " last_velocity = velocity\n", "\n", "import statistics\n", "\n", "for group in groups:\n", " group['velocity'] = statistics.median_high(group['velocities'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Folium\n", "\n", "http://python-visualization.github.io/folium/quickstart.html\n", "\n", "https://github.com/python-visualization/folium/blob/master/folium/plugins/heat_map.py\n", "\n", "https://matplotlib.org/tutorials/colors/colormaps.html\n", "\n", "To correctly colorize datapoints we need to normalize and map the values first. Luckily `matplotlib` does this for us." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import folium\n", "from folium import plugins\n", "\n", "m = folium.Map(location=[49.7947117,14.3916288], tiles='Stamen Toner', zoom_start=12.2)\n", "\n", "def convert_to_hex(rgba_color):\n", " red = str(hex(int(rgba_color[0]*255)))[2:].capitalize()\n", " green = str(hex(int(rgba_color[1]*255)))[2:].capitalize()\n", " blue = str(hex(int(rgba_color[2]*255)))[2:].capitalize()\n", "\n", " if blue=='0':\n", " blue = '00'\n", " if red=='0':\n", " red = '00'\n", " if green=='0':\n", " green='00'\n", "\n", " return '#'+ red + green + blue\n", " \n", "import matplotlib.cm as cm\n", "from matplotlib.colors import Normalize\n", "\n", "cmap = cm.bwr\n", "norm = Normalize(vmin=min(velocities), vmax=max(velocities))\n", "\n", "def colorize(grade):\n", " return convert_to_hex(cmap(norm(grade)))\n", "\n", "for group in groups:\n", " folium.PolyLine(\n", " group['locations'],\n", " weight=10,\n", " color=colorize(group['velocity'])\n", " ).add_to(m)\n", "\n", "m" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m.save('index.html')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 }