Add files via upload
This commit is contained in:
1 parent
15fc371ddd
commit
709fd15e8c
1 file changed
+101
-38
+101
-38
@@ -8,7 +8,12 @@
|
||||
"\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, `X` holding the number of feet of climbing per mile for each ride, and `Y` holding the speed in miles per hour for each corresponding ride. (Notice that I only keep rides longer than 30 miles, so these should all be at a similar level of seriousness.)"
|
||||
"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:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -17,8 +22,20 @@
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x115deb278>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%matplotlib inline\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import numpy as np\n",
|
||||
"import csv\n",
|
||||
@@ -26,21 +43,24 @@
|
||||
"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",
|
||||
"def getcsv(fname): return [r for r in csv.reader(open(fname)) if miles(r[0]) > 30]\n",
|
||||
"\n",
|
||||
"# A file with three fields per line: distance (m), climb (m), elapsed time (sec)\n",
|
||||
"data = getcsv('dist-climb-time.csv') \n",
|
||||
"X = [feet(climb) / miles(dist) for (dist, climb, time) in data]\n",
|
||||
"Y = [miles(dist) / hours(time) for (dist, climb, time) in data]"
|
||||
"# 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))\n",
|
||||
"\n",
|
||||
"plt.plot(X, Y, 'o');"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now I'll plot `X` versus `Y`, along with a best-fit polynomial to the points.\n",
|
||||
"(I use a polynomial of degree two because the raw data looks like a curve, not a straight line,\n",
|
||||
"and because a cubic polynomial seems like too many degress of freedom for y noisy data.)"
|
||||
"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:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -52,45 +72,34 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x116d67eb8>"
|
||||
"<matplotlib.figure.Figure at 0x119d56550>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" 0 ft/mile: 13.8 mph\n",
|
||||
" 20 ft/mile: 13.8 mph\n",
|
||||
" 40 ft/mile: 13.5 mph\n",
|
||||
" 60 ft/mile: 13.0 mph\n",
|
||||
" 80 ft/mile: 12.1 mph\n",
|
||||
"100 ft/mile: 11.0 mph\n",
|
||||
"120 ft/mile: 9.6 mph\n",
|
||||
"140 ft/mile: 7.8 mph\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def poly(X, Y, n):\n",
|
||||
" \"Return best degree-n polynomial to fit X, Y data.\"\n",
|
||||
" \"Best-fit degree-n polynomial for X, Y data.\"\n",
|
||||
" 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",
|
||||
"def show(X, Y, grades=range(0, 141, 20), degree=2): \n",
|
||||
" plt.plot(X, Y, '+')\n",
|
||||
" F = poly(X, Y, degree)\n",
|
||||
" plt.plot(grades, [F(x) for x in grades], '-')\n",
|
||||
" plt.ylabel('speed in miles per hour')\n",
|
||||
" plt.xlabel('grade in feet per mile')\n",
|
||||
" plt.grid()\n",
|
||||
" plt.show()\n",
|
||||
" for g in grades:\n",
|
||||
" print('{:3} ft/mile: {:4.1f} mph'.format(g, F(g)))\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",
|
||||
" plt.rcParams[\"figure.figsize\"] = (10, 6)\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], 'o')\n",
|
||||
" plt.ylabel('Speed (mph)')\n",
|
||||
" plt.xlabel('Grade (feet/mile)')\n",
|
||||
" plt.minorticks_on()\n",
|
||||
" plt.grid(True, which='major')\n",
|
||||
" plt.grid(True, which='minor', alpha=0.2)\n",
|
||||
" \n",
|
||||
"show(X, Y) "
|
||||
]
|
||||
@@ -99,7 +108,61 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So, it looks like I go 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 140 ft/mile, I'm down to 7.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."
|
||||
"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 140 ft/mile, I'm down around 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.\n",
|
||||
"\n",
|
||||
"I can use the polynomial `F` to estimate the duration of a route:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def duration(dist, climb, F=F):\n",
|
||||
" \"Given a distance in miles and total climb in feet, return estimated time in minutes.\"\n",
|
||||
" return dist / F(climb / dist) * 60"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"For example, to get to Pescadero, I can take the flatter coast route, or follow the creek, saving 4 miles of distance, but adding 300 ft of climbing:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(157.39103492491944, 149.35787723449531, 8.0331576904241331)"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"coast = duration(33.4, 2201)\n",
|
||||
"creek = duration(29.4, 2520)\n",
|
||||
"\n",
|
||||
"coast, creek, coast - creek"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The coast route takes about 8 minutes longer. Good to know, but other factors are probably more important in making the choice."
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
Reference in new issue
Block a user