Add files via upload
This commit is contained in:
1 parent
9ecb5479f8
commit
1697ee1c43
1 file changed
+54
-96
@@ -9,8 +9,8 @@
|
||||
"# 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 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:"
|
||||
"To answer that, I downloaded all my recorded past rides longer than 20 miles as ([bikerides20.txt](bikerides20.txt)). (I started recording using \n",
|
||||
"[Strava](https://www.strava.com/athletes/575579) in mid-2013, but didn't use it across all rides until 2015). Here I parse the file:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -28,17 +28,17 @@
|
||||
"\n",
|
||||
"line = 'Ride\tThu, 8/9/2018\tBRNW\t4:58:07\t68.41 mi\t3,862 ft\t' # Sample line\n",
|
||||
"\n",
|
||||
"Ride = namedtuple('Ride', 'date, title, hours, miles, feet')\n",
|
||||
"Ride = namedtuple('Ride', 'miles, feet, kind, date, title, hours')\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",
|
||||
" \"Parse a line from a Strava datafile into a `Ride`.\"\n",
|
||||
" kind, date, title, time, mi, ft = line.strip().split('\\t')\n",
|
||||
" times = [int(t) for t in reversed(time.split(':'))]\n",
|
||||
" miles = float(mi.split()[0])\n",
|
||||
" feet = int(ft.split()[0].replace(',', ''))\n",
|
||||
" return Ride(date, title, hours(*times), miles, feet)\n",
|
||||
" return Ride(miles, feet, kind, date, title, hours(*times))\n",
|
||||
"\n",
|
||||
"def hours(sec, min, hour=0): return hour + min / 60 + sec / 3600\n",
|
||||
"def hours(sec, min, hour=0): return sec / 3600 + min / 60 + hour\n",
|
||||
"\n",
|
||||
"all_rides = {parse_ride(line) for line in open('bikerides20.txt')}"
|
||||
]
|
||||
@@ -47,7 +47,7 @@
|
||||
"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:"
|
||||
"I'm interested in my \"serious\" rides, so I'll focus on `rides` that are at least a marathon (26 miles) in length, and for those rides collect three vectors of numbers: miles per hour, feet climbed per mile, and total miles:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -57,18 +57,11 @@
|
||||
"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 0x110651668>"
|
||||
"<matplotlib.figure.Figure at 0x1037d2c88>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -76,19 +69,19 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"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",
|
||||
"rides = [r for r in all_rides if r.miles > 26]\n",
|
||||
"mph = [r.miles / r.hours for r in rides]\n",
|
||||
"fpm = [r.feet / r.miles for r in rides]\n",
|
||||
"mls = [r.miles for r in rides]\n",
|
||||
"\n",
|
||||
"plt.plot(fpm, mph, '.')\n",
|
||||
"print('Kept', len(rides), 'out of', len(all_rides), 'rides')"
|
||||
"plt.scatter(fpm, mph);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"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:"
|
||||
"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 quadratic (degree two) polynomial to the data, and make the plot prettier:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -100,9 +93,9 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAJ9CAYAAAAxAj0/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8U3WeP/5XmqQX2jQt5VakLUXKpYoDKANyFQe5KAiK\njBfc0VFZZVTGfazzHdllcHSYZXbWndmfssP4xfmtujCusqOIymUGQRQQ5KYgRSi2pJRbbzRN07RN\n03z/iCm5nHNykpyTnCSv5+PRh5gm5/M553Paft7n8/m8P7rm5mY3iIiIiIiINCIt3hUgIiIiIiLy\nxSCFiIiIiIg0hUEKERERERFpCoMUIiIiIiLSFAYpRERERESkKQxSiIiIiIhIUxikEBERERGRpjBI\nISIiIiIiTWGQEobKykrVy7BarQlfRizOgW2hrTLYHtoqg+2hrTLYHto4PsC20FoZbA9tlaG19mCQ\nQkREREREmsIghYiIiIiINIVBChERERERaQqDFCIiIiIi0hRDvCugtERf2OdwOFQ9fizKiMU5AGwL\nLZUBsD20VAbA9tBSGQDbQwvH92JbaKcMgO2hpTKA2LaH2WyWfG/SBSmhTjgadXV1qh7fKxnKUPv4\nbAttlcH20FYZbA9tlcH20M7x2RbaKoPtoa0ytNYenO5FRERERESawiCFiIiIiIg0hUEKERERERFp\nCoMUIiIiIiLSFAYpRERERESkKQxSiIiIiIhIUxikEBERERGRpjBIISIiIiIiTWGQQkREREREmsIg\nhYiIiIiINIVBChERERERaQqDFCIiIiIi0hQGKUREREREpCkMUoiIiIiISFMYpBARERERkaYY4l0B\nIoo9i82JVUdsuNjmQmEvPVaMNaHEZIx3tYiIiIgAMEghSjkWmxMLtjei2ubqee1QfSc2zSpgoEJE\nRESawOleRClm1RGbX4ACANU2F1YdscWpRkRERET+GKQQpZiLbS7B1y+JvE5EREQUawxSiFJMYS+9\n4OsDRF4nIiIiijUGKUQpZsVYE0pN/gFJqcmzeJ6IiIhIC7hwnijFlJiM2DSrAKuO2HCpzYUBzO5F\nREREGsMghSgFlZiMWDetd7yrQURERCSI072IiIiIiEhTGKQQEREREZGmJN10L6vVmtDHdzgcqh4/\nFmXE4hwAtoWWygDYHloqA2B7aKkMgO2hheN7sS20UwbA9tBSGUBs28NsNku+N+mClFAnHI26ujpV\n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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x119e6f860>"
|
||||
"<matplotlib.figure.Figure at 0x10cfa0780>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -116,16 +109,17 @@
|
||||
" return lambda x: sum(C[i] * x ** i for i in range(n + 1)) \n",
|
||||
"\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.rcParams[\"figure.figsize\"] = (12, 10)\n",
|
||||
" plt.style.use('fivethirtyeight')\n",
|
||||
" plt.plot(X, Y, '.')\n",
|
||||
" plt.scatter(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",
|
||||
" if fit: \n",
|
||||
" F = poly(X, Y, 2)\n",
|
||||
" plt.plot(X1, [F(x) for x in X1], 'k-')\n",
|
||||
" \n",
|
||||
"show(fpm, mph) "
|
||||
]
|
||||
@@ -134,9 +128,11 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"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",
|
||||
"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 around 40 or 50 ft/mile, speed falls off quickly, and by 140 ft/mile, I'm down near 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 `poly` function to estimate the duration of a route:"
|
||||
"# Estimating Duration\n",
|
||||
"\n",
|
||||
"For a route with a given distance and elevation, how long will it take to ride it?"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -149,7 +145,7 @@
|
||||
"source": [
|
||||
"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"
|
||||
" return 60 * dist / F(climb / dist)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -169,7 +165,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(69.426193865785734, 61.816569346397067)"
|
||||
"(68.914878773787706, 62.368854685107713)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
@@ -189,7 +185,7 @@
|
||||
"\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",
|
||||
"> *Your [Eddington Number](https://www.triathlete.com/2011/04/training/measuring-bike-miles-eddington-number_301789) is the largest integer **e** for which you have bicycled **e** or more miles on **e** 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:"
|
||||
]
|
||||
@@ -204,27 +200,7 @@
|
||||
{
|
||||
"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}"
|
||||
"52"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
@@ -233,15 +209,17 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"{m: m - sum(r.miles > m for r in rides)\n",
|
||||
" for m in range(50, 71)}"
|
||||
"def eddington(distances):\n",
|
||||
" return max(e for e, d in enumerate(sorted(distances, reverse=True), 1) if d >= e)\n",
|
||||
"\n",
|
||||
"eddington(mls)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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:"
|
||||
"So **my Eddington Number is 52**: I've done 52 rides of 52 miles or more. Let's see a plot of how far I have to go to improve this number:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -253,9 +231,9 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAKSCAYAAADWEJRoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8E3X6B/DPJJmUUnpwFrBQriIgl6ByU67SItBSShJc\nFFbXVRFdcRVdXERFXJBlPWFZr996ANr0tJSrXCoioFA5FEHOCgi0HE1Lr0yS+f2RbaW2TVKaJpP2\n83699vX7MfPkyTN5CPbpzHdGyM/Pl0FERERERKQQKm8XQEREREREdCMOKUREREREpCgcUoiIiIiI\nSFE4pBARERERkaJwSCEiIiIiIkXhkEJERERERIrCIYWI6AY5OTkICQnB7NmzXX7NmjVrEBISgjVr\n1lTa3qdPH/Tp08fdJZKXLVmypNp+ExGR+3BIISKfFxIS4vR/O3fu9HaZHtWnTx+EhIR4u4xqlQ+C\nISEhiIyMhCxX/7iu7t27K/YYGrPyv1vV/a979+5V4k+ePIk333wTcXFx6N27N1q3bo2uXbsiISEB\nGzZs8MIREJEv0Hi7ACIid3n22Wdr3NexY0cPVmKXkZHh8ff0NQcPHsRnn32Ge+65x9ulUC1V931r\n1qxZlW2vvPIKUlNTERERgdGjR6NVq1bIyclBZmYmtm3bhscffxwvv/yyJ0omIh/CIYWIGoz58+d7\nu4RKOnfu7O0SFC0sLAx5eXlYvHgx4uLi0LRpU2+XRLXg6vdtzJgxePzxx3H77bdX2n7kyBHExMTg\n7bffRkJCAvr3718fZRKRj+LlXkTUKBUWFuK5555Dr169EBoaijvvvBMrVqyo8dIjADh16hRmzZqF\n8PBwtG/fHuPHj8fmzZtrjK9uTUr5+pUlS5bg0KFD0Ov16NixI9q1a4e7774be/furTbXxYsX8eij\nj6Jbt25o27Ythg8fjrVr12Lnzp0V+YDfLqU6e/YsgMqXwk2cOLFSzkOHDuGPf/wjIiIi0Lp1a9x2\n22147LHHcObMmSrvf+M6jK+++goTJ05EWFgYOnToAL1ej2PHjtX4OdSkbdu2eOSRR3D+/HmsWLHC\npdf8/nh/b+LEiVUuESt/zezZs3H69GnMnDkTnTt3RlhYGOLj43HkyBEAwOXLl/HEE0+gR48eCA0N\nxahRo/DVV185rGfjxo2IiopC+/bt0alTJ/zxj3/E6dOnq40tLS3F22+/jcjISNxyyy1o3749Ro0a\nhf/7v/+r8veuvI8TJ07EhQsXMGfOHNx6661o0aIFMjMzXfqslOLee++tMqAAQK9evRAfHw8Aje5y\nTCJyjmdSiKjRKSsrQ1xcHLKzs9GrVy/odDoUFBRg+fLl2LVrV7WvOXnyJKKionD16lWMGzcOffv2\nxenTpzFjxgyMGzeu1jUcOHAAb731Fu68807MnDkT586dQ0ZGBuLi4rBz505ERERUxObl5SEqKgpn\nz57FkCFDMHjwYFy6dAlPP/00Ro8eXSlvcHAwnn32WaxatQoFBQWVLsm58ZK3LVu24N5774XVasXk\nyZPRuXNn/Pjjj1i9ejUyMzORkZGBvn37Vql78+bN2LBhA8aNG4f7778fx44dQ1ZWFrKzs7F37160\nbNmyVp/DX//6V6xevRpvvfUWZs2ahdDQ0Fq9vjZ++eUXjB07FrfddhtmzJiBY8eOYcuWLZg8eTKy\nsrKQkJCA5s2bIz4+HhcvXkR6ejp0Oh327duHDh06VMm3bt06bN26FZMnT8aIESNw6NAhpKenY+fO\nncjKykLXrl0rYgsLCzFlyhTs378fffv2xR/+8AcAwLZt2/DXv/4V3333HVatWlXlPa5du4aoqCgE\nBQUhLi4OsiyjefPm9fYZ1UZqairOnDkDPz8/9OrVC8OHD4coirXKUR6v0fDHESKqjP8qEFGDUdNv\n14HKl6asWLEC2dnZuPvuu7F69WqoVPaTyk8++SRGjRpV7euffvppXL16FS+//DIef/zxiu2bNm3C\n9OnTa13r5s2bsXLlSsyYMaNi23//+188+eST+M9//oN//etfFdtfeuklnD17FnPmzMErr7xSsX32\n7NkYO3ZspbwhISGYP38+1q5di4KCgmovySkqKsIjjzwCSZKQnp6OkSNHVuz7+OOP8Ze//AWPPPII\ndu3aBUEQKr12/fr1SE1NRWRkZKX6Xn/9daxevRpPPPFErT6H4OBg/O1vf8O8efOwePFivP3227V6\nfW3s2rWrSv+eeOIJfPTRRxg7diwMBgOWLl1accy9e/fGyy+/jH//+9/V/t3atGkTEhMTER0dXbHt\n7bffxvPPP4958+YhNTW1Yvtzzz2H/fv348UXX8TcuXMrtpeVleG+++7Dp59+itjYWEyYMKHSexw5\ncgQGgwErV650+Qf5/Pz8agceR4YPH44RI0bU6jUPPPBApT+HhYVhxYoVNX6Hfs9kMiEjIwMqlQpj\nxoyp1XsTUcPHIYWIGoxXX321xn03/rC+Zs0aCIKAl156qWJAAexnGh5++OEqP5CeP38eO3bsQFhY\nWJVbE8fExGDEiBG1vlxl8ODBlQYUwH5ZzLx587B///6KbWazGSkpKQgMDMQzzzxTKb5Pnz6YPn06\nPv7441q99/r163HlyhVMmTKl0oACADNnzsQHH3yAgwcP4rvvvsNdd91VaX9CQkKlAQUAZs2ahddf\nf71S3bVx//3347333sOaNWvw8MMPo3fv3jeVx5nw8HDMmTOn0jaDwYCPPvoIkiRh4cKFlYYyvV6P\nl19+GYcPH64238iRIysNKIB9cHznnXewfft2/Prrr2jfvj2uXbuGTz/9FH379q00oACAn58fFi5c\niKysLCQmJlYZUrRaLRYvXlyrMw0mk8nhd6Emrg4pM2bMwJAhQ9CzZ080a9YMZ86cwXvvvYcPP/wQ\nBoMBmzdvdrq+xGazYc6cOcjNzcWf//xn3HrrrbWul4gaNg4pRNRg5OfnO40pLCzEqVOn0LZt20qX\nVJUbNmxYlW2HDh0CYB8sqvthcdiwYbUeUqr7IU4URbRp06bScRw/fhwlJSW46667EBwcXOU1gwcP\nrvWQcvDgQQCoMqCUGzVqFA4ePIiDBw9WGVKqqzssLAyAa59/dTQaDRYtWoTp06fj+eefR1pa2k3l\ncaZ3796VhlLAvi4GALp06YKAgIBK+9q1awcA+PXXX6vNV93fFY1Gg0GDBuHcuXM4dOgQ2rdvj/37\n98NisUClUlV7RsZisQAAfv755yr7OnbsiNatW7twdL8JDw+/6V644m9/+1ulP/fq1Quvv/46AgIC\nsGLFCrz66qv49NNPa3y9LMt46qmnkJmZieHDh1c6O0hEVI5DChE1KgUFBQBQ4w9+bdq0cctrnKlu\n4AAAtVoNq9Var+9dnrOm15avCzGZTFX2VVd3+eB2Y921FRMTg8jISOzYsQNZWVkYP378TeeqSVBQ\nUJVtarW6xn3lxyVJUrX5avr8yntV/jlfvXoVgH0d0oEDB2qs7/r16y6/hxI98MADWLFiBfbs2VNj\njCzLePLJJ/Hhhx8iMjISn376KbRarQerJCJfwSGFiBqV8h9G8/Lyqt2fm5vrlte4S2BgoNvfu/x4\nanrtpUuXKsV5yuLFixEZGYmFCxdWWWtTrvxMSE0DUXWDVX2p6fMr71X551f+fx966CEsW7asVu/x\n+zVBrvDUmpTfK79pQnFxcbX7rVYr5syZg88++wzjxo3D6tWr0aRJkzq9JxE1XBxSiKhRCQwMRJcu\nXXD69GmcOHEC3bp1q7S/urt7ld/lau/evbBYLFUu+arpjmDu0L17d/j7++Onn36CyWSqciajpt9a\nl58hsFqtFf9/uX79+gGw3/b194ufAVTcdtfTz63o06cP7rnnHqxZswYfffRRtTHltxc+d+5clX0m\nkwknT56s1xpvVF3fLRZLxW2ky//e3HHHHVCpVNi9e7dH6qrvNSk12bdvHwCgU6dOVfZJkoSHHnoI\naWlpuPvuu/Hhhx/yDAoROcTnpBBRozNjxgzIsoyFCxfCZrNVbP/ll1/wzjvvVIm/5ZZbMHr0aJw9\ne7bKb6g3bdpUr8940Gq1iI+PR2FhIf75z39W2nf48GF89tln1b6uRYsWAFDxvJQbTZw4ES1atMDn\nn39e5QftNWvW4Pvvv0fPnj1x5513uukoXLdgwQIEBARgyZIlKC0trbK/e/fuCAoKwoYNGyrO+AD2\n4WD+/PkoKSnxWK1fffVVlefkrFq1CufOncPo0aPRvn17AECrVq1gMBhw+PBhLFmypGINyo3Onz9f\n7ZqUm1G+JqU2/3P1wYzHjh1DUVFRle05OTmYN28eAPsNB25UfgeztLQ0xMfH4+OPP+aAQkRO8UwK\nETUYjm5BPG7cuIofuh977DGsX78eGzZswIgRIzBu3DgUFBQgLS0NQ4YMwcaNG6u8fvny5YiKisLz\nzz+PL7/8suI5KevWrUNMTAw2bdpUb8f14osv4quvvsKKFSuwf/9+DBkyBJcuXUJaWhqioqKwfv36\nKgvCR48ejezsbNx3330YP348mjRpgg4dOmD69OkICAjAv//9b8ycORNTpkxBbGwsOnXqhB9++AFZ\nWVkIDg7GqlWrbupSo7pq164dHn/8cSxdurTa/aIo4tFHH8XSpUsxcuRITJo0CYIgYOfOnZBlGb17\n98YPP/zgkVqjo6MxY8aMis/v0KFD2Lp1K1q0aIHly5dXil22bBlOnTqFV199FYmJiRg6dChCQ0Nx\n6dIlnDhxAt999x1eeeUVdO/e3SO136zU1FSsXLkSQ4cORYcOHdCsWTOcPn0aWVlZKC0txfjx4yvd\n4hmw39p706ZNCAoKQteuXasM24D9LNqkSZM8dRhE5AM4pBBRg+HoEpfg4OCKIcXPzLine truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x119e0d9b0>"
|
||||
"<matplotlib.figure.Figure at 0x10cf8b940>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -263,22 +241,25 @@
|
||||
}
|
||||
],
|
||||
"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')"
|
||||
"def edplot(distances, X):\n",
|
||||
" M = [min(X), max(X)]\n",
|
||||
" plt.plot(M, M, 'r-')\n",
|
||||
" plt.title('Eddington Number = {}'.format(eddington(distances)))\n",
|
||||
" show(X, [sum(d > x for d in distances) for x in X], fit=False,\n",
|
||||
" xlabel='Ride Distance', ylabel='Number of Rides longer than distance')\n",
|
||||
" \n",
|
||||
"edplot(mls, range(46, 81))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"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, so I nneed 28 60+ mile rides to get an Eddington number of 60.\n",
|
||||
"\n",
|
||||
"## Metric Eddington Number\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:"
|
||||
"[Arthur Eddington](https://en.wikipedia.org/wiki/Arthur_Eddington) was born in 19th century England, so he used miles. You can get a bigger number using kilometers:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -290,40 +271,17 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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}"
|
||||
"<matplotlib.figure.Figure at 0x1038734a8>"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"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)}"
|
||||
"edplot([m * 1.60934 for m in mls], range(70, 101))"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user