<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Cycling Analytics</title>
  <id>https://www.cyclinganalytics.com/blog/feed</id>
  <updated>2026-03-30T23:34:15.884000Z</updated>
  <link href="https://www.cyclinganalytics.com/" />
  <link href="https://www.cyclinganalytics.com/blog/feed" rel="self" />
  <subtitle type="text">Cycling Analytics&#39; blog.</subtitle>
  <generator>Werkzeug</generator>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Running pace and power chart</div></title>
    <id>69cb087730c3a3b80c75c6ee</id>
    <updated>2026-03-30T23:34:15.884000Z</updated>
    <published>2026-03-30T23:34:15.884000Z</published>
    <link href="/blog/2026/03/running-pace-and-power-chart" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;Here&amp;#8217;s a table that shows a list of paces ranging from very fast to rather slow, the equivalent speed, an estimate of the power required, and the corresponding time that running at that pace will achieve for 5km, 10km, half marathon (21.0975km) and marathon (42.195km) distances. A custom distance can also be specified.&lt;/p&gt;

&lt;p&gt;The power estimate is based on the &lt;a href=&#34;https://books.google.com.au/books?id=_wvBjsjkBU8C&amp;pg=PA36&#34;&gt;ACSM running equation&lt;/a&gt; applied to a flat course, which estimates oxygen consumption using an amount that increases linearly with speed plus a small fixed cost, and converted to watts assuming a metabolic efficiency of 21%. Metabolic efficiency varies from person to person, as does biomechanical efficiency (how efficiently you turn body movements into forward motion), so these power numbers are more of a suggestion than an absolute guide. Triathletes who have a bike power meter tend to find these numbers reasonable, although it should also be noted that running and cycling fitness don&amp;#8217;t directly cross over, so it requires training in both sports to be able to perform the similarly in both. This model was designed for speeds higher than 8km/h or 5mph and it is expected that this will overestimate power for lower speeds.&lt;/p&gt;

