Add files via upload
This commit is contained in:
1 parent
163b4c5f26
commit
624ee1496d
1 file changed
+228
-52
@@ -4,51 +4,71 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div align=\"right\"><i>Peter Norvig, 23 Oct, 2017</i></div>\n",
|
||||
"\n",
|
||||
"# Bike Speed versus Grade\n",
|
||||
"\n",
|
||||
"Like most people, I bike slower when I'm going up a steep hill than on a flat road. But how much slower?\n",
|
||||
"To answer that, I downloaded data on my past rides \n",
|
||||
"from [Strava](https://www.strava.com/athletes/575579) and manipulated the `data` to create two lists: \n",
|
||||
"\n",
|
||||
"- `X`: the *grade* of each ride, in feet of ascent per mile. \n",
|
||||
"- `Y`: the *speed* of each (corresponding) ride, in miles per hour.\n",
|
||||
"\n",
|
||||
"I omit rides shorter than 30 miles, because on some short rides I was sprinting at an unsustainable speed, and on others I was slowed by city traffic. Here is the code to collect and plot the X:Y data:"
|
||||
"To answer that, I downloaded all my recorded past rides \n",
|
||||
"on [Strava](https://www.strava.com/athletes/575579) that are longer than 20 miles, out them into a text file `\"bikerides20.txt\"`, and wrote code to parse the file:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"%matplotlib inline\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import numpy as np\n",
|
||||
"import csv\n",
|
||||
"from collections import namedtuple\n",
|
||||
"\n",
|
||||
"def hours(sec): return float(sec) / 60 / 60\n",
|
||||
"def feet(meters): return float(meters) * 100 / 2.54 / 12\n",
|
||||
"def miles(meters): return feet(meters) / 5280\n",
|
||||
"line = 'Ride\tThu, 8/9/2018\tBRNW\t4:58:07\t68.41 mi\t3,862 ft\t' # Sample line\n",
|
||||
"\n",
|
||||
"# Read data file with three fields: distance (m), climb (m), elapsed time (sec)\n",
|
||||
"X, Y = [], []\n",
|
||||
"for (dist, climb, time) in csv.reader(open('dist-climb-time.csv')):\n",
|
||||
" if miles(dist) > 30:\n",
|
||||
" X.append(feet(climb) / miles(dist))\n",
|
||||
" Y.append(miles(dist) / hours(time))"
|
||||
"Ride = namedtuple('Ride', 'date, title, hours, miles, feet')\n",
|
||||
"\n",
|
||||
"def parse_ride(line) -> Ride:\n",
|
||||
" \"Turn a line (such as `sample`) in a Strava datafile into a `Ride`.\"\n",
|
||||
" _, date, title, time, mi, ft = line.strip().split('\\t')\n",
|
||||
" times = map(int, time.split(':')[::-1])\n",
|
||||
" miles = float(mi.split()[0])\n",
|
||||
" feet = int(ft.split()[0].replace(',', ''))\n",
|
||||
" return Ride(date, title, hours(*times), miles, feet)\n",
|
||||
"\n",
|
||||
"def hours(sec, min, hour=0): return hour + min / 60 + sec / 3600\n",
|
||||
"\n",
|
||||
"all_rides = {parse_ride(line) for line in open('bikerides20.txt')}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"For some of the rides, the GPS was not recording elevation, so the feet field is 0. Let's eliminate those, and let's collect two vectors of numbers: one for miles per hour, and one for feet climbed per hour, and plot them:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Kept 583 out of 609 rides\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x105166cc0>"
|
||||
"<matplotlib.figure.Figure at 0x110651668>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -56,28 +76,33 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plt.plot(X, Y, 'o');"
|
||||
"rides = [r for r in all_rides if r.feet > 0]\n",
|
||||
"mph = [r.miles / r.hours for r in rides]\n",
|
||||
"fpm = [r.feet / r.miles for r in rides]\n",
|
||||
"\n",
|
||||
"plt.plot(fpm, mph, '.')\n",
|
||||
"print('Kept', len(rides), 'out of', len(all_rides), 'rides')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"As expected, the speeds get slower as the grade gets steeper. The data has a lot of variance, and I can say that it \n",
|
||||
"looks more like a curve than a straight line, so I'll fit a cubic (degree two) polynomial to the data,\n",
|
||||
"and make the plot prettier:"
|
||||
"As expected, there is a lot of variance, but overall speeds get slower as the grade gets steeper. Just eyeballing it, it looks like a curve would be a better fit than a straight line, so I'll fit a cubic (degree two) polynomial to the data, and make the plot prettier:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x10b1d1390>"
|
||||
"<matplotlib.figure.Figure at 0x119e6f860>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -90,40 +115,39 @@
|
||||
" C = np.polyfit(X, Y, n)[::-1] # Array of coefficients, reversed\n",
|
||||
" return lambda x: sum(C[i] * x ** i for i in range(n + 1)) \n",
|
||||
"\n",
|
||||
"F = poly(X, Y, 2) # defines y = F(x); x in ft/mile, y in mph\n",
|
||||
"\n",
|
||||
"def show(X, Y, F=F): \n",
|
||||
"def show(X, Y, xlabel='Grade (feet/mile)', ylabel='Speed (mph)', fit=True): \n",
|
||||
" F = poly(X, Y, 2)\n",
|
||||
" plt.rcParams[\"figure.figsize\"] = (12, 8)\n",
|
||||
" plt.style.use('fivethirtyeight')\n",
|
||||
" plt.plot(X, Y, 'o')\n",
|
||||
" X1 = list(range(int(max(X))))\n",
|
||||
" plt.plot(X1, [F(x) for x in X1], '-')\n",
|
||||
" plt.ylabel('Speed (mph)')\n",
|
||||
" plt.xlabel('Grade (feet/mile)')\n",
|
||||
" plt.plot(X, Y, '.')\n",
|
||||
" X1 = list(range(int(min(X)), int(max(X)) + 5))\n",
|
||||
" if fit: plt.plot(X1, [F(x) for x in X1], '-')\n",
|
||||
" plt.ylabel(ylabel); plt.xlabel(xlabel)\n",
|
||||
" plt.minorticks_on()\n",
|
||||
" plt.grid(True, which='major')\n",
|
||||
" plt.grid(True, which='minor', alpha=0.4)\n",
|
||||
" plt.title('Average speed vs Grade on {} rides'.format(len(X)))\n",
|
||||
" \n",
|
||||
"show(X, Y) "
|
||||
" \n",
|
||||
"show(fpm, mph) "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So, I average about 14 mph when the road is fairly flat, with a lot of variability from 12 to 16 mph, depending more on my level of effort than on the grade of the road. But from 60 ft/mile and up, speed falls off quickly at 1 mph for every 20 ft/mile, and by 120 ft/mile, I'm down around 10 mph, and 8.5mph at 140 ft/mile. Note that 140 ft/mile is only 2.7% grade, but if you figure a typical route is 1/3 up, 1/3 down, and 1/3 flat-ish, then that's 8% grade on the up part.\n",
|
||||
"So, I average a little under 14 mph when the overall route is fairly flat, with a lot of variability from 12 to 16 mph, depending more on my level of effort than on the grade of the road. But from 40 ft/mile and up, speed falls off quickly, and by 140 ft/mile, I'm down under 8 mph. Note that 140 ft/mile is only 2.7% grade, but if you figure a typical route is 1/3 up, 1/3 down, and 1/3 flatish, then that's 8% grade on the up part (which is at least 7 miles).\n",
|
||||
"\n",
|
||||
"I can use the polynomial `F` to estimate the duration of a route:"
|
||||
"I can use the `poly` function to estimate the duration of a route:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def duration(dist, climb, F=F):\n",
|
||||
"def duration(dist, climb, F=poly(fpm, mph, 2)):\n",
|
||||
" \"Given a distance in miles and total climb in feet, return estimated time in minutes.\"\n",
|
||||
" return dist / F(climb / dist) * 60"
|
||||
]
|
||||
@@ -132,18 +156,20 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"For example, to get to Pescadero from La Honda, I could take the flatter [coast route](https://www.google.com/maps/dir/La+Honda,+California/Pescadero,+California/@37.2905834,-122.3896683,12z/data=!4m19!4m18!1m10!1m1!1s0x808faed4dc6265bd:0x51a109d3306a7219!2m2!1d-122.274227!2d37.3190255!3m4!1m2!1d-122.4039496!2d37.3116594!3s0x808f062b7d7585e7:0x942480c22f110b74!1m5!1m1!1s0x808f00b4b613c4c1:0x43c609077878b77!2m2!1d-122.3830152!2d37.2551636!3e1), or the shorter [creek route](https://www.google.com/maps/dir/La+Honda,+California/Pescadero,+California/@37.2905834,-122.3896683,12z/data=!4m19!4m18!1m10!1m1!1s0x808faed4dc6265bd:0x51a109d3306a7219!2m2!1d-122.274227!2d37.3190255!3m4!1m2!1d-122.3658887!2d37.2538867!3s0x808f00acf265bd43:0xb7e2a0c9ee355c3a!1m5!1m1!1s0x808f00b4b613c4c1:0x43c609077878b77!2m2!1d-122.3830152!2d37.2551636!3e1):"
|
||||
"For example, to get to Pescadero from La Honda, I could take the flatter [coast route](https://www.google.com/maps/dir/La+Honda,+California/Pescadero,+California/@37.2905834,-122.3896683,12z/data=!4m19!4m18!1m10!1m1!1s0x808faed4dc6265bd:0x51a109d3306a7219!2m2!1d-122.274227!2d37.3190255!3m4!1m2!1d-122.4039496!2d37.3116594!3s0x808f062b7d7585e7:0x942480c22f110b74!1m5!1m1!1s0x808f00b4b613c4c1:0x43c609077878b77!2m2!1d-122.3830152!2d37.2551636!3e1), or the shorter [creek route](https://www.google.com/maps/dir/La+Honda,+California/Pescadero,+California/@37.2905834,-122.3896683,12z/data=!4m19!4m18!1m10!1m1!1s0x808faed4dc6265bd:0x51a109d3306a7219!2m2!1d-122.274227!2d37.3190255!3m4!1m2!1d-122.3658887!2d37.2538867!3s0x808f00acf265bd43:0xb7e2a0c9ee355c3a!1m5!1m1!1s0x808f00b4b613c4c1:0x43c609077878b77!2m2!1d-122.3830152!2d37.2551636!3e1); which is faster?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"6.2641828504384378"
|
||||
"(69.426193865785734, 61.816569346397067)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
@@ -152,17 +178,167 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"coast = duration(15.7, 344)\n",
|
||||
"creek = duration(13.5, 735)\n",
|
||||
"\n",
|
||||
"coast - creek"
|
||||
"duration(15.7, 344), duration(13.5, 735)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This says the coast route takes 6.7 minutes longer. Good to know, but other factors are probably more important in making the choice."
|
||||
"This suggests the coast route takes 7 or 8 minutes longer. Good to know, but other factors (like the scenery) are probably more important in making the choice.\n",
|
||||
"\n",
|
||||
"# Eddington Number\n",
|
||||
"\n",
|
||||
"> *Your [Eddington Number](https://www.triathlete.com/2011/04/training/measuring-bike-miles-eddington-number_301789) is the largest integer **m** for which you have bicycled **m** or more miles on **m** different days.*\n",
|
||||
"\n",
|
||||
"Let's calculate mine, and see how many rides I need to take to improve it. I'm pretty sure I've done at least 50 rides of 50 miles, so:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{50: -17,\n",
|
||||
" 51: -5,\n",
|
||||
" 52: 0,\n",
|
||||
" 53: 3,\n",
|
||||
" 54: 7,\n",
|
||||
" 55: 10,\n",
|
||||
" 56: 12,\n",
|
||||
" 57: 16,\n",
|
||||
" 58: 20,\n",
|
||||
" 59: 26,\n",
|
||||
" 60: 28,\n",
|
||||
" 61: 34,\n",
|
||||
" 62: 37,\n",
|
||||
" 63: 40,\n",
|
||||
" 64: 43,\n",
|
||||
" 65: 45,\n",
|
||||
" 66: 47,\n",
|
||||
" 67: 51,\n",
|
||||
" 68: 52,\n",
|
||||
" 69: 56,\n",
|
||||
" 70: 57}"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"{m: m - sum(r.miles > m for r in rides)\n",
|
||||
" for m in range(50, 71)}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The entry `{52: 0}` means **my Eddington Number is 52**: I've done 52 rides of 52 miles or more (at least of the ones that were recorded by Strava). I'd need only 3 rides of 53 miles to add one to my number, but I'd need a whopping 57 rides of 70 miles or more to get my number up to 70. Let's look at my distribution of ride distances, for my 40+ mile rides:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x119e0d9b0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"X = range(40, 101)\n",
|
||||
"M = [min(X), max(X)]\n",
|
||||
"plt.plot(M, M, '-')\n",
|
||||
"show(X, [sum(r.miles > x for r in rides) for x in X], fit=False,\n",
|
||||
" xlabel='Ride Distance (miles)', ylabel='Number of Rides longer than x miles')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here the gap between the straight line and the dotted line is my Eddington gap: the lines cross at 52 so that's my Eddington Number; at 60 miles the gap is 28.\n",
|
||||
"\n",
|
||||
"## Metric Eddington Number\n",
|
||||
"\n",
|
||||
"[Arthur Eddington](https://en.wikipedia.org/wiki/Arthur_Eddington) was born in 19th century England, so he used miles. You can get a more impressive number with your **metric** Eddington Number:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{70: -22,\n",
|
||||
" 71: -17,\n",
|
||||
" 72: -12,\n",
|
||||
" 73: -5,\n",
|
||||
" 74: -1,\n",
|
||||
" 75: 2,\n",
|
||||
" 76: 4,\n",
|
||||
" 77: 6,\n",
|
||||
" 78: 9,\n",
|
||||
" 79: 11,\n",
|
||||
" 80: 13,\n",
|
||||
" 81: 17,\n",
|
||||
" 82: 26,\n",
|
||||
" 83: 28,\n",
|
||||
" 84: 33,\n",
|
||||
" 85: 35,\n",
|
||||
" 86: 37,\n",
|
||||
" 87: 40,\n",
|
||||
" 88: 42,\n",
|
||||
" 89: 44,\n",
|
||||
" 90: 46}"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def kms(ride): return ride.miles * 1.60934\n",
|
||||
"\n",
|
||||
"{m: m - sum(kms(r) > m for r in rides)\n",
|
||||
" for m in range(70, 91)}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"My metric Eddington Number is 74, and I only need 13 rides of 80 km (50 miles) to get to 80.\n",
|
||||
"\n",
|
||||
"# H-Index\n",
|
||||
"\n",
|
||||
"Inspired by the [h-index](https://en.wikipedia.org/wiki/H-index) for scientific publications (and indirectly by Eddington), I invented a new h-index, or hill-index:\n",
|
||||
"\n",
|
||||
"> *Your **h-index** is the largest integer **h** for which you can persistently and repeatedly climb an **h** percent grade at **h** miles per hour.*\n",
|
||||
"\n",
|
||||
"My h-index is 6, because I regularly climb a 6% grade at 6 miles per hour or more, but I only occasionally climb a 7% grade at 7 mph. What's yours?"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -182,7 +358,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.5.3"
|
||||
"version": "3.6.0"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
Reference in new issue
Block a user