&lt;p&gt;(Despite its name, &lt;a href=&#34;/&#34;&gt;this site&lt;/a&gt; can be used for running too.)&lt;/p&gt;

&lt;hr /&gt;

&lt;div id=&#34;pace-chart-controls&#34;&gt;
&lt;p&gt;Distance unit: &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;distance&#34; value=&#34;km&#34; checked&gt; Kilometres&lt;/label&gt; &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;distance&#34; value=&#34;mi&#34;&gt; Miles&lt;/label&gt;&lt;/p&gt;

&lt;p&gt;Weight (for power): &lt;input type=&#34;text&#34; id=&#34;weight-input&#34; placeholder=&#34;75&#34; style=&#34;width: 50px&#34;&gt; &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;weight&#34; value=&#34;kg&#34; checked&gt; kg&lt;/label&gt; &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;weight&#34; value=&#34;lb&#34;&gt; lb&lt;/label&gt;&lt;/p&gt;

&lt;p&gt;Pace increment: &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;increment&#34; value=&#34;1&#34;&gt; 0:01&lt;/label&gt; &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;increment&#34; value=&#34;5&#34; checked&gt; 0:05&lt;/label&gt; &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;increment&#34; value=&#34;15&#34;&gt; 0:15&lt;/label&gt;&lt;/p&gt;

&lt;p&gt;Custom distance: &lt;input type=&#34;text&#34; id=&#34;custom-distance-input&#34; style=&#34;width: 50px&#34;&gt; &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;custom-distance&#34; value=&#34;km&#34; checked&gt; km&lt;/label&gt; &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;custom-distance&#34; value=&#34;mi&#34;&gt; mi&lt;/label&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;table id=&#34;pace-chart&#34; class=&#34;pace-chart&#34;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pace&lt;br&gt;&lt;span class=&#34;pace-unit&#34;&gt;min/km&lt;/span&gt;&lt;/th&gt;&lt;th&gt;Speed&lt;br&gt;&lt;span class=&#34;speed-unit&#34;&gt;km/h&lt;/span&gt;&lt;/th&gt;&lt;th&gt;Power&lt;br&gt;W&lt;/th&gt;&lt;th&gt;Power&lt;br&gt;W/kg&lt;/th&gt;&lt;th&gt;5km&lt;/th&gt;&lt;th&gt;10km&lt;/th&gt;&lt;th&gt;Half&lt;br&gt;marathon&lt;/th&gt;&lt;th&gt;Marathon&lt;/th&gt;&lt;th id=&#34;custom-distance-th&#34;&gt;&lt;/th&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;style&gt;
.pace-chart {
    border-collapse: collapse;
}
.pace-chart tr:hover {
    background-color: #f6f6f6;
}
.pace-chart td, .pace-chart th {
    padding: 3px 10px;
}
.pace-chart th {
    position: sticky;
    top: 0;
    background-color: #fff;
    vertical-align: top;
}
.pace-chart td {
    text-align: center;
}
.pace-chart .hl td {
    background-color: #f6f6f6;
}
&lt;/style&gt;

&lt;script&gt;
var secondsToTime = function(s) {
    var hours = &#39;&#39;;
    if (s &gt;= 3600) {
        hours = Math.floor(s / 3600) + &#39;:&#39;;
    }
    var minutes = Math.floor(s % 3600 / 60) + &#39;:&#39;;
    if (hours != &#39;&#39; &amp;&amp; minutes.length == 2) {
        minutes = &#39;0&#39; + minutes;
    }
    var seconds = Math.round(s) % 60 + &#39;&#39;;
    if (seconds.length == 1) {
        seconds = &#39;0&#39; + seconds;
    }
    return hours + minutes + seconds;
};
var paceToRaceTime = function(pace, distance, miles) {
    return secondsToTime(Math.round(distance * pace * (miles ? 0.621371192 : 1)))
};
// 73.85 = 21100J (energy in 1L oxygen) * 21% (efficiency) / 60 seconds
// Other part is ACSM running formula: 0.2ml/kg/min (cost of horizontal movement) * pace (m/min) + 3.5ml/kg/min (base oxygen consumption)
var paceToPower = function(pace, weight, miles, twodp) {
    //var p = 73.85 * (1000 / pace / (miles ? 0.621371192 : 1) * 60 * 0.2 + 3.5) * weight / 1000;
    var p = (886.2 / pace / (miles ? 0.621371192 : 1) + 0.258475) * weight;
    return twodp ? p.toFixed(2) : Math.round(p);
}
function showChart() {
    var chart = $(&#39;#pace-chart tbody&#39;).empty();
    var mode = $(&#39;input[name=&#34;distance&#34;]:checked&#39;).val();
    var isMiles = mode == &#39;mi&#39;;
    var weight = (+$(&#39;#weight-input&#39;).val() * ($(&#39;input[name=&#34;weight&#34;]:checked&#39;).val() == &#39;lb&#39; ? 0.45359237 : 1)) || 75;
    var increment = +$(&#39;input[name=&#34;increment&#34;]:checked&#39;).val();
    var customDistanceValue = $(&#39;#custom-distance-input&#39;).val(), customDistanceUnit = $(&#39;input[name=&#34;custom-distance&#34;]:checked&#39;).val();
    var customDistance = +customDistanceValue / (customDistanceUnit == &#39;mi&#39; ? 0.621371192 : 1);
    $(&#39;#custom-distance-th&#39;).text(customDistance ? customDistanceValue + customDistanceUnit : &#39;&#39;);
    var highlight = (false &amp;&amp; !$(&#39;input[name=&#34;highlight&#34;]&#39;).prop(&#39;checked&#39;)) ? 0 : increment == 1 ? 15 : increment == 5 ? 30 : 60;
    var min, max;
    if (mode == &#39;km&#39;) {
        min = 150;
        max = 600;
        $(&#39;.pace-unit&#39;).text(&#39;min/km&#39;);
        $(&#39;.speed-unit&#39;).text(&#39;km/h&#39;);
    } else {
        min = 240;
        max = 960;
        $(&#39;.pace-unit&#39;).text(&#39;min/mi&#39;);
        $(&#39;.speed-unit&#39;).text(&#39;mph&#39;);
    }
    for (var i = min; i &lt;= max; i += increment) {
        var hl = &#39;&#39;;
        if (highlight &amp;&amp; i % highlight == 0) {
            hl += &#39; class=&#34;hl&#34;&#39;;
        }
        var h = &#39;&lt;tr&#39; + hl + &#39;&gt;&lt;td&gt;&#39; + secondsToTime(i) + &#39;&lt;/td&gt;&lt;td&gt;&#39; + (3600 / i).toFixed(1) + &#39;&lt;/td&gt;&lt;td&gt;&#39; + paceToPower(i, weight, isMiles) + &#39;&lt;/td&gt;&lt;td&gt;&#39; + paceToPower(i, 1, isMiles, true) + &#39;&lt;/td&gt;&lt;td&gt;&#39; + paceToRaceTime(i, 5, isMiles) + &#39;&lt;/td&gt;&lt;td&gt;&#39; + paceToRaceTime(i, 10, isMiles) + &#39;&lt;/td&gt;&lt;td&gt;&#39; + paceToRaceTime(i, 21.0975, isMiles) + &#39;&lt;/td&gt;&lt;td&gt;&#39; + paceToRaceTime(i, 42.195, isMiles) + &#39;&lt;/td&gt;&#39;;
        if (customDistance) {
            h += &#39;&lt;td&gt;&#39; + paceToRaceTime(i, customDistance, isMiles) + &#39;&lt;/td&gt;&#39;
        }
        h += &#39;&lt;/tr&gt;&#39;;
        chart.append(h);
    }
}
showChart();
$(&#39;#pace-chart-controls input&#39;).on(&#39;input change&#39;, showChart);
&lt;/script&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mobile support and lots more</div></title>
    <id>698ea890ed03fce1131bf492</id>
    <updated>2026-02-13T04:29:04.554000Z</updated>
    <published>2026-02-13T04:29:04.554000Z</published>
    <link href="/blog/2026/02/mobile-support-and-lots-more" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;Here&amp;#8217;s a big update to Cycling Analytics. The biggest new thing is that Cycling Analytics should now work properly on mobile devices. To go with this, there&amp;#8217;s a new rides page designed with mobile devices in mind. Also in this update is automatic uploading via the Wahoo API, a preview of the periodisation planner, a way to show activities that share a route, more filtering options for the power curve chart and rides table, the ability to add height and age, running metrics, Flexicharts enhancements, and a few more bits and pieces.&lt;/p&gt;

&lt;p&gt;The general approach to creating a mobile solution has been to adapt the existing site to also work on small screens and touch devices with minimal apparent changes to the desktop interface. This site can be added to your phone or tablet&amp;#8217;s home screen via the &amp;#8220;add to home screen&amp;#8221; item of the browser menu on Android or under &amp;#8220;more&amp;#8221; in the share menu in iOS. Charts now fully support touch events: pinch to zoom, two finger panning, and for the main ride chart, hold to initiate select/deselect. Some pages, like the rides calendar, can&amp;#8217;t really be squashed onto a phone-sized screen, so a best effort was made to make them usable while retaining functionality. There are probably some rough edges.&lt;/p&gt;

&lt;p&gt;To go with the rest of the mobile enhancements, a new interface to activities and upcoming plans designed with mobile devices in mind has been created. This is now the default rides page for small devices.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/mobile-rides.png&#34; style=&#34;width: 474px&#34;&gt;&lt;/p&gt;

&lt;p&gt;At the top there is a training load chart for the most recent period. Then there are controls to filter activities shown in the following sections. Then there is a summary section that shows some details about weeks, months or years. The coloured blocks represent the load for each day of the period and the numbers show the activity count, duration (in hours:minutes), distance and training load. Then there is a section that lists activities. By default it shows all activities, but tapping on a summary row causes it to show just the activities in that period. The sliders for summaries and activities scroll through them. The idea here is that it should be fairly easy to navigate to activities done at different times. Then there is a section that lists upcoming training plans. Tapping on an activity or training plan brings up a view of that item. The full page for the activity can be accessed from here.&lt;/p&gt;

&lt;p&gt;The main ride chart has been remade from scratch (so that it too can work on touch devices because previously it was entirely separate to other charts, but now it&amp;#8217;s built with the same framework as other charts so it gets things like touch functionality from that). For the most part, it is extremely similar to the old chart. It now extends across the entire width of the screen and on wider screens it leaves space on the right for the legend and chart controls (on small screens, drag the controls away or tap at the bottom to hide them if necessary).&lt;/p&gt;

&lt;p&gt;The main new feature for the main ride chart is that it supports smoothing, which uses Gaussian kernel smoothing, so the number is the standard deviation of the kernel, meaning data within that many seconds or metres (depending on the x-axis mode) provides &lt;a href=&#34;https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule&#34;&gt;68%&lt;/a&gt; of the influence on that point, and two standard deviations do 95% and so on.&lt;/p&gt;

&lt;p&gt;The main ride chart has a couple of potential quirks with how it handles data. When smoothing, the info box will show the smoothed data numbers (except for the gear), but the selection will always show data based on the original data. Speed in selections is based on the distance data, which may not correspond exactly with the speed data, especially for very short selections. My impression is that some GPS devices have much more similar GPS and speed data than others (meaning they do less processing to get the speed data). Speed data directly calculated from GPS data and elevation can be added from the drop down menu at the bottom of the chart controls (be aware that the GPS data here is relatively low resolution so the speed calculated here will be accurate to about 0.4km/h).&lt;/p&gt;

&lt;p&gt;Automatic activity imports from the Wahoo API are now supported. This can be set up on the linked accounts page.&lt;/p&gt;

&lt;p&gt;There is now a preview of the periodisation planner, which will be for planning at a higher level, for a year or season. It is a preview for now because I am interested in hearing some feedback before committing to making it work roughly like this. For example, is this in the right direction? Is the logical flow of the tool in line with how you think about structuring training? For the moment, the link to the preview page is under the &amp;#8220;ideas&amp;#8221; link on the user drop down menu in the header.&lt;/p&gt;

&lt;p&gt;Your height and age can now be added to your profile. This is on the user information page. These will be used for statistical things in the future. For example, age brackets in user statistics.&lt;/p&gt;

&lt;p&gt;The power curve chart can now filter the activities shown on it, which is particularly useful for athletes who have power data in multiple types of sport.&lt;/p&gt;

&lt;p&gt;Rides along the same route can now be shown at the bottom of the ride page. Some comparative summary statistics are shown after clicking the &amp;#8220;show similar activities&amp;#8221; button.&lt;/p&gt;

&lt;p&gt;The rides table has two new functions for searching for activities based on GPS. &lt;code&gt;near(lat, lng, [distance])&lt;/code&gt; matches activities for which the route goes within the specified distance (defaulting to 1km) of the given point. One way to use this is to go into Google Maps and right click somewhere to get the point to copy and paste into this. &lt;code&gt;like(ride_id)&lt;/code&gt; matches activities with routes that look like that of the specified activity, just like the find similar rides tool on the ride page. This can be used to find out exactly how many times you&amp;#8217;ve done a certain route.&lt;/p&gt;

&lt;p&gt;For running, vertical oscillation and ground contact time are now read from FIT files and reported. Stride length is also shown.&lt;/p&gt;

&lt;p&gt;Stress balance is now shown for the previous day by default. This can be changed to the current day (which was the previous behaviour) on the training load page.&lt;/p&gt;

&lt;p&gt;There are some new functions in Flexicharts. This command includes many of them:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chart().type(&#39;running&#39;).filter(r =&amp;gt; r.summary.avg_heartrate &amp;gt; 145 &amp;amp;&amp;amp; r.summary.avg_heartrate &amp;lt; 165).avg_speed().avg_heartrate(&#39;color&#39;).color_axis(120, 180).add_trendline(0.1).title(&#39;Speed of moderate HR runs&#39;).zoom_latest(1, &#39;y&#39;).legend(&#39;left&#39;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/flexicharts-8.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;add_trendline&lt;/code&gt; removes the need to write a second command with &lt;code&gt;trendline().on(-1)&lt;/code&gt; by showing a trendline in addition to the current data. &lt;code&gt;title&lt;/code&gt; puts some text above the chart, which is particularly useful if you put multiple charts in one saved item. &lt;code&gt;zoom_latest&lt;/code&gt; means you don&amp;#8217;t have to zoom in if you always want to look at a recent range. &lt;code&gt;legend&lt;/code&gt; can put that on the left, which is useful if you generally want to look at the right end of the chart. There&amp;#8217;s also &lt;code&gt;filter_y&lt;/code&gt; to provide a way to directly filter on the y value (there&amp;#8217;s also &lt;code&gt;filter_x&lt;/code&gt; and &lt;code&gt;filter_color&lt;/code&gt;) and &lt;code&gt;near(lat, lng, [distance])&lt;/code&gt; and &lt;code&gt;like(ride_id)&lt;/code&gt; that can be used in &lt;code&gt;filter&lt;/code&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Activity search/filter guide</div></title>
    <id>698ea7923bd06930763be82c</id>
    <updated>2026-02-13T04:24:50.582000Z</updated>
    <published>2026-02-13T04:24:50.582000Z</published>
    <link href="/blog/2026/02/activity-search-filter-guide" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;This is intended to be a complete guide for using text entry for custom queries for the places that allow that, such as the table view of your activities, the power curve chart and the mobile activities page.&lt;/p&gt;

&lt;p&gt;The are two types of queries. Text queries simply look for activities that have titles, descriptions or activity types that contain the entered text. For example, &lt;code&gt;richmond&lt;/code&gt; will find all the activities that have titles like &amp;#8220;40km around Richmond&amp;#8221;. Searching by activity type is less needed now that there is a drop down type filter, although the drop down filter always filters rather than giving the option of highlighting matched activities.&lt;/p&gt;

&lt;p&gt;Logical queries are the second type of query, which evaluate based on activity summary data. For example, &lt;code&gt;distance &amp;gt; 40&lt;/code&gt; finds all activities with a distance greater than forty kilometers or miles, depending on your preferred units. The system automatically detects whether it&amp;#8217;s a text or logical query. Here are the available variables and functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;duration&lt;/code&gt;, &lt;code&gt;total_time&lt;/code&gt;, &lt;code&gt;moving_time&lt;/code&gt; — Times are in seconds, e.g., &lt;code&gt;duration &amp;gt; 7200&lt;/code&gt; is activities longer than two hours&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distance&lt;/code&gt; — Distance, speeds and climbing are in your preferred units&lt;/li&gt;
&lt;li&gt;&lt;code&gt;climbing&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;epower&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;intensity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;variability&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;load&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trimp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pwc150&lt;/code&gt;, &lt;code&gt;pwc170&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pwc_r2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lrbalance&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avg_cadence&lt;/code&gt;, &lt;code&gt;avg_speed&lt;/code&gt;, &lt;code&gt;avg_heartrate&lt;/code&gt;, &lt;code&gt;avg_power&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_cadence&lt;/code&gt;, &lt;code&gt;max_speed&lt;/code&gt;, &lt;code&gt;max_heartrate&lt;/code&gt;, &lt;code&gt;max_power&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;year&lt;/code&gt;, &lt;code&gt;month&lt;/code&gt; — 1–12, &lt;code&gt;day&lt;/code&gt; — 1–31&lt;/li&gt;
&lt;li&gt;&lt;code&gt;day_of_week&lt;/code&gt; — 1–7 for Monday to Sunday&lt;/li&gt;
&lt;li&gt;&lt;code&gt;time_of_day&lt;/code&gt; — 24 hour time as a decimal number, e.g., &lt;code&gt;time_of_day &amp;lt; 8.30&lt;/code&gt; is before 8:30am or &lt;code&gt;time_of_day &amp;gt; 18.00&lt;/code&gt; is after 6pm&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; — &lt;code&gt;&#39;cycling&#39;&lt;/code&gt;, &lt;code&gt;&#39;running&#39;&lt;/code&gt;, &lt;code&gt;&#39;gym&#39;&lt;/code&gt; etc., see the ride object below for more details&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subtype&lt;/code&gt;, &lt;code&gt;purpose&lt;/code&gt; — See the ride object below&lt;/li&gt;
&lt;li&gt;&lt;code&gt;power_curve(time)&lt;/code&gt;, &lt;code&gt;epower_curve(time)&lt;/code&gt; — Power curve and effective power curve, enter time in seconds, e.g., &lt;code&gt;power_curve(1200) &amp;gt; 300&lt;/code&gt; is rides with a 20 minute power above 300W&lt;/li&gt;
&lt;li&gt;&lt;code&gt;text(string)&lt;/code&gt; — Matches when the string is contained in the title or description, case insensitive, e.g., &lt;code&gt;text(&#39;richmond&#39;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;near(lat, lng, [distance])&lt;/code&gt; — Matches when the GPS path goes near the given point, see below for more details&lt;/li&gt;
&lt;li&gt;&lt;code&gt;like(ride_id)&lt;/code&gt; — Matches when the GPS path is similar to the given activity, see below&lt;/li&gt;
&lt;li&gt;&lt;code&gt;has&lt;/code&gt; — An object that can be used like &lt;code&gt;has.power&lt;/code&gt; or &lt;code&gt;has.heartrate&lt;/code&gt;, see the ride object below for more details&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ride&lt;/code&gt; — A &lt;a href=&#34;/developer/api#/ride/ride_id&#34;&gt;ride object like this&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;near(lat, lng, [distance])&lt;/code&gt; finds activities that go near a given point, e.g., &lt;code&gt;near(-37.995, 145.037)&lt;/code&gt; or &lt;code&gt;near(-37.8048, 145.0239, 0.05)&lt;/code&gt;. One way to use this is to go into Google Maps, right click on the map and click on the GPS coordinates to copy them and paste that into this. &lt;code&gt;distance&lt;/code&gt; is an optional parameter that determines how close the point has to be to the path to match. It is in kilometers and is 1km if not specified. This uses a simplified version of the full GPS path that is increasingly simplified for longer activities so it may not find all activities if the distance is too low.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;like(ride_id)&lt;/code&gt; finds activities that have a similar route to the given activity, e.g., &lt;code&gt;like(469126681983)&lt;/code&gt;. The ride ID can be found by selecting &amp;#8220;ride ID&amp;#8221; in the fields drop down on this page, and is also the number in the URL for a ride page. Similarity is based on the GPS path being similar and distance also being similar. Direction isn&amp;#8217;t presently taken into account, so the direction of riding a loop doesn&amp;#8217;t matter. Ride ID must be for one of your own activities. If you want more control over what is matched, consider using &lt;code&gt;near&lt;/code&gt; and &lt;code&gt;distance&lt;/code&gt; instead, e.g., &lt;code&gt;distance &amp;gt; 40 &amp;amp;&amp;amp; distance &amp;lt; 45 &amp;amp;&amp;amp; near(-37.97391, 145.01472)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt; and &lt;code&gt;&amp;gt;&lt;/code&gt; are available to make comparisons. &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; (and) and &lt;code&gt;||&lt;/code&gt; (or) are available to create multi-part queries. &lt;code&gt;(&lt;/code&gt; and &lt;code&gt;)&lt;/code&gt; brackets are also available to control precedence. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;year == 2024 &amp;amp;&amp;amp; like(...)&lt;/code&gt; shows all the activities in 2024 that match a particular route&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distance &amp;gt; 50 &amp;amp;&amp;amp; power_curve(900) &amp;gt;= 300&lt;/code&gt; shows all activities longer than 50km (or miles) with a 15 minute power at least 300W&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once a filter is applied, the table can be sorted by any visible column, a summary of the filtered activities is available, filtered activities can be mass edited or downloaded or deleted, and the table data can be exported as CSV data for further analysis in other programs like Excel.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Recent updates</div></title>
    <id>6177d9d88e127b920798e428</id>
    <updated>2021-10-26T10:35:04.850000Z</updated>
    <published>2021-10-26T10:35:04.850000Z</published>
    <link href="/blog/2021/10/recent-updates" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;A couple of new features have been added to Cycling Analytics recently.&lt;/p&gt;

&lt;p&gt;The power curve chart can now have filters applied, so it will only show rides that match the filter. For example, entering the filter &lt;code&gt;ride.trainer&lt;/code&gt; will cause the chart to only show rides ridden on an indoor trainer. To use a filter, first click on the &amp;#8220;Filter&amp;#8221; button in the legend of the power curve chart (when a filter is used, clicking this button toggles whether the filter is applied). The help text contains more examples. The filter applies to the entire chart.&lt;/p&gt;

&lt;p&gt;If you set activity titles on Strava, those titles can be imported and given to your activities on Cycling Analytics. To do this, use the &amp;#8220;Copy ride titles from Strava&amp;#8221; option on the &lt;a href=&#34;/account/linked-accounts&#34;&gt;linked accounts page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is now a tool to &lt;a href=&#34;/blog/2021/10/upload-rides-from-zwift&#34;&gt;import rides from Zwift&lt;/a&gt;. It is a bookmarklet that, when created, allows you to upload the ride you&amp;#8217;re looking at by simply clicking the bookmark button in your browser. (An earlier version of this tool previously existed, but stopped working when Zwift changed some things.)&lt;/p&gt;

&lt;p&gt;Some bigger new features are basically complete or close to completion, so I&amp;#8217;m hoping a larger update isn&amp;#8217;t far away.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Upload rides from Zwift</div></title>
    <id>6177856a8e127b920798e421</id>
    <updated>2021-10-26T04:34:50.043000Z</updated>
    <published>2021-10-26T04:34:50.043000Z</published>
    <link href="/blog/2021/10/upload-rides-from-zwift" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;Here&amp;#8217;s a bookmarklet that uploads rides directly from Zwift to Cycling Analytics. When used on an activity page while the activity settings are shown, this immediately sends the ride to Cycling Analytics.&lt;/p&gt;

&lt;p&gt;The first step is to create an authentication token so that the bookmarklet will have permission to upload rides. Go to the &lt;a href=&#34;https://www.cyclinganalytics.com/developer/api/console&#34;&gt;API console&lt;/a&gt; and enter the following and hit &amp;#8220;enter&amp;#8221;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;POST /tokens {permissions: &#39;create_rides&#39;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(This token will then be displayed on the &lt;a href=&#34;https://www.cyclinganalytics.com/account/apps&#34;&gt;apps page&lt;/a&gt; and can be deleted there. If you&amp;#8217;ve previously created one, you can use that instead.)&lt;/p&gt;

&lt;p&gt;Copy and paste the token here (just the part that looks something like &lt;code&gt;EFS4Ef5wfDC8pmYbmpM3vITbjZY8wDWD&lt;/code&gt;) and click &amp;#8220;create&amp;#8221;:&lt;/p&gt;

&lt;style&gt;
 #bm {
background-color: #01b2cc;
color: #fff;
padding: 5px 12px;
border-radius: 10px;
display: none;
}
 #bm:hover, #bm:focus {
background-color: #0091a7;
text-decoration: none;
}
 #bm-token {
width: 300px;
}
&lt;/style&gt;

&lt;p&gt;&lt;input type=&#34;text&#34; id=&#34;bm-token&#34;&gt; &lt;input type=&#34;button&#34; id=&#34;bm-create&#34; value=&#34;Create&#34;&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id=&#34;bm&#34;&gt;Zwift to CA&lt;/a&gt;&lt;/p&gt;

&lt;script&gt;
$(&#39;#bm-create&#39;).click(function() {
var code = &#34;javascript:(function()%7Blet%20a%20%3D%20document.getElementById(&#39;activityFitFile&#39;)%3B%20%20%0Aif%20(a)%20%7B%20%20%0A%09let%20json%20%3D%20%7Burl%3A%20a.href%2C%20title%3A%20document.getElementById(&#39;activityTitle&#39;).value%7D%3B%20%20%0A%09let%20el%20%3D%20document.createElement(&#39;span&#39;)%3B%20%20%0A%09el.textContent%20%3D%20&#39;Uploading%20to%20CA%E2%80%A6&#39;%3B%20%20%0A%09el.style.marginLeft%20%3D%20&#39;10px&#39;%3B%20%20%0A%09a.after(el)%3B%20%20%0A%09fetch(&#39;https%3A%2F%2Fwww.cyclinganalytics.com%2Fapi%2Fme%2Fupload&#39;%2C%20%7B%20%20%0A%09%09method%3A%20&#39;POST&#39;%2C%20%20%0A%09%09headers%3A%20%7B&#39;Authorization&#39;%3A%20&#39;Bearer%20&#34; + $(&#39;#bm-token&#39;).val() + &#34;&#39;%2C%20&#39;Content-Type&#39;%3A%20&#39;application%2Fjson&#39;%7D%2C%20%20%0A%09%09body%3A%20JSON.stringify(json)%20%20%0A%09%7D)%20%20%0A%09%09.then(()%20%3D%3E%20el.textContent%20%3D%20&#39;Uploaded%20to%20CA&#39;)%20%20%0A%09%09.catch(()%20%3D%3E%20el.textContent%20%3D%20&#39;Uploading%20error&#39;)%3B%20%20%0A%7D%20else%20%7B%20%20%0A%09alert(&#39;No%20FIT%20file%20URL&#39;)%3B%20%20%0A%7D%7D)()%3B&#34;;
$(&#39;#bm&#39;).show().attr(&#39;href&#39;, code);
$(&#39;#bm-code&#39;).html($(&#39;&lt;textarea&gt;&#39;).val(code))
})
&lt;/script&gt;

&lt;p&gt;Create a bookmark out of the link just created by right clicking and selecting the appropriate option or by dragging it to the bookmarks toolbar or library. Alternatively, create a new bookmark with the following value:&lt;/p&gt;

&lt;div id=&#34;bm-code&#34;&gt;&lt;em&gt;Enter the token and click &amp;#8220;create&amp;#8221; first.&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Once the bookmark is created, it can be run on any Zwift activity page once the activity settings are shown (click the cog icon near the top of the page to show the settings, which includes a link to download the Fit file that this uses). The ride is sent to Cycling Analytics immediately.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Here&amp;#8217;s the code. This can be modified if needed and converted into a bookmarlet with a &lt;a href=&#34;https://caiorss.github.io/bookmarklet-maker/&#34;&gt;bookmarklet maker&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;let a = document.getElementById(&#39;activityFitFile&#39;);  
if (a) {  
    let json = {url: a.href, title: document.getElementById(&#39;activityTitle&#39;).value};  
    let el = document.createElement(&#39;span&#39;);  
    el.textContent = &#39;Uploading to CA…&#39;;  
    el.style.marginLeft = &#39;10px&#39;;  
    a.after(el);  
    fetch(&#39;https://www.cyclinganalytics.com/api/me/upload&#39;, {  
        method: &#39;POST&#39;,  
        headers: {&#39;Authorization&#39;: &#39;Bearer REPLACE_THIS_WITH_TOKEN&#39;, &#39;Content-Type&#39;: &#39;application/json&#39;},  
        body: JSON.stringify(json)  
    })  
    .then(() =&amp;gt; el.textContent = &#39;Uploaded to CA&#39;)  
    .catch(() =&amp;gt; el.textContent = &#39;Uploading error&#39;);  
} else {  
    alert(&#39;No FIT file URL&#39;);  
}
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Activity types, W&#8217; balance and other updates</div></title>
    <id>5fc854e43a16da775dba4bec</id>
    <updated>2020-12-03T03:00:52.680000Z</updated>
    <published>2020-12-03T03:00:52.680000Z</published>
    <link href="/blog/2020/12/activity-types-w-balance-and-other-updates" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;Cycling Analytics now supports activities other than cycling. Cycling Analytics remains focussed on cycling, but many cyclists do exercise other than cycling and it pays to keep track of that too. Cycling Analytics has always supported the data files, but now the activity type is indicated on the calendar and elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/calendar-activity-icons.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;Most of what&amp;#8217;s new here is the ability to see and specify activity types. On the calendar, for example, activities that aren&amp;#8217;t cycling have a little icon next to their name. The main change concerning how data is handled is that pace (minutes per kilometre or mile) instead of speed is shown by default for runs. Activities uploaded in the last couple of years or so should already have the correct activity type. Activity type can be changed on the activity page for individual activities or in bulk using the rides table view. The easiest way to fix older activities might be to go to the rides table and search for something like &lt;code&gt;avg_speed &amp;lt; 15&lt;/code&gt; to find activities that aren&amp;#8217;t cycling. The rides table can now be searched by entering the activity type. For example, entering &lt;code&gt;running&lt;/code&gt; or &lt;code&gt;type == &#39;running&#39;&lt;/code&gt; will show all runs.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/ride-chart-wbal.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;The main ride chart can now show W&amp;#8217; balance. It&amp;#8217;s hidden by default and can be revealed by selecting it in the legend. W&amp;#8217; balance models how much energy you have left. For example, the ride in the image above can be divided into three sections. The first half is relatively easy (with a few short hard bits) so the W&amp;#8217; balance line (purple) remains high. Then there is an extended hard effort that comes close to exhausting W&amp;#8217; balance. The final part of the ride is easy and allows W&amp;#8217; balance to recover. The underlying theory was partly discussed when the &lt;a href=&#34;/blog/2020/01/power-model-and-other-new-things&#34;&gt;power model&lt;/a&gt; was added:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;According to the critical power model, you can sustain a certain power output indefinitely (critical power, CP) and you also have a certain amount of additional energy that can be used above the critical power (W’).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;W&amp;#8217; balance, originally developed by Philip Skiba, models how the amount of work remaining in W&amp;#8217; is depleted and recovers during a ride. At the start of a ride, W&amp;#8217; balance is equal to W&amp;#8217;. When riding above CP, W&amp;#8217; balance is depleted. When riding below CP, W&amp;#8217; balance recovers. The closer the current power output is to CP, the slower W&amp;#8217; balance is depleted or recovers. In theory, if W&amp;#8217; reaches zero, you are spent and cannot produce more than CP (in practice, W&amp;#8217; can go below zero when W&amp;#8217; or CP are incorrect or when it falls short as a model of human endurance).&lt;/p&gt;

&lt;p&gt;By default, the CP and W&amp;#8217; used are based on Cycling Analytics&amp;#8217; power model&amp;#8217;s estimate based on the previous six months of riding (from the date of the ride you&amp;#8217;re looking at). They can be changed by clicking on the numbers in the legend.&lt;/p&gt;

&lt;p&gt;One significant difference between W&amp;#8217; balance and Cycling Analytics&amp;#8217; power model is that the power model is largely based around steady state efforts, while W&amp;#8217; balance also handles uneven efforts. For example, in the above ride, the hard effort is on undulating terrain and doesn&amp;#8217;t have particularly impressive efforts according to the power curve chart, so the power model significantly underestimates the CP and W&amp;#8217; required. W&amp;#8217; balance is much more accurate in these cases. (A better version of the power model would incorporate this.)&lt;/p&gt;

&lt;p&gt;A number of other changes have also been made to Cycling Analytics in this update.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/rides-table-summary.png&#34; width=&#34;598.5&#34;&gt;&lt;/p&gt;

&lt;p&gt;The rides table can show a summary of all the activities shown on the table. It&amp;#8217;s hidden by default and shown when the &amp;#8220;show summary&amp;#8221; button is clicked. By default, the summary will be for every activity you have logged, but filters can be used. For example, &lt;code&gt;year == 2020&lt;/code&gt; or &lt;code&gt;year == 2020 &amp;amp;&amp;amp; type == &#39;cycling&#39;&lt;/code&gt; for all activities in 2020 and all rides in 2020 respectively. The summary shows information for each field displayed in the table.&lt;/p&gt;

&lt;p&gt;For those who use RPE, it&amp;#8217;s now possible to use a 0–10 scale instead of the default 6–20 scale. Switching between the scales converts existing RPE measures with no data loss. &lt;a href=&#34;/blog/2020/12/rating-of-perceived-exertion-rpe&#34;&gt;This article&lt;/a&gt; explains how this works in more depth.&lt;/p&gt;

&lt;p&gt;For coaches, there is a new athletes page, which contains a sortable table that, for each athlete, can show up to the previous and upcoming six weeks worth of activities and plans, power curve maximums for up to the previous twelve months, and a few other things. This can be found via the link on the coaching page or at the top of the list in the coaching dropdown in the page header.&lt;/p&gt;

&lt;p&gt;This site has received a minor facelift that I think sharpens its appearance. Some colours have been slightly changed.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s now a short list of rides immediately before and after the current ride at the bottom of the ride page. (It&amp;#8217;s also possible to navigate between rides by clicking on the training load chart that&amp;#8217;s also at the bottom of the ride page.)&lt;/p&gt;

&lt;p&gt;The mass editor on the rides table now allows summary data to be edited.&lt;/p&gt;

&lt;p&gt;There is now a short &lt;a href=&#34;/faq&#34;&gt;FAQ&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ride titles can be sent to Strava when they&amp;#8217;re edited on the ride page. This is controlled with an &amp;#8220;also set on Strava&amp;#8221; checkbox that&amp;#8217;s next to the title when editing.&lt;/p&gt;

&lt;p&gt;CSV data for laps and segments can be shown on ride pages. This can be copy-and-pasted into Excel.&lt;/p&gt;

&lt;p&gt;A couple of changes have been made to Flexicharts. &lt;code&gt;.load()&lt;/code&gt; now shows training load based on power and heart rate data, rather than only power data as it used to. This is the same as how the training load chart works by default. If you want to use only power data, there is now &lt;code&gt;.load_power()&lt;/code&gt;. There is now a &lt;code&gt;.sport(&#39;&amp;lt;type&amp;gt;&#39;)&lt;/code&gt; command, which filters out activities that aren&amp;#8217;t of the specified type. For example, &lt;code&gt;chart().type(&#39;running&#39;).distance().group_by(year).aggregate(sum).table()&lt;/code&gt; shows how far you ran each year in a table.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Rating of Perceived Exertion (RPE)</div></title>
    <id>5fc84cc30ce4d81aee730eb8</id>
    <updated>2020-12-03T02:26:11.106000Z</updated>
    <published>2020-12-03T02:26:11.106000Z</published>
    <link href="/blog/2020/12/rating-of-perceived-exertion-rpe" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;Rating of perceived exertion, or RPE, is a scientifically validated way of measuring the intensity of activity based on self-reported exertion. There are two widely used scales: 6–20 and 0–10. The 6–20 scale is designed to roughly correspond with heart rate with a resting heart rate of 60BPM and a maximum heart rate of 200BPM.&lt;/p&gt;

&lt;p&gt;Cycling Analytics supports both the 6–20 and 0–10 scales. By default, the 6–20 scale is used. The option to change this is in the profile options. It&amp;#8217;s best to stick with one scale, but it can be changed and existing RPEs will be displayed using the new scale. How RPEs are translated between scales is shown in the tables below. A 0–100 scale is also available as an option but isn&amp;#8217;t recommended for normal use as it&amp;#8217;s unecessarily detailed.&lt;/p&gt;

&lt;p&gt;For regular users, it&amp;#8217;s best to use one scale and never change it. The rest of the details on this page don&amp;#8217;t matter.&lt;/p&gt;

&lt;p&gt;For coaches, RPEs are shown to your athletes according to their preference. For example, if your account is set to use the 6–20 scale but their account uses the 0–10 scale, a plan you create with an RPE of 15 will display to them as 5.5. It would probably be best if your athletes use the same scale as you. You can see which scale and change it from athlete RPE page which can be found via the &amp;#8220;view and adjust RPE settings&amp;#8221; button on the coaching page.&lt;/p&gt;

&lt;p&gt;For developers, RPEs for API endpoints are specified using a 0–100 scale. This is the same as the 0–10 scale multiplied by 10. A &lt;a href=&#34;https://research.vu.nl/en/publications/comparison-of-rating-of-perceived-exertion-scales-during-increme&#34;&gt;more complicated&lt;/a&gt; formula is used to convert to and from the 6–20 scale as the relationship between the numbers is non-linear due to the labels used on the numbers. Internally, RPEs are handled as numbers between 0 and 100 and are displayed to the user with the closest value of their chosen scale.&lt;/p&gt;

&lt;p&gt;What follows are tables showing how the scales convert. The tables mean, for example, that 13 (somewhat hard) is equivalent to 42 on a 0–100 scale or 4 on a 1–10 scale.&lt;/p&gt;

&lt;p&gt;When using the 6–20 scale:&lt;/p&gt;

&lt;style&gt;
td, th {
padding: 2px 20px;;
}
&lt;/style&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;RPE&lt;/th&gt;&lt;th&gt;Label&lt;/th&gt;&lt;th&gt;0–10&lt;/th&gt;&lt;th&gt;0–100&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;No exertion&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Extremely light&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1.5&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;Very light&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2.5&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Light&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3.5&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;Somewhat hard&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;42&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;49&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Hard&lt;/td&gt;&lt;td&gt;5.5&lt;/td&gt;&lt;td&gt;57&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;6.5&lt;/td&gt;&lt;td&gt;65&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;Very hard&lt;/td&gt;&lt;td&gt;7.5&lt;/td&gt;&lt;td&gt;73&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;81&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;Extremely hard&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;91&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Maximal exertion&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;When using the 0–10 scale:&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;RPE&lt;/th&gt;&lt;th&gt;Label&lt;/th&gt;&lt;th&gt;6–20&lt;/th&gt;&lt;th&gt;0–100&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;No exertion&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0.5&lt;/td&gt;&lt;td&gt;Extremely slight&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Very slight&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Slight&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Somewhat severe&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;45&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Severe&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;50&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;55&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;60&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;65&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Very severe&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;70&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;75&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;80&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;85&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;Extremely severe&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;90&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;95&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Maximal&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;The 0–10 scale has more options than the 6–20 scale so some 0–10 values translate to the same 6–20 value. This doesn&amp;#8217;t cause information loss if you switch scales unless you save the new value.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Power model and other new things</div></title>
    <id>5e25982af1e1e0000b83bc62</id>
    <updated>2020-01-20T12:08:10.698000Z</updated>
    <published>2020-01-20T12:08:10.698000Z</published>
    <link href="/blog/2020/01/power-model-and-other-new-things" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;Cycling Analytics just received a major update.&lt;/p&gt;

&lt;p&gt;The biggest new feature is the power model analysis tool. This looks at your power data and estimates how strong you are using the critical power model. This includes an FTP estimate.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/power-model-1.png&#34; width=960 height=536&gt;&lt;/p&gt;

&lt;p&gt;Precisely what this shows is a bit complicated. The most important part is the numbers shown underneath. If you&amp;#8217;re not interested in any theory, then note that this estimates your FTP, and there&amp;#8217;s something underneath that predicts what power you should be able to sustain for any duration longer than a minute or two.&lt;/p&gt;

&lt;p&gt;If you are interested in some theory, then according to the critical power model, you can sustain a certain power output indefinitely (critical power, CP) and you also have a certain amount of additional energy that can be used above the critical power (W&amp;#8217;). As an equation, the maximum power that can be sustained for a duration is &lt;em&gt;CP + W&amp;#8217; / time&lt;/em&gt;. For example, using the numbers in the screenshot, the maximum power that could be sustained for ten minutes is 280 + 17111 / 600 = 309W. There&amp;#8217;s something underneath this chart on the power model page so you don&amp;#8217;t need to do any maths yourself.&lt;/p&gt;

&lt;p&gt;The orange line is the maximum power curve for the selected period, but shown as energy (joules) rather than average power (watts) (you might remember from high school physics that energy is power multiplied by time.) The critical power model says that a straight line that indicates the maximum power output can be drawn on this chart. The blue points are the best efforts that this tool has identified from your riding, and the blue line is the prediction, which represents CP and W&amp;#8217;.&lt;/p&gt;

&lt;p&gt;Is this accurate? It depends on the data. The most important thing to be aware of is that its estimates are based on efforts you have done, so it requires maximal efforts for multiple durations to give accurate predictions. W&amp;#8217; in particular can vary widely depending on the data. If your data contains hard short efforts but no equivalently hard long efforts, W&amp;#8217; might be overestimated significantly. There is more of an explanation for how it behaves on the power model page. One nice thing is that even with non-ideal data it rarely overestimates FTP by much.&lt;/p&gt;

&lt;p&gt;Some credit for this goes to Mark Phillips, who shared a spreadsheet with me that inspired the approach this tool uses, and who also sent me a bunch of links.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/power-model-2.png&#34; width=918 height=581&gt;&lt;/p&gt;

&lt;p&gt;One of the other charts on the power model page shows how the estimates for critical power, W&amp;#8217; and FTP have changed over your entire riding history. This particular chart shows the history of someone whose riding hasn&amp;#8217;t been regular over the years, and the predicted FTP varies accordingly.&lt;/p&gt;

&lt;p&gt;There are a few other parts to the power model analysis tool. There&amp;#8217;s a &lt;a href=&#34;http://veloclinic.com/veloclinic-plot-w-cp-subtraction-plot/&#34;&gt;&amp;#8220;Veloclinic plot&amp;#8221;&lt;/a&gt;, plus a few calculators to do different things which might be useful. I&amp;#8217;m not sure how intuitive all of this is or how clear the explanations are.&lt;/p&gt;

&lt;p&gt;Onto other things.&lt;/p&gt;

&lt;p&gt;The main ride chart has seen some changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The x-axis can now be distance instead of time.&lt;/li&gt;
&lt;li&gt;The average speed/heart rate/power/etc. can be shown for the ride or for each lap.&lt;/li&gt;
&lt;li&gt;If the chart controls get in the way of looking at the chart, they can be dragged out of the way using the button at the bottom of the controls (just like with other charts.)&lt;/li&gt;
&lt;li&gt;Respiration rate can be shown if you record that data.&lt;/li&gt;
&lt;li&gt;If you select a lap, that lap remains highlighted in the lap list as long as the selection remains on the chart.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It&amp;#8217;s now possible to adjust FTP for indoor rides, as many people find their indoor FTP is lower than when they&amp;#8217;re riding on the road. This works with a simple percentage scale factor (i.e., if your FTP is 300W and you set it to 95%, indoor rides will have an FTP of 285W), which is simpler than maintaining a separate FTP history for indoor rides, but not as flexible. Adjusting the scale factor causes all existing indoor rides to be updated to use the new FTP. If you later decide you don&amp;#8217;t want to have a different indoor FTP, it can be removed and all indoor rides will be updated to use the normal FTP number.&lt;/p&gt;

&lt;p&gt;The power history chart is nicer to use. It now remembers the zoom level, so you can change the data shown on the chart without it resetting the zoom. It can also show effective power as well as average power.&lt;/p&gt;

&lt;p&gt;There are a few little interface changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For the month summary of the current month on the ride calendar, today&amp;#8217;s long-term stress and short-term stress are shown on the right of the little training load chart rather than the values for the end of the month.&lt;/li&gt;
&lt;li&gt;The time of day can be shown on the rides table.&lt;/li&gt;
&lt;li&gt;A delete button for training plans is shown when clicking on days in the calendar, which saves a click because you don&amp;#8217;t need to click the edit button first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, there are a handful of more technical changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The API can return all ride data streams that Cycling Analytics supports, which includes SmO2 and THb, Garmin&amp;#8217;s Cycling Dynamics, Pioneer&amp;#8217;s power direction measurements, heart rate variability, respiration rate, and gear shifts.&lt;/li&gt;
&lt;li&gt;CSV files now contain more data streams than they used to (CSV files can be exported from the drop down menu next to the date on ride pages.)&lt;/li&gt;
&lt;li&gt;Flexicharts have a few new commands. For filters, there are now &lt;code&gt;last_n_months&lt;/code&gt;, &lt;code&gt;last_n_weeks&lt;/code&gt; and &lt;code&gt;last_n_days&lt;/code&gt;, which are useful if you want to create and save a chart or table that uses data from a recent period. For advanced usage with &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;set_value&lt;/code&gt; now exists, which is useful for creating tables. An example of this exists in &lt;a href=&#34;/developer/flexicharts&#34;&gt;the documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That&amp;#8217;s all for now. One thing I was hoping to have ready now was an initial release of a mobile solution. For better or for worse, everything else here came together first.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Recent updates</div></title>
    <id>5bd7934fb77cc9000d3eb3c5</id>
    <updated>2018-10-29T23:10:07.331000Z</updated>
    <published>2018-10-29T23:10:07.331000Z</published>
    <link href="/blog/2018/10/recent-updates" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;There have been a few noteworthy updates to this site recently.&lt;/p&gt;

&lt;p&gt;The histograms chart has been rewritten to be better and more flexible. Most notably, the bucket width can now be modified.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/histograms.png&#34; width=695 height=472&gt;&lt;/p&gt;

&lt;p&gt;A number of changes have been made to training plans. Intensity, distance and climbing can now be specified for workouts, and when any two of duration, training load and intensity are specified, the other is calculated automatically. If all three are entered, the one entered least recently is changed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/workout.png&#34; width=580 height=177&gt;&lt;/p&gt;

&lt;p&gt;Effective power is also displayed, and is calculated based on intensity and the athlete&amp;#8217;s current FTP. Effective power for workouts is kept up to date when changes are made to the athlete&amp;#8217;s FTP, and will be recalculated for each athlete for workouts that are saved to the training plan library and given to multiple athletes. Automatically calculated values are indicated with the lightning bolt icon, as in the image above, where duration and intensity have been entered.&lt;/p&gt;

&lt;p&gt;Finally, on the topic of training plans, clicking on a day in the calendar in the future now brings up the &amp;#8220;add training plan&amp;#8221; interface directly.&lt;/p&gt;

&lt;p&gt;And some other things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charts and images have been updated to work properly with high pixel density displays (aka Retina displays).&lt;/li&gt;
&lt;li&gt;The main ride chart shows time spent in power or heart rate zones for selections when the zones overlay is displayed.&lt;/li&gt;
&lt;li&gt;Receipts can be viewed from the billing page.&lt;/li&gt;
&lt;li&gt;Flexicharts have gained some new options for creating tables. The &amp;#8220;monthly summary table&amp;#8221; in the built-in library demonstrates what can be done.&lt;/li&gt;
&lt;li&gt;There&amp;#8217;s now a relatively easy way to &lt;a href=&#34;/blog/2018/10/upload-rides-from-zwift&#34;&gt;import rides from Zwift&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Upload rides from Zwift</div></title>
    <id>5bc553ff807ea9000d0032e5</id>
    <updated>2018-10-16T02:59:11.977000Z</updated>
    <published>2018-10-16T02:59:11.977000Z</published>
    <link href="/blog/2018/10/upload-rides-from-zwift" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;&lt;strong&gt;Note: This is an old version of this bookmarklet. &lt;a href=&#34;/blog/2021/10/upload-rides-from-zwift&#34;&gt;Here is a later version.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a bookmarklet that makes it possible to upload rides directly from Zwift to Cycling Analytics. When run, a button is added to the Zwift interface to upload rides.&lt;/p&gt;

&lt;p&gt;The first step is to create an authentication token so that the bookmarklet will have permission to upload rides. Go to the &lt;a href=&#34;https://www.cyclinganalytics.com/developer/api/console&#34;&gt;API console&lt;/a&gt; and enter the following and hit &amp;#8220;enter&amp;#8221;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;POST /tokens {permissions: &#39;create_rides&#39;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(This token will then be displayed on the &lt;a href=&#34;https://www.cyclinganalytics.com/account/apps&#34;&gt;apps page&lt;/a&gt; and can be deleted there.)&lt;/p&gt;

&lt;p&gt;Copy and paste the token here (just the part that looks something like &lt;code&gt;EFS4Ef5wfDC8pmYbmpM3vITbjZY8wDWD&lt;/code&gt;) and click &amp;#8220;create&amp;#8221;:&lt;/p&gt;

&lt;style&gt;
 #bm {
background-color: #01b2cc;
color: #fff;
padding: 5px 12px;
border-radius: 10px;
display: none;
}
 #bm:hover, #bm:focus {
background-color: #0091a7;
text-decoration: none;
}
 #bm-token {
width: 300px;
}
&lt;/style&gt;

&lt;p&gt;&lt;input type=&#34;text&#34; id=&#34;bm-token&#34;&gt; &lt;input type=&#34;button&#34; id=&#34;bm-create&#34; value=&#34;Create&#34;&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id=&#34;bm&#34;&gt;Zwift to CA&lt;/a&gt;&lt;/p&gt;

&lt;script&gt;
$(&#39;#bm-create&#39;).click(function() {
//var code = &#34;javascript:(function()%7B%24(&#39;.send-to-ca&#39;).remove()%3B%20%24(&#39;.btn-link&#39;).each(function(i%2C%20el)%20%7B%20el%20%3D%20%24(el)%3B%20%24(&#39;%3Ca%20class%3D%22btn-link%20send-to-ca%22%20style%3D%22margin-left%3A%2010px%22%3E%3Ci%20aria-hidden%3D%22true%22%20class%3D%22fa%20fa-cloud-upload%22%3E%3C%2Fi%3E%20Send%20to%20CA%3C%2Fa%3E&#39;).click(function()%20%7B%20var%20loading%20%3D%20%24(&#39;%3Ca%20class%3D%22btn-link%20send-to-ca%22%20style%3D%22margin-left%3A%2010px%22%3E%3Ci%20class%3D%22fa%20fa-circle-o-notch%20fa-spin%22%3E%3C%2Fi%3E%3C%2Fa%3E&#39;).insertAfter(%24(this))%3B%20%24(this).remove()%3B%20fetch(&#39;https%3A%2F%2Fwww.cyclinganalytics.com%2Fapi%2Fme%2Fupload&#39;%2C%20%7Bmethod%3A%20&#39;POST&#39;%2C%20headers%3A%20%7B&#39;Authorization&#39;%3A%20&#39;Bearer%20&#34; + $(&#39;#bm-token&#39;).val() + &#34;&#39;%2C%20&#39;Content-Type&#39;%3A%20&#39;application%2Fjson&#39;%7D%2C%20body%3A%20JSON.stringify(%7Burl%3A%20el.attr(&#39;href&#39;)%7D)%7D).then(function()%20%7B%20loading.html(%24(&#39;%3Ci%20class%3D%22fa%20fa-check%22%3E%3C%2Fi%3E&#39;))%20%7D).catch(function()%20%7B%20loading.html(%24(&#39;%3Ci%20class%3D%22fa%20fa-times%22%3E%3C%2Fi%3E&#39;))%20%7D)%20%7D).insertAfter(el)%20%7D)%7D)()&#34;;
var code = &#34;javascript:(function()%7B%24(&#39;.send-to-ca&#39;).remove()%3B%24(&#39;.btn-link&#39;).each(function(i%2C%20el)%20%7Bel%20%3D%20%24(el)%3B%24(&#39;%3Ca%20class%3D%22btn-link%20send-to-ca%22%20style%3D%22margin-left%3A%2010px%22%3E%3Ci%20class%3D%22fa%20fa-cloud-upload%22%3E%3C%2Fi%3E%20Send%20to%20CA%3C%2Fa%3E&#39;).click(function()%20%7Bvar%20loading%20%3D%20%24(&#39;%3Ca%20class%3D%22btn-link%20send-to-ca%22%20style%3D%22margin-left%3A%2010px%22%3E%3Ci%20class%3D%22fa%20fa-circle-o-notch%20fa-spin%22%3E%3C%2Fi%3E%3C%2Fa%3E&#39;).insertAfter(%24(this))%3B%24(this).remove()%3Bvar%20title%20%3D%20el.parent().parent().find(&#39;h3&#39;).text()%3Btitle%20%3D%20title.replace(%2F%5EZwift%20-%20%2F%2C%20&#39;&#39;)%3Bif%20(%2F%5E%5Cd%5Cd%5C%2F%5Cd%5Cd%5C%2F%5Cd%5Cd%5Cd%5Cd%24%2F.test(title))%20%7Btitle%20%3D%20&#39;&#39;%3B%7Dvar%20json%20%3D%20%7Burl%3A%20el.attr(&#39;href&#39;)%7D%3Bif%20(title)%20%7Bjson.title%20%3D%20title%3B%7Dfetch(&#39;https%3A%2F%2Fwww.cyclinganalytics.com%2Fapi%2Fme%2Fupload&#39;%2C%20%7Bmethod%3A%20&#39;POST&#39;%2C%20headers%3A%20%7B&#39;Authorization&#39;%3A%20&#39;Bearer%20&#34; + $(&#39;#bm-token&#39;).val() + &#34;&#39;%2C%20&#39;Content-Type&#39;%3A%20&#39;application%2Fjson&#39;%7D%2C%20body%3A%20JSON.stringify(json)%7D).then(function()%20%7Bloading.html(%24(&#39;%3Ci%20class%3D%22fa%20fa-check%22%3E%3C%2Fi%3E&#39;))%3B%7D).catch(function()%20%7Bloading.html(%24(&#39;%3Ci%20class%3D%22fa%20fa-times%22%3E%3C%2Fi%3E&#39;))%3B%7D)%3B%7D).insertAfter(el)%3B%7D)%7D)()&#34;;
$(&#39;#bm&#39;).show().attr(&#39;href&#39;, code);
$(&#39;#bm-code&#39;).html($(&#39;&lt;textarea&gt;&#39;).val(code))
})
&lt;/script&gt;

&lt;p&gt;Create a bookmark out of the link just created by right clicking and selecting the appropriate option or by dragging it to the bookmarks toolbar or library. Alternatively, create a new bookmark with the following value:&lt;/p&gt;

&lt;div id=&#34;bm-code&#34;&gt;&lt;em&gt;Enter the token and click &amp;#8220;create&amp;#8221; first.&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Once the bookmark is created, it can be run on the &lt;a href=&#34;https://my.zwift.com/&#34;&gt;Zwift activity page&lt;/a&gt; and a &amp;#8220;send to CA&amp;#8221; button is added for each ride.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Here&amp;#8217;s the code. This can be modified if needed and converted into a bookmarlet with &lt;a href=&#34;https://mrcoles.com/bookmarklet/&#34;&gt;https://mrcoles.com/bookmarklet/&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$(&#39;.send-to-ca&#39;).remove();
$(&#39;.btn-link&#39;).each(function(i, el) {
    el = $(el);
    $(&#39;&amp;lt;a class=&#34;btn-link send-to-ca&#34; style=&#34;margin-left: 10px&#34;&amp;gt;&amp;lt;i class=&#34;fa fa-cloud-upload&#34;&amp;gt;&amp;lt;/i&amp;gt; Send to CA&amp;lt;/a&amp;gt;&#39;).click(function() {
        var loading = $(&#39;&amp;lt;a class=&#34;btn-link send-to-ca&#34; style=&#34;margin-left: 10px&#34;&amp;gt;&amp;lt;i class=&#34;fa fa-circle-o-notch fa-spin&#34;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;&#39;).insertAfter($(this));
        $(this).remove();
        var title = el.parent().parent().find(&#39;h3&#39;).text();
        title = title.replace(/^Zwift - /, &#39;&#39;);
        if (/^\d\d\/\d\d\/\d\d\d\d$/.test(title)) {
            title = &#39;&#39;;
        }
        var json = {url: el.attr(&#39;href&#39;)};
        if (title) {
            json.title = title;
        }
        fetch(&#39;https://www.cyclinganalytics.com/api/me/upload&#39;, {method: &#39;POST&#39;, headers: {&#39;Authorization&#39;: &#39;Bearer REPLACE_THIS_WITH_TOKEN&#39;, &#39;Content-Type&#39;: &#39;application/json&#39;}, body: JSON.stringify(json)}).then(function() {
            loading.html($(&#39;&amp;lt;i class=&#34;fa fa-check&#34;&amp;gt;&amp;lt;/i&amp;gt;&#39;));
        }).catch(function() {
            loading.html($(&#39;&amp;lt;i class=&#34;fa fa-times&#34;&amp;gt;&amp;lt;/i&amp;gt;&#39;));
        });
    }).insertAfter(el);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Updates&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;18 October: Send ride titles&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;19 October: Add code and fix bug&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">How does your cycling power output compare?</div></title>
    <id>5b18dbdd4a8b7d000b551155</id>
    <updated>2018-06-07T07:16:45.720000Z</updated>
    <published>2018-06-07T07:16:45.720000Z</published>
    <link href="/blog/2018/06/how-does-your-cycling-power-output-compare" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;It&amp;#8217;s common to be curious about how your power output or FTP compares with other people, or to wonder what counts as &amp;#8220;normal&amp;#8221;. This post should answer some of those questions based on data from thousands of people who have used Cycling Analytics.&lt;/p&gt;

&lt;p&gt;In this post, we&amp;#8217;ll look at what people say their FTP is, and then look at the best efforts that people have actually achieved for a handful of durations. All data is shown for males and females in watts and watts per kilogram. Be prepared to see a lot of charts and tables and numbers.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s worth saying a few words about &lt;a href=&#34;/&#34;&gt;Cycling Analytics&lt;/a&gt; users, because they aren&amp;#8217;t a perfectly random sampling of cyclists or people overall. The best term that I can think of is that Cycling Analytics users are &amp;#8220;serious cyclists&amp;#8221;. All the data here comes from people with power meters, and about half of Cycling Analytics users race regularly.&lt;/p&gt;

&lt;h2&gt;What people say their FTP is&lt;/h2&gt;

&lt;p&gt;Firstly, let&amp;#8217;s look at what people say their FTP is. FTP, or functional threshold power, is nominally the power output that can be sustained for one hour. All the data below and more is shown to Cycling Analytics users in interactive charts on the athlete statistics page, so consider &lt;a href=&#34;/register&#34;&gt;creating an account&lt;/a&gt; if this is interesting.&lt;/p&gt;

&lt;h3&gt;FTP in watts for males&lt;/h3&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/ftp-watts-male.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Just like 5&amp;#8216;11&amp;#8221; males on dating sites, it looks like a lot of guys don&amp;#8217;t want to admit that they have an FTP of 190W or 290W when it could be 200W or 300W instead. There&amp;#8217;s also a spike at 250W because it&amp;#8217;s a nice round number that&amp;#8217;s very close to the average FTP.&lt;/p&gt;

&lt;style&gt;
.blog-body section input {
    margin: 0 3px 0 10px;
    width: 40px;
}
.blog-body section table {
    border-collapse: collapse;
}
.blog-body section td, .blog-body section th {
    padding: 4px 12px;
    text-align: right;
}
.blog-body section th {
    text-align: center;
}
.blog-body section .header th {
    border-bottom: 2px solid #ddd;
}
.blog-body section .border {
    border-right: 2px solid #ddd;
}
@media screen and (max-width: 959px) {
  .blog-body table {
    max-width: calc(100% + 20px);
    margin: 0 -10px;
    overflow: scroll;
    display: block;
  }
}
&lt;/style&gt;

&lt;script&gt;
var getRank = function(data, value, width) {
  value = +value || 0;
  var index = Math.max(0, Math.min(data.length - 1, Math.floor(value / width + 1e-9)));
  var lower = Math.round(index * width * 100) / 100;
  var upper = Math.round((lower + width) * 100) / 100;
  var less = 0, more = 0;
  for (var i = 0; i &lt; data.length; i++) {
    if (i &lt; index) {
      less += data[i];
    } else if (i &gt; index) {
      more += data[i];
    }
  }
  less = Math.min(100, Math.round(less * 100) / 100);
  more = Math.min(100, Math.round(more * 100) / 100);
  var same = data[index];
  return {lower: lower, value: value, upper: upper, less: less, same: same, more: more};
};
var createCalculator = function(data, id, width) {
  $(&#39;#&#39; + id + &#39;-in&#39;).on(&#39;input change&#39;, function() {
    var r = getRank(data, $(this).val(), width);
    $(&#39;.&#39; + id + &#39;-less&#39;).text(r.less);
    $(&#39;.&#39; + id + &#39;-more&#39;).text(r.more);
    $(&#39;.&#39; + id + &#39;-same&#39;).text(r.same);
    $(&#39;.&#39; + id + &#39;-lower&#39;).text(r.lower);
    $(&#39;.&#39; + id + &#39;-upper&#39;).text(r.upper);
  }).change();
};
&lt;/script&gt;

&lt;p&gt;Where do you fit in? Enter your FTP:  &lt;input type=&#34;text&#34; id=&#34;ftp-w-m-in&#34; value=&#34;260&#34;&gt;W&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;ftp-w-m-less&#34;&gt;&lt;/span&gt;% of people have an FTP below &lt;span class=&#34;ftp-w-m-lower&#34;&gt;&lt;/span&gt;W.&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-w-m-more&#34;&gt;&lt;/span&gt;% of people have an FTP of &lt;span class=&#34;ftp-w-m-upper&#34;&gt;&lt;/span&gt;W or more. &lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-w-m-same&#34;&gt;&lt;/span&gt;% of people have an FTP between &lt;span class=&#34;ftp-w-m-lower&#34;&gt;&lt;/span&gt;W and &lt;span class=&#34;ftp-w-m-upper&#34;&gt;&lt;/span&gt;W.&lt;/li&gt;
&lt;/ul&gt;

&lt;script&gt;
createCalculator([0, 0, 0.1, 0, 0, 0.1, 0.1, 0, 0.1, 0.1, 0.2, 0.2, 0.4, 0.6, 0.4, 1.5, 1.2, 2, 2.6, 1.8, 6.3, 3.8, 6.1, 6.1, 6.4, 8.9, 6.7, 6.9, 7.3, 5.4, 7.4, 4, 4.4, 2.9, 1.6, 1.6, 1.1, 0.6, 0.5, 0.1, 0.4, 0, 0, 0, 0, 0.1, 0, 0, 0, 0], &#39;ftp-w-m&#39;, 10);
&lt;/script&gt;

&lt;h3&gt;FTP in watts per kilogram for males&lt;/h3&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/ftp-wkg-male.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;This data is smoother because the peaks caused by the round numbers in reported FTP and weight smooth each other out.&lt;/p&gt;

&lt;p&gt;Where do you fit in? Enter your FTP:  &lt;input type=&#34;text&#34; id=&#34;ftp-wkg-m-in&#34; value=&#34;3.5&#34;&gt;W/kg&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;ftp-wkg-m-less&#34;&gt;&lt;/span&gt;% of people have an FTP below &lt;span class=&#34;ftp-wkg-m-lower&#34;&gt;&lt;/span&gt;W/kg.&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-wkg-m-more&#34;&gt;&lt;/span&gt;% of people have an FTP of &lt;span class=&#34;ftp-wkg-m-upper&#34;&gt;&lt;/span&gt;W/kg or more. &lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-wkg-m-same&#34;&gt;&lt;/span&gt;% of people have an FTP between &lt;span class=&#34;ftp-wkg-m-lower&#34;&gt;&lt;/span&gt;W/kg and &lt;span class=&#34;ftp-wkg-m-upper&#34;&gt;&lt;/span&gt;W/kg.&lt;/li&gt;
&lt;/ul&gt;

&lt;script&gt;
createCalculator([0, 0.1, 0, 0.1, 0.1, 0.5, 0.6, 0.9, 1.1, 1.9, 2.7, 4.1, 5.2, 6.3, 6.9, 8.6, 9.5, 9.3, 9.6, 7.3, 7.3, 6.3, 4, 2.9, 1.9, 1.3, 0.6, 0.4, 0.1, 0.1, 0.1, 0.1, 0.1, 0, 0], &#39;ftp-wkg-m&#39;, 0.2);
&lt;/script&gt;

&lt;h3&gt;FTP in watts for females&lt;/h3&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/ftp-watts-female.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Like with the men, not many women say they have a 190W FTP when it could be 200W instead. There is less resolution for this data because there are a lot more males than females that use Cycling Analytics.&lt;/p&gt;

&lt;p&gt;Where do you fit in? Enter your FTP:  &lt;input type=&#34;text&#34; id=&#34;ftp-w-f-in&#34; value=&#34;200&#34;&gt;W&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;ftp-w-f-less&#34;&gt;&lt;/span&gt;% of people have an FTP below &lt;span class=&#34;ftp-w-f-lower&#34;&gt;&lt;/span&gt;W.&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-w-f-more&#34;&gt;&lt;/span&gt;% of people have an FTP of &lt;span class=&#34;ftp-w-f-upper&#34;&gt;&lt;/span&gt;W or more. &lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-w-f-same&#34;&gt;&lt;/span&gt;% of people have an FTP between &lt;span class=&#34;ftp-w-f-lower&#34;&gt;&lt;/span&gt;W and &lt;span class=&#34;ftp-w-f-upper&#34;&gt;&lt;/span&gt;W.&lt;/li&gt;
&lt;/ul&gt;

&lt;script&gt;
createCalculator([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 8, 8, 7, 7, 4, 10, 7, 12, 8, 5, 6, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &#39;ftp-w-f&#39;, 10);
&lt;/script&gt;

&lt;h3&gt;FTP in watts per kilogram for females&lt;/h3&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/ftp-wkg-female.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Where do you fit in? Enter your FTP:  &lt;input type=&#34;text&#34; id=&#34;ftp-wkg-f-in&#34; value=&#34;3.2&#34;&gt;W/kg&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;ftp-wkg-f-less&#34;&gt;&lt;/span&gt;% of people have an FTP below &lt;span class=&#34;ftp-wkg-f-lower&#34;&gt;&lt;/span&gt;W/kg.&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-wkg-f-more&#34;&gt;&lt;/span&gt;% of people have an FTP of &lt;span class=&#34;ftp-wkg-f-upper&#34;&gt;&lt;/span&gt;W/kg or more. &lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;ftp-wkg-f-same&#34;&gt;&lt;/span&gt;% of people have an FTP between &lt;span class=&#34;ftp-wkg-f-lower&#34;&gt;&lt;/span&gt;W/kg and &lt;span class=&#34;ftp-wkg-f-upper&#34;&gt;&lt;/span&gt;W/kg.&lt;/li&gt;
&lt;/ul&gt;

&lt;script&gt;
createCalculator([0, 0, 0, 0, 0, 0, 2, 1, 2, 5, 3, 4, 4, 6, 6, 14, 8, 10, 9, 9, 7, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &#39;ftp-wkg-f&#39;, 0.2);
&lt;/script&gt;

&lt;h2&gt;What people achieve in their riding&lt;/h2&gt;

&lt;p&gt;It&amp;#8217;s one thing to say you have an impressive FTP, but it&amp;#8217;s something else to demonstrate it, so let&amp;#8217;s now look at the best power outputs that Cycling Analytics users have sustained for various durations. Cycling Analytics users can see all this data for all times between one second and two hours with a chart like the one below, and &lt;a href=&#34;/blog/2015/03/improved-comparative-statistics&#34;&gt;a few more things&lt;/a&gt;, so &lt;a href=&#34;/register&#34;&gt;create an account&lt;/a&gt; if you want to see more.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/power-curve-statistics-7.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s important to keep in mind that this data represents what people have actually done, and because most people haven&amp;#8217;t attempted a maximal effort at all durations, these numbers are lower than the true potential maximums of the population it represents. This is probably especially true for the lower percentile levels.&lt;/p&gt;

&lt;h3&gt;Best efforts for males&lt;/h3&gt;

&lt;p&gt;In addition to the best efforts for five seconds, one minute, five minutes and twenty minutes, 95% of the twenty minute best effort is shown because it&amp;#8217;s a common estimate for FTP. Each row represents what somebody at the &lt;em&gt;n&lt;/em&gt;th percentile level has achieved, so the top row indicates that 99% of people have lower numbers than these, or that 1% of people have higher numbers than these. &lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th colspan=&#34;5&#34;&gt;watts&lt;/th&gt;&lt;th colspan=&#34;5&#34; &gt;watts per kilogram&lt;/th&gt;&lt;/tr&gt;
&lt;tr class=&#34;header&#34;&gt;&lt;th class=&#34;border&#34;&gt;%&lt;/th&gt;&lt;th&gt;5s&lt;/th&gt;&lt;th&gt;1m&lt;/th&gt;&lt;th&gt;5m&lt;/th&gt;&lt;th&gt;20m&lt;/th&gt;&lt;th class=&#34;border&#34;&gt;95%&lt;br&gt;20m&lt;/th&gt;&lt;th&gt;5s&lt;/th&gt;&lt;th&gt;1m&lt;/th&gt;&lt;th&gt;5m&lt;/th&gt;&lt;th&gt;20m&lt;/th&gt;&lt;th&gt;95%&lt;br&gt;20m&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;99&lt;/td&gt;&lt;td&gt;1527&lt;/td&gt;&lt;td&gt;759&lt;/td&gt;&lt;td&gt;502&lt;/td&gt;&lt;td&gt;432&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;410&lt;/td&gt;&lt;td&gt;19.80&lt;/td&gt;&lt;td&gt;10.29&lt;/td&gt;&lt;td&gt;6.81&lt;/td&gt;&lt;td&gt;5.80&lt;/td&gt;&lt;td&gt;5.51&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;98&lt;/td&gt;&lt;td&gt;1436&lt;/td&gt;&lt;td&gt;722&lt;/td&gt;&lt;td&gt;470&lt;/td&gt;&lt;td&gt;398&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;378&lt;/td&gt;&lt;td&gt;19.01&lt;/td&gt;&lt;td&gt;9.58&lt;/td&gt;&lt;td&gt;6.43&lt;/td&gt;&lt;td&gt;5.41&lt;/td&gt;&lt;td&gt;5.14&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;95&lt;/td&gt;&lt;td&gt;1343&lt;/td&gt;&lt;td&gt;666&lt;/td&gt;&lt;td&gt;444&lt;/td&gt;&lt;td&gt;375&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;356&lt;/td&gt;&lt;td&gt;17.84&lt;/td&gt;&lt;td&gt;9.11&lt;/td&gt;&lt;td&gt;6.03&lt;/td&gt;&lt;td&gt;5.13&lt;/td&gt;&lt;td&gt;4.88&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;90&lt;/td&gt;&lt;td&gt;1254&lt;/td&gt;&lt;td&gt;627&lt;/td&gt;&lt;td&gt;416&lt;/td&gt;&lt;td&gt;349&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;332&lt;/td&gt;&lt;td&gt;16.74&lt;/td&gt;&lt;td&gt;8.55&lt;/td&gt;&lt;td&gt;5.73&lt;/td&gt;&lt;td&gt;4.86&lt;/td&gt;&lt;td&gt;4.61&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;80&lt;/td&gt;&lt;td&gt;1136&lt;/td&gt;&lt;td&gt;582&lt;/td&gt;&lt;td&gt;389&lt;/td&gt;&lt;td&gt;329&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;313&lt;/td&gt;&lt;td&gt;15.30&lt;/td&gt;&lt;td&gt;7.84&lt;/td&gt;&lt;td&gt;5.30&lt;/td&gt;&lt;td&gt;4.50&lt;/td&gt;&lt;td&gt;4.28&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;70&lt;/td&gt;&lt;td&gt;1054&lt;/td&gt;&lt;td&gt;548&lt;/td&gt;&lt;td&gt;370&lt;/td&gt;&lt;td&gt;312&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;296&lt;/td&gt;&lt;td&gt;14.13&lt;/td&gt;&lt;td&gt;7.35&lt;/td&gt;&lt;td&gt;5.01&lt;/td&gt;&lt;td&gt;4.23&lt;/td&gt;&lt;td&gt;4.02&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;60&lt;/td&gt;&lt;td&gt;992&lt;/td&gt;&lt;td&gt;522&lt;/td&gt;&lt;td&gt;354&lt;/td&gt;&lt;td&gt;298&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;283&lt;/td&gt;&lt;td&gt;13.13&lt;/td&gt;&lt;td&gt;6.92&lt;/td&gt;&lt;td&gt;4.74&lt;/td&gt;&lt;td&gt;3.99&lt;/td&gt;&lt;td&gt;3.79&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;50&lt;/td&gt;&lt;td&gt;930&lt;/td&gt;&lt;td&gt;491&lt;/td&gt;&lt;td&gt;339&lt;/td&gt;&lt;td&gt;286&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;272&lt;/td&gt;&lt;td&gt;12.14&lt;/td&gt;&lt;td&gt;6.49&lt;/td&gt;&lt;td&gt;4.48&lt;/td&gt;&lt;td&gt;3.80&lt;/td&gt;&lt;td&gt;3.61&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;40&lt;/td&gt;&lt;td&gt;865&lt;/td&gt;&lt;td&gt;464&lt;/td&gt;&lt;td&gt;322&lt;/td&gt;&lt;td&gt;274&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;260&lt;/td&gt;&lt;td&gt;11.24&lt;/td&gt;&lt;td&gt;6.14&lt;/td&gt;&lt;td&gt;4.24&lt;/td&gt;&lt;td&gt;3.60&lt;/td&gt;&lt;td&gt;3.42&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;30&lt;/td&gt;&lt;td&gt;795&lt;/td&gt;&lt;td&gt;437&lt;/td&gt;&lt;td&gt;306&lt;/td&gt;&lt;td&gt;260&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;247&lt;/td&gt;&lt;td&gt;10.43&lt;/td&gt;&lt;td&gt;5.73&lt;/td&gt;&lt;td&gt;3.99&lt;/td&gt;&lt;td&gt;3.38&lt;/td&gt;&lt;td&gt;3.21&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;20&lt;/td&gt;&lt;td&gt;712&lt;/td&gt;&lt;td&gt;403&lt;/td&gt;&lt;td&gt;287&lt;/td&gt;&lt;td&gt;244&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;232&lt;/td&gt;&lt;td&gt;9.28&lt;/td&gt;&lt;td&gt;5.23&lt;/td&gt;&lt;td&gt;3.72&lt;/td&gt;&lt;td&gt;3.11&lt;/td&gt;&lt;td&gt;2.96&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;10&lt;/td&gt;&lt;td&gt;601&lt;/td&gt;&lt;td&gt;354&lt;/td&gt;&lt;td&gt;261&lt;/td&gt;&lt;td&gt;222&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;211&lt;/td&gt;&lt;td&gt;7.66&lt;/td&gt;&lt;td&gt;4.48&lt;/td&gt;&lt;td&gt;3.21&lt;/td&gt;&lt;td&gt;2.71&lt;/td&gt;&lt;td&gt;2.58&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;5&lt;/td&gt;&lt;td&gt;501&lt;/td&gt;&lt;td&gt;323&lt;/td&gt;&lt;td&gt;239&lt;/td&gt;&lt;td&gt;202&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;192&lt;/td&gt;&lt;td&gt;6.26&lt;/td&gt;&lt;td&gt;3.90&lt;/td&gt;&lt;td&gt;2.86&lt;/td&gt;&lt;td&gt;2.39&lt;/td&gt;&lt;td&gt;2.27&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;There is a lot more variation at the extremes. There are similar jumps in power between the 80th and 90th percentile, the 90th and 95th, the 95th and 98th, and the 98th and 99th, despite the declining number of people in each of those groups.&lt;/p&gt;

&lt;h3&gt;Best efforts for females&lt;/h3&gt;

&lt;p&gt;There are a lot more males than females using Cycling Analytics, so the top percentile listed here is the 95th.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th colspan=&#34;5&#34;&gt;watts&lt;/th&gt;&lt;th colspan=&#34;5&#34; &gt;watts per kilogram&lt;/th&gt;&lt;/tr&gt;
&lt;tr class=&#34;header&#34;&gt;&lt;th class=&#34;border&#34;&gt;%&lt;/th&gt;&lt;th&gt;5s&lt;/th&gt;&lt;th&gt;1m&lt;/th&gt;&lt;th&gt;5m&lt;/th&gt;&lt;th&gt;20m&lt;/th&gt;&lt;th class=&#34;border&#34;&gt;95%&lt;br&gt;20m&lt;/th&gt;&lt;th&gt;5s&lt;/th&gt;&lt;th&gt;1m&lt;/th&gt;&lt;th&gt;5m&lt;/th&gt;&lt;th&gt;20m&lt;/th&gt;&lt;th&gt;95%&lt;br&gt;20m&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;95&lt;/td&gt;&lt;td&gt;924&lt;/td&gt;&lt;td&gt;477&lt;/td&gt;&lt;td&gt;339&lt;/td&gt;&lt;td&gt;306&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;291&lt;/td&gt;&lt;td&gt;15.36&lt;/td&gt;&lt;td&gt;7.94&lt;/td&gt;&lt;td&gt;5.59&lt;/td&gt;&lt;td&gt;4.84&lt;/td&gt;&lt;td&gt;4.60&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;90&lt;/td&gt;&lt;td&gt;860&lt;/td&gt;&lt;td&gt;455&lt;/td&gt;&lt;td&gt;324&lt;/td&gt;&lt;td&gt;278&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;264&lt;/td&gt;&lt;td&gt;14.27&lt;/td&gt;&lt;td&gt;7.48&lt;/td&gt;&lt;td&gt;5.43&lt;/td&gt;&lt;td&gt;4.61&lt;/td&gt;&lt;td&gt;4.38&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;80&lt;/td&gt;&lt;td&gt;803&lt;/td&gt;&lt;td&gt;432&lt;/td&gt;&lt;td&gt;307&lt;/td&gt;&lt;td&gt;263&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;250&lt;/td&gt;&lt;td&gt;13.06&lt;/td&gt;&lt;td&gt;6.89&lt;/td&gt;&lt;td&gt;4.95&lt;/td&gt;&lt;td&gt;4.33&lt;/td&gt;&lt;td&gt;4.11&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;70&lt;/td&gt;&lt;td&gt;744&lt;/td&gt;&lt;td&gt;395&lt;/td&gt;&lt;td&gt;290&lt;/td&gt;&lt;td&gt;251&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;238&lt;/td&gt;&lt;td&gt;11.89&lt;/td&gt;&lt;td&gt;6.45&lt;/td&gt;&lt;td&gt;4.59&lt;/td&gt;&lt;td&gt;4.07&lt;/td&gt;&lt;td&gt;3.87&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;60&lt;/td&gt;&lt;td&gt;685&lt;/td&gt;&lt;td&gt;372&lt;/td&gt;&lt;td&gt;270&lt;/td&gt;&lt;td&gt;238&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;226&lt;/td&gt;&lt;td&gt;11.15&lt;/td&gt;&lt;td&gt;6.16&lt;/td&gt;&lt;td&gt;4.52&lt;/td&gt;&lt;td&gt;3.94&lt;/td&gt;&lt;td&gt;3.74&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;50&lt;/td&gt;&lt;td&gt;632&lt;/td&gt;&lt;td&gt;352&lt;/td&gt;&lt;td&gt;256&lt;/td&gt;&lt;td&gt;223&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;212&lt;/td&gt;&lt;td&gt;10.03&lt;/td&gt;&lt;td&gt;5.91&lt;/td&gt;&lt;td&gt;4.29&lt;/td&gt;&lt;td&gt;3.80&lt;/td&gt;&lt;td&gt;3.61&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;40&lt;/td&gt;&lt;td&gt;565&lt;/td&gt;&lt;td&gt;323&lt;/td&gt;&lt;td&gt;237&lt;/td&gt;&lt;td&gt;208&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;198&lt;/td&gt;&lt;td&gt;9.43&lt;/td&gt;&lt;td&gt;5.56&lt;/td&gt;&lt;td&gt;4.13&lt;/td&gt;&lt;td&gt;3.61&lt;/td&gt;&lt;td&gt;3.43&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;30&lt;/td&gt;&lt;td&gt;509&lt;/td&gt;&lt;td&gt;296&lt;/td&gt;&lt;td&gt;223&lt;/td&gt;&lt;td&gt;199&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;189&lt;/td&gt;&lt;td&gt;8.67&lt;/td&gt;&lt;td&gt;5.00&lt;/td&gt;&lt;td&gt;3.74&lt;/td&gt;&lt;td&gt;3.26&lt;/td&gt;&lt;td&gt;3.10&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;20&lt;/td&gt;&lt;td&gt;466&lt;/td&gt;&lt;td&gt;276&lt;/td&gt;&lt;td&gt;212&lt;/td&gt;&lt;td&gt;183&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;174&lt;/td&gt;&lt;td&gt;8.03&lt;/td&gt;&lt;td&gt;4.59&lt;/td&gt;&lt;td&gt;3.41&lt;/td&gt;&lt;td&gt;2.95&lt;/td&gt;&lt;td&gt;2.80&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;10&lt;/td&gt;&lt;td&gt;391&lt;/td&gt;&lt;td&gt;240&lt;/td&gt;&lt;td&gt;187&lt;/td&gt;&lt;td&gt;168&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;160&lt;/td&gt;&lt;td&gt;6.09&lt;/td&gt;&lt;td&gt;3.76&lt;/td&gt;&lt;td&gt;3.10&lt;/td&gt;&lt;td&gt;2.70&lt;/td&gt;&lt;td&gt;2.56&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;5&lt;/td&gt;&lt;td&gt;319&lt;/td&gt;&lt;td&gt;213&lt;/td&gt;&lt;td&gt;169&lt;/td&gt;&lt;td&gt;151&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;143&lt;/td&gt;&lt;td&gt;4.98&lt;/td&gt;&lt;td&gt;3.28&lt;/td&gt;&lt;td&gt;2.65&lt;/td&gt;&lt;td&gt;2.31&lt;/td&gt;&lt;td&gt;2.19&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;The difference between males and females&lt;/h3&gt;

&lt;p&gt;This table shows the difference between the numbers for males and females at equivalent percentile ranks relative to the female numbers, so &amp;#8220;15%&amp;#8221; means the male number is 15% higher. Keep in mind that these numbers are based on the people who use Cycling Analytics, and aren&amp;#8217;t necessarily representative of the broader cycling community or people overall.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th colspan=&#34;4&#34;&gt;watts&lt;/th&gt;&lt;th colspan=&#34;4&#34; &gt;watts per kilogram&lt;/th&gt;&lt;/tr&gt;
&lt;tr class=&#34;header&#34;&gt;&lt;th class=&#34;border&#34;&gt;%&lt;/th&gt;&lt;th&gt;5s&lt;/th&gt;&lt;th&gt;1m&lt;/th&gt;&lt;th&gt;5m&lt;/th&gt;&lt;th class=&#34;border&#34;&gt;20m&lt;/th&gt;&lt;th&gt;5s&lt;/th&gt;&lt;th&gt;1m&lt;/th&gt;&lt;th&gt;5m&lt;/th&gt;&lt;th&gt;20m&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;95&lt;/td&gt;&lt;td&gt;45%&lt;/td&gt;&lt;td&gt;40%&lt;/td&gt;&lt;td&gt;31%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;23%&lt;/td&gt;&lt;td&gt;16%&lt;/td&gt;&lt;td&gt;15%&lt;/td&gt;&lt;td&gt;8%&lt;/td&gt;&lt;td&gt;6%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;90&lt;/td&gt;&lt;td&gt;46%&lt;/td&gt;&lt;td&gt;38%&lt;/td&gt;&lt;td&gt;28%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;26%&lt;/td&gt;&lt;td&gt;17%&lt;/td&gt;&lt;td&gt;14%&lt;/td&gt;&lt;td&gt;6%&lt;/td&gt;&lt;td&gt;5%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;80&lt;/td&gt;&lt;td&gt;41%&lt;/td&gt;&lt;td&gt;35%&lt;/td&gt;&lt;td&gt;27%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;25%&lt;/td&gt;&lt;td&gt;17%&lt;/td&gt;&lt;td&gt;14%&lt;/td&gt;&lt;td&gt;7%&lt;/td&gt;&lt;td&gt;4%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;70&lt;/td&gt;&lt;td&gt;42%&lt;/td&gt;&lt;td&gt;39%&lt;/td&gt;&lt;td&gt;28%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;24%&lt;/td&gt;&lt;td&gt;19%&lt;/td&gt;&lt;td&gt;14%&lt;/td&gt;&lt;td&gt;9%&lt;/td&gt;&lt;td&gt;4%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;60&lt;/td&gt;&lt;td&gt;45%&lt;/td&gt;&lt;td&gt;40%&lt;/td&gt;&lt;td&gt;31%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;25%&lt;/td&gt;&lt;td&gt;18%&lt;/td&gt;&lt;td&gt;12%&lt;/td&gt;&lt;td&gt;5%&lt;/td&gt;&lt;td&gt;1%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;50&lt;/td&gt;&lt;td&gt;47%&lt;/td&gt;&lt;td&gt;39%&lt;/td&gt;&lt;td&gt;32%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;28%&lt;/td&gt;&lt;td&gt;21%&lt;/td&gt;&lt;td&gt;10%&lt;/td&gt;&lt;td&gt;4%&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;40&lt;/td&gt;&lt;td&gt;53%&lt;/td&gt;&lt;td&gt;44%&lt;/td&gt;&lt;td&gt;36%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;32%&lt;/td&gt;&lt;td&gt;19%&lt;/td&gt;&lt;td&gt;10%&lt;/td&gt;&lt;td&gt;3%&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;30&lt;/td&gt;&lt;td&gt;56%&lt;/td&gt;&lt;td&gt;48%&lt;/td&gt;&lt;td&gt;37%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;31%&lt;/td&gt;&lt;td&gt;20%&lt;/td&gt;&lt;td&gt;15%&lt;/td&gt;&lt;td&gt;7%&lt;/td&gt;&lt;td&gt;4%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;20&lt;/td&gt;&lt;td&gt;53%&lt;/td&gt;&lt;td&gt;46%&lt;/td&gt;&lt;td&gt;35%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;33%&lt;/td&gt;&lt;td&gt;16%&lt;/td&gt;&lt;td&gt;14%&lt;/td&gt;&lt;td&gt;9%&lt;/td&gt;&lt;td&gt;5%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;10&lt;/td&gt;&lt;td&gt;54%&lt;/td&gt;&lt;td&gt;48%&lt;/td&gt;&lt;td&gt;40%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;32%&lt;/td&gt;&lt;td&gt;26%&lt;/td&gt;&lt;td&gt;19%&lt;/td&gt;&lt;td&gt;4%&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#34;border&#34;&gt;5&lt;/td&gt;&lt;td&gt;57%&lt;/td&gt;&lt;td&gt;52%&lt;/td&gt;&lt;td&gt;41%&lt;/td&gt;&lt;td class=&#34;border&#34;&gt;34%&lt;/td&gt;&lt;td&gt;26%&lt;/td&gt;&lt;td&gt;19%&lt;/td&gt;&lt;td&gt;8%&lt;/td&gt;&lt;td&gt;3%&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Overall, males have higher absolute power outputs, but this gap is narrowed when taking weight into consideration, when looking at longer efforts, and when looking at higher percentile levels. Notably, the median (50th percentile) twenty minute effort in watts per kilogram for males and females is exactly the same at 3.80W/kg, which means the average male and female Cycling Analytics user should be able to ride up a mountain at about the same speed.&lt;/p&gt;

&lt;h3&gt;How this compares with Andrew Coggan&amp;#8217;s chart&lt;/h3&gt;

&lt;p&gt;Andrew Coggan put together a &lt;a href=&#34;/blog/2012/06/watts-kg-on-the-power-curve&#34;&gt;widely used table of power outputs&lt;/a&gt; in watts per kilogram that males and females, from world class to untrained and everywhere in between, are typically able to achieve for five seconds, one minute, five minutes, and at FTP. What follows is this table overlaid with coloured lines representing each percentile level shown in the above tables. 95% of the twenty minute best effort is used for the FTP.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/cycling-power-table-overlayed.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;A few things stand out.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The five minute and FTP numbers are always better than the five second and one minute numbers. This might be because the chart was designed for all types of cyclists, including track cyclists, whereas Cycling Analytics users are generally road cyclists.&lt;/li&gt;
&lt;li&gt;People in the bottom 20% don&amp;#8217;t make it onto the table for five second and one second efforts. This might be because a number of people haven&amp;#8217;t uploaded rides where they have pushed themselves hard enough for these short durations. Or maybe the table overstates what is typically achieved at these levels.&lt;/li&gt;
&lt;li&gt;Female Cycling Analytics users at a given percentile level are consistently on a higher level than the males.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;There you go. I&amp;#8217;m not sure how to finish this other than by saying that I hope you found this informative.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Ideas, gears, and other things</div></title>
    <id>5ad6c2ba33373e000da343ee</id>
    <updated>2018-04-18T03:59:54.217000Z</updated>
    <published>2018-04-18T03:59:54.217000Z</published>
    <link href="/blog/2018/04/ideas-gears-and-other-things" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;There have been a number of updates recently.&lt;/p&gt;

&lt;p&gt;There is now an &lt;a href=&#34;/ideas&#34;&gt;ideas section&lt;/a&gt; for submitting new ideas for the site and voting on them. If you have any ideas for new things this site could do, or ideas for how existing features could be improved, feel free to submit them, and also vote on existing ideas that you are interested in. You can &amp;#8220;supervote&amp;#8221; on your favourite item, which is worth five points instead of the usual one. (You can only have one &amp;#8220;supervote&amp;#8221; at a time, but you can change which item you&amp;#8217;ve &amp;#8220;supervoted&amp;#8221; for.)&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/ideas.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Gear shifting data is now read from FIT files and this can be shown on the main ride chart and on the &lt;em&gt;Gear shifts&lt;/em&gt; chart near the bottom of the page. This chart shows the time spent in each gear, and a histogram of cadence for any gear.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/gears-chart.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;A ZIP file containing the original ride files of selected rides can now be downloaded from the rides table.&lt;/p&gt;

&lt;p&gt;Individual training plan sequences can be exported from the training plan library. This means it&amp;#8217;s possible to export, for example, an eight week plan as a CSV file, and then have another user import it and use it.&lt;/p&gt;

&lt;p&gt;Finally, the way rides are imported from Strava has been improved. The way the queue works has been improved, and the status of an import (the number of rides to be imported and how long it should take) is shown on the linked accounts page.&lt;/p&gt;

&lt;p&gt;By the way, if you would like to see Zwift be able to export directly to Cycling Analytics, &lt;a href=&#34;https://support.zwift.com/hc/en-us/community/posts/115000235403-Connect-Cycling-Analytics&#34;&gt;please consider voting on this&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Training plan sequences and zones on charts</div></title>
    <id>5a81a93bdba0ad000bdd773c</id>
    <updated>2018-02-12T14:48:27.208000Z</updated>
    <published>2018-02-12T14:48:27.208000Z</published>
    <link href="/blog/2018/02/training-plan-sequences-and-zones-on-charts" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;A couple of new features were added to Cycling Analytics today. The main one is the ability to create training plan sequences, which means a sequence of workouts can be saved to the training plan library that can then be added to athlete calendars. This can make creating training plans much simpler when there is repetition.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/training-plan-library-sequences.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;There are now two tabs in the training plan library. The first is for workouts, which is the only thing that has been in the training plan library until now. The second is for sequences. Sequences can be constructed in the training plan library, or copied from the calendar when the workouts on the calendar also exist in the plan library. For coaches, the calendar that workouts are copied from is the one for the athlete whose calendar they are looking at when they bring up the training plan library.&lt;/p&gt;

&lt;p&gt;Once added to the library, sequences are shown at the top of the list of training plans and can be drag-and-dropped onto the calendar, just like workouts. (And there&amp;#8217;s an undo button to make life easier if you accidentally add fifty plans starting on the wrong day.)&lt;/p&gt;

&lt;p&gt;The training plan library can be exported and imported as a CSV file. This makes it possible to export the library, edit it in Excel, use the &amp;#8220;delete all&amp;#8221; button, and import the edited version to make large scale changes to the library. It also means the library can be shared with another user. When this feature is used, workouts and sequences are both included in the one CSV file.&lt;/p&gt;

&lt;p&gt;Another new feature is that power and heart rate zones can now be displayed on the main ride chart, and power zones can be shown on the power curve chart.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/power-curve-zones.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;(I hit 1500W for the first time last week.)&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s all for now, but there&amp;#8217;s more to come.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Power history chart and other updates</div></title>
    <id>598bbe5177ad8b000b149625</id>
    <updated>2017-08-10T02:00:49.256000Z</updated>
    <published>2017-08-10T02:00:49.256000Z</published>
    <link href="/blog/2017/08/power-history-chart-and-other-updates" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;There have been a few noteworthy changes recently beyond the &lt;a href=&#34;/blog/2017/07/garmin-connect&#34;&gt;integration of Garmin Connect&lt;/a&gt;. In one sentence: The power history chart has been added, laps can now be edited, Garmin Connect users can choose to only have cycling activities imported, and there is an option for the calendar to show plan titles rather than ride titles when they&amp;#8217;re linked.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/power-history.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;The power history chart shows the best efforts and how they vary over time. By default, it shows the best three five minute efforts (in terms of average power) for each month. It&amp;#8217;s quite flexible and isn&amp;#8217;t hard to configure to show, for example, the best five efforts of ten minutes for each 60 day period.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s now possible to edit laps. This can be done with the &amp;#8220;edit ride&amp;#8221; page. New laps can be added, unwanted laps can be deleted, and lap times can be adjusted.&lt;/p&gt;

&lt;p&gt;There is now an option to only import cycling activities with Garmin Connect. This option is found on the &amp;#8220;linked accounts&amp;#8221; page. When used, Cycling Analytics ignores FIT files coming from Garmin Connect that are tagged as anything other than cycling, such as running and golf. (Someday, Cycling Analytics will be able to properly handle other activity types.)&lt;/p&gt;

&lt;p&gt;Finally, there is a new option for the calendar to always show the plan title rather than the ride title when a ride is linked with a plan. This is most useful for coaches, because they are often more interested in seeing the plan titles. When this option is used, plan titles are only shown on the calendar, and the ride title is still used in other places like the rides table, analysis charts, and ride pages.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="https://www.cyclinganalytics.com/blog/feed">
    <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Garmin Connect</div></title>
    <id>59770063d17283000b0838e5</id>
    <updated>2017-07-25T08:25:07.667000Z</updated>
    <published>2017-07-25T08:25:07.667000Z</published>
    <link href="/blog/2017/07/garmin-connect" />
    <author>
      <name>David Johnstone</name>
    </author>
    <content type="html">&lt;p&gt;Cycling Analytics now works with Garmin Connect. Rides uploaded to Garmin Connect are automatically imported to Cycling Analytics when users link their Cycling Analytics accounts with their Garmin Connect accounts. Many Garmin devices are able to automatically import activities to Garmin Connect, making this a very easy way to get rides into Cycling Analytics.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/cyclinganalytics/static/garmin-connect.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;To use this, head over to the Linked Accounts page and click the &amp;#8220;Connect&amp;#8221; button for Garmin Connect. Once this process is completed, rides will be automatically imported to Cycling Analytics.&lt;/p&gt;

&lt;p&gt;Note that the first time a new ride is added to Garmin Connect after linking accounts, this ride and all others from the previous thirty days will be imported into Cycling Analytics. This may result in duplicates, especially if rides were imported from Strava. If so, these can be easily deleted from the rides table.&lt;/p&gt;
</content>
  </entry>
</feed>
