Add files via upload

This commit is contained in:
Peter Norvig authored and GitHub committed 2020-07-24 13:12:35 -07:00
1 parent df66d00ecd
commit 2d17e5bbed
2 files changed
+129 -97

No files matched your search

+113 -86
View File
@@ -20,9 +20,9 @@
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import collections\n",
"import numpy as np\n",
"import re\n",
"from collections import namedtuple"
"import re"
]
},
{
@@ -31,7 +31,7 @@
"metadata": {},
"outputs": [],
"source": [
"Ride = namedtuple('Ride', 'miles, hours, feet, date, title')\n",
"Ride = collections.namedtuple('Ride', 'miles, hours, feet, date, title')\n",
"\n",
"def parse_rides(lines: str) -> [Ride]:\n",
" \"\"\"Parse lines from a Strava log file into a list of `Ride`. Tab separated fields:\n",
@@ -44,10 +44,10 @@
"\n",
"def parse_hours(time: str) -> float: \n",
" if time.count(':') < 2: time = '0:' + time\n",
" sec, min, hour = time.split(':')[::-1]\n",
" return int(sec)/3600 + int(min)/60 + int(hour)\n",
" hour, min, sec = map(int, time.split(':'))\n",
" return hour + min/60 + sec/3600\n",
"\n",
"rides = parse_rides(open('bikerides25.tsv'))#{parse_ride(line) for line in open('bikerides25.tsv') if line.startswith('Ride')}"
"rides = parse_rides(open('bikerides25.tsv'))"
]
},
{
@@ -69,7 +69,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
@@ -106,7 +106,7 @@
"outputs": [],
"source": [
"def show(X, Y, xlabel='Grade (feet/mile)', ylabel='Speed (mph)', degrees=(2, 3)): \n",
" \"Plot X versus Y and a best fit curve to it, with some bells and whistles.\"\n",
" \"\"\"Plot X versus Y and a best fit curve to it, with some bells and whistles.\"\"\"\n",
" plt.rcParams[\"figure.figsize\"] = (12, 10)\n",
" plt.style.use('fivethirtyeight')\n",
" grid(); plt.ylabel(ylabel); plt.xlabel(xlabel)\n",
@@ -132,7 +132,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAKSCAYAAADWEJRoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOy9f3yT9bn//6KUFimUYltLoRC6IzJw4s50uqFleuTgr0qrrk7H/LG5bGx6tuOm88ciQ41D2Y56vno2WN2U73kwp91cZ6dHz5nTHUGdFmG4qVilBPorpKVJSWISkvTzR8+dNXfuO7mT3Pc771xcz8eDh5Dcyeu+rtf7jvd1v39N8Xq942AYhmEYhmEYhpGEkkKfAMMwDMMwDMMwzGS4SGEYhmEYhmEYRiq4SGEYhmEYhmEYRiq4SGEYhmEYhmEYRiq4SGEYhmEYhmEYRiq4SGEYhmEYhmEYRiq4SGEYhmGKmqqqKlx88cWGj3/llVdQVVWFb3zjGxaeFcMwDJMPXKQwDMMcw2zfvh3HH388qqqqsGHDBs1jqqqqdP+sWrUq5XilCND7o6fDMAzDMAqlhT4BhmEYpjD4fD6sW7cOM2bMgN/vT3tsZWWlZs/D/PnzdT/ziU98QrOH47Of/Wz2J5uGN954A8cdd5yp38kwDMMUFi5SGIZhjlFuueUWBAIBfOc738Hdd9+d9tjZs2fj9ttvz+r7TznllKw/kwsnnXSS5RoMwzCMWHi4F8MwzDFIZ2cnnnrqKfzoRz9CXV1doU9Hl23btqGqqgobN27En//8Z1x22WWw2WyoqqqC1+sFoD8n5dChQ7jxxhuxePFizJ07F2effTa2bduWVi8UCuHhhx/G5z73OcyfPx/z5s3DOeecg1/84hcYHx9POb6rqwtr1qzBkiVLcMIJJ2DJkiU4//zz8W//9m/mJIBhGOYYhXtSGIZhjjEGBwdx0003oaWlBZ///Ocz3rgDQCQSwa9+9Sv09/dj5syZWL58OT7zmc9gypQpup8ZGhrCL37xC4yOjqKmpgaf+cxnsGTJkpzO+Y033sADDzyAFStW4JprrsHg4CCmTp2qe/zhw4exevVq7N+/H2eeeSZWrFiBoaEh3Hzzzfjc5z6n+ZkjR46gtbUVO3fuxPLly/HFL34RAPDiiy/iO9/5Dt5880389Kc/TRz/85//HN/97ndxwgkn4Pzzz0dtbS1GRkawd+9ePPbYY/jud7+bU6wMwzAMFykMwzDHFOPj47jhhhswbdo0PPDAA4Y/53a7sW7duqTXPv7xj2PLli049dRTNT/z0ksv4aWXXkp67YILLsB//Md/oLq6Oqvzfumll/DQQw/huuuuM3T8XXfdhf3798Nut+NHP/pR4vV169ZpTvYHgDvuuAM7d+7Ehg0b8K//+q+J18PhMK6++mo88cQTuOSSS3DRRRcBALZu3YqysjK88sorKb1RIyMjWcXHMAzDJMPDvRiGYY4htmzZgj/+8Y948MEHDRcKN9xwA1544QV8+OGH6Ovrw0svvYSWlha89957aG1tRV9fX9LxNTU12LBhA1599VX09fXhww8/xK9//WssX74czz//PL7whS8gHo9ndd6f+MQnDBcoR48eRUdHByoqKvD9738/6b1TTz0VV1xxRcpnRkdH8cQTT2D58uVJBQoAlJeXY/369QCAJ598MvF6SUkJSktLUVZWlvJ92RZhDMMwTDLck8IwDHOMsHfvXmzYsAFXXnllVvuK3HvvvUn//sd//Eds3boV11xzDZ555hk8/PDDuP/++xPvL126FEuXLk38e+bMmVi1ahXOOOMMNDU1obu7G88++ywuueQSw+dw+umnGz72/fffRzAYxBlnnIGqqqqU988666yUIW47d+5ENBpFSUkJNm7cmPKZaDQKAOjp6Um8dsUVV+COO+7AmWeeiUsvvRQrVqzAmWeeiblz5xo+V4ZhGEYbLlIYhmGOEb72ta+huro6qaDIh6985St45pln8Prrrxs6vrKyEm1tbfjxj3+M119/Pasi5YQTTjB87NjYGACgtrbW8HcdPnwYALB7927s3r1b97snL9X8zW9+E7W1tfj5z3+ORx99FFu2bAEAfPrTn8b69evR1NRk+JwZhmGYZLhIYRiGOUb4y1/+AgCw2Wya7z/00EN46KGHcNFFF+GXv/xlxu+rqakBAASDQcPnkMtnAKSdoK+msrISAODxeDTfP3TokO5nvva1r2HTpk2Gtdra2tDW1oaxsTG8+eabeP7557F161a0tbVh+/btOPHEEw1/F8MwDPN3uEhhGIY5Rrj66qs1X//www/x6quv4uSTT8anPvUpLF++3ND37dy5EwCwaNEiw+eQy2ey5aSTTsKMGTPwt7/9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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -167,8 +167,8 @@
"metadata": {},
"outputs": [],
"source": [
"def time(dist, climb, F=poly_fit(feet/miles, miles/hours, 2)) -> float:\n",
" \"Given a distance in miles and total climb in feet, estimate time in minutes.\"\n",
"def estimate(dist, climb, F=poly_fit(feet/miles, miles/hours, 2)) -> float:\n",
" \"\"\"Given a distance in miles and total climb in feet, estimate time in minutes.\"\"\"\n",
" return 60 * dist / F(climb / dist)"
]
},
@@ -180,7 +180,7 @@
{
"data": {
"text/plain": [
"'Coast: 69.2 min, Creek: 62.5 min.'"
"'Coast: 69 min, Creek: 63 min.'"
]
},
"execution_count": 7,
@@ -189,14 +189,14 @@
}
],
"source": [
"f'Coast: {time(15.7, 344):.1f} min, Creek: {time(13.5, 735):.1f} min.'"
"f'Coast: {estimate(15.7, 344):.0f} min, Creek: {estimate(13.5, 735):.0f} min.'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This predicts the shorter creek route would be 6 or 7 minutes faster. Good to know, but other factors (like the scenery) are probably more important in making the choice."
"This predicts the shorter creek route would be about 6 minutes faster. Good to know, but other factors (like the scenery) are probably more important in making the choice."
]
},
{
@@ -205,7 +205,7 @@
"source": [
"# Segments\n",
"\n",
"The data I have so far helps me estimate the duration for a long ride over varying up-and-down terrain. But what if I just want to know how long it will take to climb the next hill? To answer that I'll go back to Strava and retrieve data from individual segments, some only a fraction of a mile long, some several miles long, but most with a relatively constant grade. I picked some representative climbing segments ([`bikesegments.csv`](bikesegments.csv)) with the segment length in miles and climb in feet, along with several of my times on the segment. (Strava shows my times for up to 10 rides on each segment; I picked the first, middle, and last of the rides shown.) "
"The data I have so far helps me estimate the duration for a long ride over varying up-and-down terrain. But what if I just want to know how long it will take to climb the next hill? To answer that I'll go back to Strava and retrieve data from individual **segments**, some only a fraction of a mile long, some several miles long, but most with a relatively constant grade. I picked some representative climbing segments ([`bikesegments.csv`](bikesegments.csv)) with the segment length in miles and climb in feet, along with several of my times on the segment. (Strava shows my times for up to 10 rides on each segment; I picked the first, middle, and last of the rides shown.) "
]
},
{
@@ -223,11 +223,11 @@
" time = parse_hours(time)\n",
" yield Ride(float(mi), time, int(ft), 'date?', title)\n",
" \n",
"segments = set(parse_segments(open('bikesegments.csv')))\n",
"segments = list(parse_segments(open('bikesegments.csv')))\n",
"\n",
"miles2 = column('miles', segments)\n",
"hours2 = column('hours', segments)\n",
"feet2 = column('feet', segments) "
"feet2 = column('feet', segments) "
]
},
{
@@ -244,7 +244,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAKSCAYAAADWEJRoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydfVhc5Zn/vzMMEN4CCWIgMRnRYDTdaqt9WTWkrloTlRh8QW3VbWvFt6ZVq67dlupWqUa7W7uXtmqx7WqN1lIVjbqpbrdqEvVXbdSoXS1ROiSBmQCZF4bJzDAvvz9waIDhMHM49/3MM96f6/K6Wpj58Dyf8zDyOHPOsfl8viQEQRAEQRAEQRByBLvqAQiCIAiCIAiCIOyPbFIEQRAEQRAEQcgpZJMiCIIgCIIgCEJOIZsUQRAEQRAEQRByCtmkCIIgCIIgCIKQU8gmRRAEQRAEQRCEnEI2KYIgCILWfPKTn8QnP/nJjB/vcrlQVVWF008/nXBUgiAIwmyQTYogCMLHiCeffBLXX389Tj31VCxevBhVVVW4+OKLp3383r17ccMNN2DVqlU4/PDDceCBB2Lp0qU48cQTcc8992BkZCSjn/uNb3wDVVVVqKqqwl//+lerpiMIgiDkKQ7VAxAEQRD4+NGPfoR33nkH5eXlWLhwIYaHhw0f73a78dBDD+HTn/40Vq1aherqavj9frz44ov413/9VzzwwAP4/e9/j8rKymkdTz/9NDZs2IDy8nIEg0Grp4SnnnrKcqcgCIKgFtmkCIIgfIy49dZbsWjRIhxyyCHYsmUL1qxZY/j4ww47DC6XCw7HxH9dJJNJXHrppejs7MT999+Pa6+9Nu3z9+zZg6uuugpnn3023G43tm7datlcUtTX11vuFARBENQiH/cSBEH4GLFy5UoceuihsNlsGT3e4XBM2aAAgM1mQ3NzMwDggw8+mPb569atQ2FhIf793//d1Hg3b96MqqoqXHHFFXjvvfdw4YUX4pBDDkFVVRW2b98OYPpzUoaHh/Hd734Xy5cvx4IFC/DZz34Wd911F5LJ5LQ/L5FI4MEHH8SqVauwZMkSLFiwAMceeyx+/OMfIxqNph3feeedh0984hPjH4U74YQT8L3vfc/w5wiCIAjGyDspgiAIgik2bdoEANOetP7LX/4Szz33HB599FHMmzdvVj+rp6cHp5xyCpYtW4bzzz8ffr8fpaWl0z4+Eolg7dq12LZtG5YvX46WlhYEAgH8x3/8x7Tv5sRiMVx44YXYtGkTli5dirPPPhvFxcXYunUrbr75Zrz44ot47LHHxjdtzz33HM477zxUVFTg1FNPxaJFi+Dz+fDBBx/gvvvuww9+8IO0GzxBEARhZuTVUxAEQZiRUCiE//zP/wQAeL1evPzyy3jnnXdwwgknpD3x/oMPPkBbWxsuvPBCrFq1atY//9VXX8W3v/1t3HjjjRk9/u6778a2bdtw2mmn4aGHHoLdPvbBgWuuuQYnnHBC2ufceeed2LRpE1pbW7F+/XoUFBQAGHt35ZprrsEDDzyA+++/H5dffjkA4MEHH0QymcTGjRtx1FFHTXDt3btXNiiCIAizQD7uJQiCIMzIvn37cPvtt+P222/Hz3/+c7zzzjv48pe/jIceegjFxcUTHhuLxXDppZdi/vz5uPXWWy35+QceeCBuuOGGjB+/YcMG2Gw2/OAHPxjfoADAkiVLcNlll015fCKRwL333ouamhrcdttt4xsUALDb7bj55pths9nw6KOPTvg6gLTv6MyfPz/jsQqCIAhTkf/MIwiCIMxIdXU1fD4fkskk+vv78cc//hG33HILTjjhBPzud7/DwQcfPP7YO+64A9u2bUNXVxfmzp1ryc//h3/4hymboekYHh7Ghx9+iNraWjQ0NEz5/vHHHz/lazt27MDQ0BDq6+vxox/9KK23pKQE3d3d4///3HPPxVNPPYWTTjoJZ555JhobG/HZz34WTqczw1kJgiAI0yGbFEEQBCFjbDYbFi5ciAsuuADLli3DySefjGuvvRaPPfYYAOCtt97Cj3/8Y1xyySX4whe+YNnPPfDAAzN+bCAQAADU1NRk7Nq7dy+AsXNfbr/99ox+TlNTEx577DHcddddeOSRR/DAAw8AAJYvX44bbrgBa9euzXjMgiAIwkTk416CIAiCKT7zmc+gqqoKW7duHb+S1TvvvINYLIaOjo7xmzem/kmdsP65z30OVVVVePrppzP+WZlejQzA+Ls3AwMDab+/Z8+eaZ+zevVq+Hw+w3/256STTkJXVxdcLheefvppXH311di5cye++tWvYsuWLRmPWRAEQZiIvJMiCIIgmGJ4eBiBQAAlJSXjm4ilS5fioosuSvv45557Dh6PB2vXrsXcuXOxZMkSknFVVFTgkEMOQU9PD3bs2IGlS5dO+H66q3sddthhqKysxJ///GdEo1EUFRVl9TNLSkqwYsUKrFixAgcffDCuvvpqPPvss1ixYsWs5iIIgvBxRTYpgiAIwrS88cYbWLp0KSoqKiZ8PRqN4vrrr0cikZhw9a7Pf/7z+PznP5/Wdfrpp8Pj8eB73/seDjvsMNJxX3DBBbjllltw4403Tri6V29vL+67774pj3c4HLj88stx++2347rrrsP69eunnBA/NDSE3bt348gjjwQAvPDCC/jc5z435XEejwcAMGfOHIqpCYIgfCyQTYogCMLHiKeffhrPPPMMgL9/7On111/HFVdcMf6Ye+65Z/x///znP8dTTz2FFStWYPHixSgvLx8/cX7Pnj1YunQpfvjDH/JOIgPWrVuHZ555Bs8++ywaGxtx8sknIxAI4IknnsCxxx6L//7v/57ynOuvvx5/+ctf8OCDD+K5557DypUrsWjRIgwODqKnpwevvvoqLrnkkvFNSltbG3p7e3H88cdjyZIlmDNnDt5991384Q9/wPz58/GVr3yFe9qCIAh5g2xSBEEQPka8/fbbeOSRRyZ8rbe3F729veP/f/9Nyvnnnw8A+POf/4xXX30VIyMjqKiowOGHH45vfetbuPjiiw1vqqiK4uJidHV1Yf369XjiiSdw7733YsmSJbj22muxZs2atJsUh8OBBx98EI899hg2bNiA559/HsFgEPPnz8fixYtxzTXXjPcAgGuvvRbPPPMM3njjDWzevBkAsHDhQlxxxRW48sorcdBBB7HNVxAEId+w+Xy+pOpBCIIgCIIgCIIgpJCrewmCIAiCIAiCkFPIJkUQBEEQBEEQhJxCNimCIAiCIAiCIOQUskkRBEEQBEEQBCGnkE2KIAiCIAiCIAg5hWxSBEEQBEEQBEHIKWSTIgiCIAiCIAhCTiGbFAM8Ho+WbgDo7u4mc+vchdJP2RzQt7usdTV+Wev8bmq/dOd3A/Iao8Ita12NP9fWumxSDKiurtbSTY3OXaR7frmp0Xk9Snd+N4efEl27S3M1funO7+bwU2Fm3LJJMSCRSGjppkbnLtI9v9zU6LwepTu/m8NPia7dpbkav3Tnd3P4qTAz7rzcpHg8HsRiMUSjUQwMDAAA/H4/gsEgAMDtdiMejyMSiWBwcBAA4PP5MDIyAgDo7+9HIpHA0NAQhoaGAABerxehUAgA0NfXBwAIhULwer0AgKGhIYTDYSQSCfT39wMARkZG4PP5AACDg4OIRCKIx+Nwu93j4/H7/QCAgYEBRKNRxGKx8bfEAoEAAoGApXMKh8OzntOePXvSzgnArOe0Z88e0jl5PJ6sjpMVc7LqOPn9fkvWXro57d27l2xOfX19lq29dHNKQXGc9u7dS/r7NDg4SLb2/H4/2WtECivWXro5pY4Jxe+Tx+Ox9LV88pz6+/u1eS2fPCev10v2uuf1esnmlPo+1Wt5CorjNDQ0ZOlr+eQ5DQwMkK09v99v+d9GqTmloPp3bup/U/w+ud1u0r8j+vr6yF4jUs/P9DhlMyev1ztlTjNh8/l8yRkfJWhHd3c3GhoaVA/jY4U0V4N050eaq0G6q0G68yPN1ZBr3fPynRSryGSXl4tuanTuIt3zy02NzutRuvO7OfyU6NpdmqvxS3d+N4efCjPjlk2KAQUFBVq6qdG5i3TPLzc1Oq9H6c7v5vBTomt3aa7GL9353Rx+KsyMWzYpBpSXl2vppkbnLtI9v9zU6LwepTu/m8NPia7dpbkav3Tnd3P4qTAzbtmkGJA6OUg3NzU6d5Hu+eWmRuf1KN353Rx+SnTtLs3V+KU7v5vDT4WZccsmxYCamhot3dTo3EW655ebGp3Xo3Tnd3P4KdG1uzRX45fu/G4OPxVmxi2bFANisZiWbmp07iLd88tNjc7rUbrzuzn8lOjaXZqr8Ut3fjeHnwoz45ZNigHDw8NauqnRuYt0zy83NTqvR+nO7+bwU6Jrd2muxi/d+d0cfirMjFs2KQYccMABWrqp0bmLdM8vNzU6r0fpzu/m8FOia3dprsYv3fndHH4qzIxbNikGpO60qZubGp27SPf8clOj83qU7vxuDj8lunaX5mr80p3fzeGnwsy4ZZNiQGFhoZZuanTuIt3zy02NzutRuvO7OfyU6NpdmqvxS3d+N4efCjPjlk2KAWVlZVq6qdG5i3TPLzc1Oq9H6c7v5vBTomt3aa7GL9353Rx+KsyMWzYpBvT392vppkbnLtI9v9zU6LwepTu/m8NPia7dpbkav3Tnd3P4qTAzbtmkGLBgwQIt3dTo3EW655ebGp3Xo3Tnd3P4KdG1uzRX45fu/G4OPxVmxi2bFAOi0aiWbmp07iLd88tNjc7rUbrzuzn8lOjaXZqr8Ut3fjeHnwoz45ZNigEjIyNauqnRuYt0zy83NTqvR+nO7+bwU6Jrd2muxi/d+d0cfirMjDsvNykejwexWAzRaBQDAwMAAL/fj2AwCABwu92Ix+OIRCIYHBwEMHZptFTA/v5+JBIJlJWVYWhoCADg9XoRCoUAAH19fQCAUCgEr9cLABgLine truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAKSCAYAAADWEJRoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydfVhc5Zn/vzMMEN4CCWIgMRnRYDTdaqt9WTWkrloTlRh8QW3VbWvFt6ZVq67dlupWqUa7W7uXtmqx7WqN1lIVjbqpbrdqEvVXbdSoXS1ROiSBmQCZF4bJzDAvvz9waIDhMHM49/3MM96f6/K6Wpj58Dyf8zDyOHPOsfl8viQEQRAEQRAEQRByBLvqAQiCIAiCIAiCIOyPbFIEQRAEQRAEQcgpZJMiCIIgCIIgCEJOIZsUQRAEQRAEQRByCtmkCIIgCIIgCIKQU8gmRRAEQRAEQRCEnEI2KYIgCILWfPKTn8QnP/nJjB/vcrlQVVWF008/nXBUgiAIwmyQTYogCMLHiCeffBLXX389Tj31VCxevBhVVVW4+OKLp3383r17ccMNN2DVqlU4/PDDceCBB2Lp0qU48cQTcc8992BkZCSjn/uNb3wDVVVVqKqqwl//+lerpiMIgiDkKQ7VAxAEQRD4+NGPfoR33nkH5eXlWLhwIYaHhw0f73a78dBDD+HTn/40Vq1aherqavj9frz44ov413/9VzzwwAP4/e9/j8rKymkdTz/9NDZs2IDy8nIEg0Grp4SnnnrKcqcgCIKgFtmkCIIgfIy49dZbsWjRIhxyyCHYsmUL1qxZY/j4ww47DC6XCw7HxH9dJJNJXHrppejs7MT999+Pa6+9Nu3z9+zZg6uuugpnn3023G43tm7datlcUtTX11vuFARBENQiH/cSBEH4GLFy5UoceuihsNlsGT3e4XBM2aAAgM1mQ3NzMwDggw8+mPb569atQ2FhIf793//d1Hg3b96MqqoqXHHFFXjvvfdw4YUX4pBDDkFVVRW2b98OYPpzUoaHh/Hd734Xy5cvx4IFC/DZz34Wd911F5LJ5LQ/L5FI4MEHH8SqVauwZMkSLFiwAMceeyx+/OMfIxqNph3feeedh0984hPjH4U74YQT8L3vfc/w5wiCIAjGyDspgiAIgik2bdoEANOetP7LX/4Szz33HB599FHMmzdvVj+rp6cHp5xyCpYtW4bzzz8ffr8fpaWl0z4+Eolg7dq12LZtG5YvX46WlhYEAgH8x3/8x7Tv5sRiMVx44YXYtGkTli5dirPPPhvFxcXYunUrbr75Zrz44ot47LHHxjdtzz33HM477zxUVFTg1FNPxaJFi+Dz+fDBBx/gvvvuww9+8IO0GzxBEARhZuTVUxAEQZiRUCiE//zP/wQAeL1evPzyy3jnnXdwwgknpD3x/oMPPkBbWxsuvPBCrFq1atY//9VXX8W3v/1t3HjjjRk9/u6778a2bdtw2mmn4aGHHoLdPvbBgWuuuQYnnHBC2ufceeed2LRpE1pbW7F+/XoUFBQAGHt35ZprrsEDDzyA+++/H5dffjkA4MEHH0QymcTGjRtx1FFHTXDt3btXNiiCIAizQD7uJQiCIMzIvn37cPvtt+P222/Hz3/+c7zzzjv48pe/jIceegjFxcUTHhuLxXDppZdi/vz5uPXWWy35+QceeCBuuOGGjB+/YcMG2Gw2/OAHPxjfoADAkiVLcNlll015fCKRwL333ouamhrcdttt4xsUALDb7bj55pths9nw6KOPTvg6gLTv6MyfPz/jsQqCIAhTkf/MIwiCIMxIdXU1fD4fkskk+vv78cc//hG33HILTjjhBPzud7/DwQcfPP7YO+64A9u2bUNXVxfmzp1ryc//h3/4hymboekYHh7Ghx9+iNraWjQ0NEz5/vHHHz/lazt27MDQ0BDq6+vxox/9KK23pKQE3d3d4///3HPPxVNPPYWTTjoJZ555JhobG/HZz34WTqczw1kJgiAI0yGbFEEQBCFjbDYbFi5ciAsuuADLli3DySefjGuvvRaPPfYYAOCtt97Cj3/8Y1xyySX4whe+YNnPPfDAAzN+bCAQAADU1NRk7Nq7dy+AsXNfbr/99ox+TlNTEx577DHcddddeOSRR/DAAw8AAJYvX44bbrgBa9euzXjMgiAIwkTk416CIAiCKT7zmc+gqqoKW7duHb+S1TvvvINYLIaOjo7xmzem/kmdsP65z30OVVVVePrppzP+WZlejQzA+Ls3AwMDab+/Z8+eaZ+zevVq+Hw+w3/256STTkJXVxdcLheefvppXH311di5cye++tWvYsuWLRmPWRAEQZiIvJMiCIIgmGJ4eBiBQAAlJSXjm4ilS5fioosuSvv45557Dh6PB2vXrsXcuXOxZMkSknFVVFTgkEMOQU9PD3bs2IGlS5dO+H66q3sddthhqKysxJ///GdEo1EUFRVl9TNLSkqwYsUKrFixAgcffDCuvvpqPPvss1ixYsWs5iIIgvBxRTYpgiAIwrS88cYbWLp0KSoqKiZ8PRqN4vrrr0cikZhw9a7Pf/7z+PznP5/Wdfrpp8Pj8eB73/seDjvsMNJxX3DBBbjllltw4403Tri6V29vL+67774pj3c4HLj88stx++2347rrrsP69eunnBA/NDSE3bt348gjjwQAvPDCC/jc5z435XEejwcAMGfOHIqpCYIgfCyQTYogCMLHiKeffhrPPPMMgL9/7On111/HFVdcMf6Ye+65Z/x///znP8dTTz2FFStWYPHixSgvLx8/cX7Pnj1YunQpfvjDH/JOIgPWrVuHZ555Bs8++ywaGxtx8sknIxAI4IknnsCxxx6L//7v/57ynOuvvx5/+ctf8OCDD+K5557DypUrsWjRIgwODqKnpwevvvoqLrnkkvFNSltbG3p7e3H88cdjyZIlmDNnDt5991384Q9/wPz58/GVr3yFe9qCIAh5g2xSBEEQPka8/fbbeOSRRyZ8rbe3F729veP/f/9Nyvnnnw8A+POf/4xXX30VIyMjqKiowOGHH45vfetbuPjiiw1vqqiK4uJidHV1Yf369XjiiSdw7733YsmSJbj22muxZs2atJsUh8OBBx98EI899hg2bNiA559/HsFgEPPnz8fixYtxzTXXjPcAgGuvvRbPPPMM3njjDWzevBkAsHDhQlxxxRW48sorcdBBB7HNVxAEId+w+Xy+pOpBCIIgCIIgCIIgpJCrewmCIAiCIAiCkFPIJkUQBEEQBEEQhJxCNimCIAiCIAiCIOQUskkRBEEQBEEQBCGnkE2KIAiCIAiCIAg5hWxSBEEQBEEQBEHIKWSTIgiCIAiCIAhCTiGbFAM8Ho+WbgDo7u4mc+vchdJP2RzQt7usdTV+Wev8bmq/dOd3A/Iao8Ita12NP9fWumxSDKiurtbSTY3OXaR7frmp0Xk9Snd+N4efEl27S3M1funO7+bwU2Fm3LJJMSCRSGjppkbnLtI9v9zU6LwepTu/m8NPia7dpbkav3Tnd3P4qTAz7rzcpHg8HsRiMUSjUQwMDAAA/H4/gsEgAMDtdiMejyMSiWBwcBAA4PP5MDIyAgDo7+9HIpHA0NAQhoaGAABerxehUAgA0NfXBwAIhULwer0AgKGhIYTDYSQSCfT39wMARkZG4PP5AACDg4OIRCKIx+Nwu93j4/H7/QCAgYEBRKNRxGKx8bfEAoEAAoGApXMKh8OzntOePXvSzgnArOe0Z88e0jl5PJ6sjpMVc7LqOPn9fkvWXro57d27l2xOfX19lq29dHNKQXGc9u7dS/r7NDg4SLb2/H4/2WtECivWXro5pY4Jxe+Tx+Ox9LV88pz6+/u1eS2fPCev10v2uuf1esnmlPo+1Wt5CorjNDQ0ZOlr+eQ5DQwMkK09v99v+d9GqTmloPp3bup/U/w+ud1u0r8j+vr6yF4jUs/P9DhlMyev1ztlTjNh8/l8yRkfJWhHd3c3GhoaVA/jY4U0V4N050eaq0G6q0G68yPN1ZBr3fPynRSryGSXl4tuanTuIt3zy02NzutRuvO7OfyU6NpdmqvxS3d+N4efCjPjlk2KAQUFBVq6qdG5i3TPLzc1Oq9H6c7v5vBTomt3aa7GL9353Rx+KsyMWzYpBpSXl2vppkbnLtI9v9zU6LwepTu/m8NPia7dpbkav3Tnd3P4qTAzbtmkGJA6OUg3NzU6d5Hu+eWmRuf1KN353Rx+SnTtLs3V+KU7v5vDT4WZccsmxYCamhot3dTo3EW655ebGp3Xo3Tnd3P4KdG1uzRX45fu/G4OPxVmxi2bFANisZiWbmp07iLd88tNjc7rUbrzuzn8lOjaXZqr8Ut3fjeHnwoz45ZNigHDw8NauqnRuYt0zy83NTqvR+nO7+bwU6Jrd2muxi/d+d0cfirMjFs2KQYccMABWrqp0bmLdM8vNzU6r0fpzu/m8FOia3dprsYv3fndHH4qzIxbNikGpO60qZubGp27SPf8clOj83qU7vxuDj8lunaX5mr80p3fzeGnwsy4ZZNiQGFhoZZuanTuIt3zy02NzutRuvO7OfyU6NpdmqvxS3d+N4efCjPjlk2KAWVlZVq6qdG5i3TPLzc1Oq9H6c7v5vBTomt3aa7GL9353Rx+KsyMWzYpBvT392vppkbnLtI9v9zU6LwepTu/m8NPia7dpbkav3Tnd3P4qTAzbtmkGLBgwQIt3dTo3EW655ebGp3Xo3Tnd3P4KdG1uzRX45fu/G4OPxVmxi2bFAOi0aiWbmp07iLd88tNjc7rUbrzuzn8lOjaXZqr8Ut3fjeHnwoz45ZNigEjIyNauqnRuYt0zy83NTqvR+nO7+bwU6Jrd2muxi/d+d0cfirMjDsvNykejwexWAzRaBQDAwMAAL/fj2AwCABwu92Ix+OIRCIYHBwEMHZptFTA/v5+JBIJlJWVYWhoCADg9XoRCoUAAH19fQCAUCgEr9cLABgLine truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -267,7 +267,7 @@
"\n",
"# VAM\n",
"\n",
"The average number of vertical feet (or meters) climbed per hour (regardless of horizontal distance travelled) is known as [VAM](https://en.wikipedia.org/wiki/VAM_%28bicycling%29), which stands for *velocità ascensionale media* (for native Campagnolo speakers) or *mean ascent velocity* (for SRAM) or 平均上昇率 (for Shimano). The theory is that for medium-steepish climbs, most of your power is going into lifting against gravity, so your VAM should be about constant no matter what the grade in that range. (For flatish rides power is spent on wind and rolling resistance, and for super-steep rides power goes largely to cursing *sotto voce*, as they say in Italian.) Here's a plot of my VAM versus grades (in percent):"
"The average number of vertical feet (or meters) climbed per hour (regardless of horizontal distance travelled) is known as [VAM](https://en.wikipedia.org/wiki/VAM_%28bicycling%29), which stands for *velocità ascensionale media* (for native Campagnolo speakers) or *mean ascent velocity* (for SRAM) or 平均上昇率 (for Shimano). The theory is that for medium-steepish climbs, most of your power is going into lifting against gravity, so your VAM should be about constant no matter what the grade in that range. (For flatish rides power is spent on wind and rolling resistance, and for super-steep rides power goes largely to cursing *sotto voce*, as they say in Italian.) Here's a plot of my VAM versus grade (in percent):"
]
},
{
@@ -277,7 +277,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAKSCAYAAAAaia6DAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydfXiT9bnHv6WF8k6xQEtHqUUqCsODOmE6cQg430DrUQYbOnVbUdT5chQZs7KhnYpsbrvUOaw725zOeYrag+jUbQKTKSLiy3wZdlpToEnahCYhrWlo0vMHJxmFtCY09y/9Ps/9uS6ua6bpJ8/vkzsZP5I8yfL5fJ1QFEVRFEVRFEWxEP0yfQCKoiiKoiiKoijpRjc6iqIoiqIoiqJYDt3oKIqiKIqiKIpiOXSjoyiKoiiKoiiK5dCNjqIoiqIoiqIolkM3OoqiKIqiKIqiWA7d6CiKoii2Z+rUqZg6dWrS13c4HMjLy8P5558veFSKoihKb9CNjqIoipIS//u//4tly5bh3HPPRXFxMfLy8vDtb3+72+vv3bsXy5cvx9lnn43jjjsOY8aMwcSJEzF79mw89NBDaG1tTep2r732WuTl5SEvLw8fffRRupajKIqiWJScTB+AoiiKwsWaNWvw3nvvYejQoSgqKsK+fft6vL7L5cJjjz2GE088EWeffTby8/Ph9/uxefNmrFixAr/73e/w4osvYsSIEd06NmzYgMcffxxDhw5FMBhM95Kwfv36tDsVRVGUzKIbHUVRFCUl7rrrLnzhC1/AhAkTsGXLFsyfP7/H6x977LFwOBzIyen6fzmdnZ1YsmQJampq8Mgjj+Dmm29O+PtNTU244YYbcPHFF8PlcuHvf/972tYSo7S0NO1ORVEUJbPoW9cURVGUlDjjjDNwzDHHICsrK6nr5+TkHLbJAYCsrCyUl5cDAD7++ONuf/+6665D//798ZOf/OSIjveVV15BXl4eli5din/+85+49NJLMWHCBOTl5eHdd98F0P1ndPbt24cf/OAHmDx5MgoKCnDKKafg/vvvR2dnZ7e3F41G8eijj+Lss8/G+PHjUVBQgFNPPRX33XcfwuFwwuNbuHAhpkyZEn9b36xZs3Dbbbf1eDuKoihKz+grOoqiKErGeOGFFwCg2xMB/Pd//zdeeuklPPnkkxg5cmSvbqu+vh5f+9rXMGnSJCxatAh+vx+DBw/u9vrt7e248MILsWPHDkyePBkLFixAIBDAT3/6025fVero6MCll16KF154ARMnTsTFF1+M3Nxc/P3vf8cdd9yBzZs346mnnopv/F566SUsXLgQw4YNw7nnnosvfOEL8Pl8+Pjjj7F27VqsWrUq4SZRURRF+Xz02VNRFEUxQltbG37xi18AAFpaWvDqq6/ivffew6xZsxKezODjjz9GZWUlLr30Upx99tm9vv2tW7fiv/7rv7By5cqkrv/AAw9gx44dOO+88/DYY4+hX78Db4K46aabMGvWrIS/87Of/QwvvPACKioqcM899yA7OxvAgVd5brrpJvzud7/DI488gquvvhoA8Oijj6KzsxPPPvss/uM//qOLa+/evbrJURRF6QX61jVFURTFCJ999hlWr16N1atX4+GHH8Z7772Hb37zm3jssceQm5vb5bodHR1YsmQJjjrqKNx1111puf0xY8Zg+fLlSV//8ccfR1ZWFlatWhXf5ADA+PHjcdVVVx12/Wg0il/96lcYPXo07r777vgmBwD69euHO+64A1lZWXjyySe7XA4g4StLRx11VNLHqiiKohyO/lORoiiKYoT8/Hz4fD50dnbC6XRi48aNuPPOOzFr1iysW7cORx99dPy69957L3bs2IHa2loMHz48Lbf/xS9+8bANVXfs27cPn3zyCQoLC1FWVnbYz7/yla8cdtm//vUveL1elJaWYs2aNQm9gwYNQl1dXfy/v/71r2P9+vWYM2cOLrroIsycOROnnHIKSkpKklyVoiiK0h260VEURVGMkpWVhaKiIixevBiTJk3C3LlzcfPNN+Opp54CALzzzju477778N3vfhdf/epX03a7Y8aMSfq6gUAAADB69OikXXv37gVw4LNAq1evTup25s2bh6eeegr3338/nnjiCfzud78DAEyePBnLly/HhRdemPQxK4qiKF3Rt64piqIoGeNLX/oS8vLy8Pe//z1+hrH33nsPHR0dqK6ujn9BaOxP7CQA06dPR15eHjZs2JD0bSV7ljgA8VeRmpubE/68qamp298555xz4PP5evxzMHPmzEFtbS0cDgc2bNiAG2+8Ebt27cIVV1yBLVu2JH3MiqIoSlf0FR1FURQlY+zbtw+BQACDBg2Kb0QmTpyIyy67LOH1X3rpJbjdblx44YUYPnw4xo8fL3Jcw4YNw4QJE1BfX49//etfmDhxYpefJzrr2rHHHosRI0bgzTffRDgcxoABA1K6zUGDBuH000/H6aefjqOPPho33ngjnn/+eZx++um9WouiKIpd0Y2OoiiKIspbb72FiRMnYtiwYV0uD4fDWLZsGaLRaJezqs2YMQMzZsxI6Dr//PPhdrtx22234dhjjxU97sWLF+POO+/EypUru5x1raGhAWvXrj3s+jk5Obj66quxevVq3HLLLbjnnnsOO8mA1+vFnj17cMIJJwAANm3ahOnTpx92PbfbDQAYOHCgxNIURVFsgW50FEVRlJTYsGEDnnvuOQD/fgvX9u3bsXTp0vh1Hnroofj/fvjhh7F+/XqcfvrpKC4uxtChQ+MnI2hqasLEiRPx4x//2OwikuC6667Dc889h+effx4zZ87E3LlzEQgE8Mwzz+DUU0/Fn/70p8N+Z9myZfjggw/w6KOP4qWXXsIZZ5yBL3zhC/B4PKivr8fWrVvx3e9+N77RqaysRENDA77yla9g/PjxGDhwIN5//3389a9/xVFHHYXLL7/c9LIVRVEsg250FEVRlJT4xz/+gSeeeKLLZQ0NDWhoaIj/98EbnUWLFgEA3nzzTWzduhWtra0YNmwYjjvuOFx//fX49re/3eMXd2aK3Nxc1NbW4p577sEzzzyDX/3qVxg/fjxuvvlmzJ8/P+FGJycnB48++iieeuopPP744/jzn/+MYDCIo446CsXFxbjpppviPQDg5ptvxnPPPYe33noLr7zyCgCgqKgIS5cuxTXXXINx48YZW6+iKIrVyPL5fJ2ZPghFURRFURRFUZR0omddUxRFURRFURTFcuhGR1EURVEURVEUy6EbHUVRFEVRFEVRLIdudBRFURRFURRFsRy60VEURVEURVEUxXLoRkdRFEVRFEVRFMuhGx1FURRFURRFUSyHbnSEcbvdtP66ujoxN3MX6WNn7c58n0o2B7R7d7DOurRfn2PMu6X9+hxj3g3wzrq0307ddaMjTH5+PrVfCuYurM0B7i7a3bzbhF8K5i6szQHuLtrdWm5pmOfRTt11oyNMNBql9kvB3IW1OcDdRbubd5vwS8HchbU5wN1Fu1vLLQ3zPNqpe8Y2OtXV1TjttNNQXFyM4uJinHXWWXjxxRfjP1+6dCny8vK6/Jk7d24XR3t7O5YtW4YJEyagqKgIixYtwp49e7pcZ9euXVi4cCGKioowYcIE3HrrrQiHw0bWCAB+v5/aLwVzF9bmAHcX7W7ebcIvBXMX1uYAdxftbi23NMzzaKfuOULH8bkUFRVh1apVOOaYYxCNRvHEE09g8eLF2LRpE774xS8CAGbNmoW1a9fGf2fAgAFdHCtWrMDzzz+PX//61xg5ciRuu+02LFy4EJs3b0Z2djYikQgWLlyIkSNH4vnnn0dLSwuWLl2Kzs5OrFmzxsg6R48eTe2XgrkLa3OAu4t2N+824ZeCuQtrc4C7i3a3llsa5nm0U/eMvaJz/vnn46yzzsKECRMwceJE3H777Rg6dCjeeOON+HVyc3NRUFAQ/zNy5Mj4z/x+P37/+9/jjjvuwJlnnolp06Zh7dq1eP/997Fp0yYAwMsvv4wPP/wQa9euxbRp03DmmWdi1apVePTRRxEIBIysk3nHLwlzF9bmAHcX7W7ebcIvBXMX1uYAdxftbi23NMzzaKfufeIzOpFIBE899RRaW1sxffr0+OWvvfYaJk6ciJNPPhnXX389mpub4z97++23sX//fsyePTt+2bhx4zBp0iS8/vrrAIBt27Zh0qRJGDduXPw6c+bMQXt7O95++20DKwOys7Op/VIwd2FtDnB30e7m3Sb8UjB3YW0OcHfR7tZyS8M8j3bqnrG3rgHA+++/j6997WsIhUIYMmQIHnvsMUyZMgUAMHfuXMyfPx8lJSVoaGhAVVUVLrjgAmzatAm5ubloampCdnb2YWdfGD16NJqamgAATU1Nh73ElZ+fj+zs7Ph1pBk6dCi1XwrmLqzNAe4u2t2824RfCuYurM0B7i7a3VpuaZjn0U7dM7rRKSsrwyuvvAK/34/169dj6dKl2LBhAyZPnoyLL744fr0pU6Zg2rRpmDp1Kl588UVccMEF3To7OzuRlZUV/++D//fBdHd5DOlz3rOgHTKDdjePNs8M2j0zaHfzaPPMoN0zg8nuZWVl3f4soxudAQMGYMKECQCAE088ETt27MAvf/lLPPDAA4ddd+zYsSgqKsInn3wCABgzZgwikQi8Xi9GjRoVv57H48Fpp50Wv07sbWwxvF4vIpHI536YqadoqRCJRERfIpT019XVpa3DoTB3kT521u7M96lkc0C7dwfrrEv79TnGvFvar88x5t0A76xL++3UvU98RidGNBrt9tTPXq8XTqcTBQUFAIBp06ahf//+2LhxY/w6e/bswc6dOzFjxgwAwPTp07Fz584up5zeuHEjcnNzMW3aNMGV/JuOjg5qvxTMXVibA9xdtLt5twm/FMxdWJsD3F20u7Xc0jDPo526Z2yj86Mf/QivvvoqHA4H3n//faxatQpbtmzBggULEAwGUVlLine truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAKSCAYAAAAaia6DAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydfXiT9bnHv6WF8k6xQEtHqUUqCsODOmE6cQg430DrUQYbOnVbUdT5chQZs7KhnYpsbrvUOaw725zOeYrag+jUbQKTKSLiy3wZdlpToEnahCYhrWlo0vMHJxmFtCY09y/9Ps/9uS6ua6bpJ8/vkzsZP5I8yfL5fJ1QFEVRFEVRFEWxEP0yfQCKoiiKoiiKoijpRjc6iqIoiqIoiqJYDt3oKIqiKIqiKIpiOXSjoyiKoiiKoiiK5dCNjqIoiqIoiqIolkM3OoqiKIqiKIqiWA7d6CiKoii2Z+rUqZg6dWrS13c4HMjLy8P5558veFSKoihKb9CNjqIoipIS//u//4tly5bh3HPPRXFxMfLy8vDtb3+72+vv3bsXy5cvx9lnn43jjjsOY8aMwcSJEzF79mw89NBDaG1tTep2r732WuTl5SEvLw8fffRRupajKIqiWJScTB+AoiiKwsWaNWvw3nvvYejQoSgqKsK+fft6vL7L5cJjjz2GE088EWeffTby8/Ph9/uxefNmrFixAr/73e/w4osvYsSIEd06NmzYgMcffxxDhw5FMBhM95Kwfv36tDsVRVGUzKIbHUVRFCUl7rrrLnzhC1/AhAkTsGXLFsyfP7/H6x977LFwOBzIyen6fzmdnZ1YsmQJampq8Mgjj+Dmm29O+PtNTU244YYbcPHFF8PlcuHvf/972tYSo7S0NO1ORVEUJbPoW9cURVGUlDjjjDNwzDHHICsrK6nr5+TkHLbJAYCsrCyUl5cDAD7++ONuf/+6665D//798ZOf/OSIjveVV15BXl4eli5din/+85+49NJLMWHCBOTl5eHdd98F0P1ndPbt24cf/OAHmDx5MgoKCnDKKafg/vvvR2dnZ7e3F41G8eijj+Lss8/G+PHjUVBQgFNPPRX33XcfwuFwwuNbuHAhpkyZEn9b36xZs3Dbbbf1eDuKoihKz+grOoqiKErGeOGFFwCg2xMB/Pd//zdeeuklPPnkkxg5cmSvbqu+vh5f+9rXMGnSJCxatAh+vx+DBw/u9vrt7e248MILsWPHDkyePBkLFixAIBDAT3/6025fVero6MCll16KF154ARMnTsTFF1+M3Nxc/P3vf8cdd9yBzZs346mnnopv/F566SUsXLgQw4YNw7nnnosvfOEL8Pl8+Pjjj7F27VqsWrUq4SZRURRF+Xz02VNRFEUxQltbG37xi18AAFpaWvDqq6/ivffew6xZsxKezODjjz9GZWUlLr30Upx99tm9vv2tW7fiv/7rv7By5cqkrv/AAw9gx44dOO+88/DYY4+hX78Db4K46aabMGvWrIS/87Of/QwvvPACKioqcM899yA7OxvAgVd5brrpJvzud7/DI488gquvvhoA8Oijj6KzsxPPPvss/uM//qOLa+/evbrJURRF6QX61jVFURTFCJ999hlWr16N1atX4+GHH8Z7772Hb37zm3jssceQm5vb5bodHR1YsmQJjjrqKNx1111puf0xY8Zg+fLlSV//8ccfR1ZWFlatWhXf5ADA+PHjcdVVVx12/Wg0il/96lcYPXo07r777vgmBwD69euHO+64A1lZWXjyySe7XA4g4StLRx11VNLHqiiKohyO/lORoiiKYoT8/Hz4fD50dnbC6XRi48aNuPPOOzFr1iysW7cORx99dPy69957L3bs2IHa2loMHz48Lbf/xS9+8bANVXfs27cPn3zyCQoLC1FWVnbYz7/yla8cdtm//vUveL1elJaWYs2aNQm9gwYNQl1dXfy/v/71r2P9+vWYM2cOLrroIsycOROnnHIKSkpKklyVoiiK0h260VEURVGMkpWVhaKiIixevBiTJk3C3LlzcfPNN+Opp54CALzzzju477778N3vfhdf/epX03a7Y8aMSfq6gUAAADB69OikXXv37gVw4LNAq1evTup25s2bh6eeegr3338/nnjiCfzud78DAEyePBnLly/HhRdemPQxK4qiKF3Rt64piqIoGeNLX/oS8vLy8Pe//z1+hrH33nsPHR0dqK6ujn9BaOxP7CQA06dPR15eHjZs2JD0bSV7ljgA8VeRmpubE/68qamp298555xz4PP5evxzMHPmzEFtbS0cDgc2bNiAG2+8Ebt27cIVV1yBLVu2JH3MiqIoSlf0FR1FURQlY+zbtw+BQACDBg2Kb0QmTpyIyy67LOH1X3rpJbjdblx4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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -287,7 +287,8 @@
}
],
"source": [
"show(pct2, feet2 / hours2, xlabel='Grade (percent)', ylabel='VAM (vertical feet per hour)')"
"show(pct2, feet2 / hours2, xlabel='Grade (percent)', \n",
" ylabel='VAM (vertical feet per hour)')"
]
},
{
@@ -307,7 +308,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -317,7 +318,8 @@
}
],
"source": [
"show(miles2 / hours2, feet2 / hours2, xlabel='Speed(mph)', ylabel='VAM (vertical feet per hour)')"
"show(miles2 / hours2, feet2 / hours2, xlabel='Speed(mph)', \n",
" ylabel='VAM (vertical feet per hour)')"
]
},
{
@@ -340,7 +342,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -359,7 +361,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"The green dotted line is where grade = speed, the red and blue lines are best-fit polynomials, and if I interpret \"regularly\" to mean \"around half the time,\" then both best-fit lines are above the diamond at 6%, but both are below the diamond for 7%, so my guess is confirmed: my hill-index is 6.\n",
"The green dotted line is where grade = speed, the red and blue lines are best-fit polynomials, and both best-fit lines are above the diamond at 6%, but both are below the diamond for 7%, so my guess is confirmed: my hill-index is 6.\n",
"\n",
"Note that the original h-index for publications is based on cumulative totals, so it can never decrease, but the Hill-index is based on an average so it can (and sadly, often does) decrease as you grow older."
]
@@ -372,9 +374,9 @@
"\n",
"# Eddington Number\n",
"\n",
"Speaking of h-numbers, the physicist Sir Arthur Eddington (1882-1944) was a pre-Strava bicyclist who favored this metric:\n",
"Speaking of h-numbers, the physicist [Sir Arthur Eddington](https://en.wikipedia.org/wiki/Arthur_Eddington) (1882-1944) was a pre-Strava bicyclist who favored this metric:\n",
"\n",
"> *Your [Eddington Number](https://www.triathlete.com/2011/04/training/measuring-bike-miles-eddington-number_301789) is the maximum integer**&nbsp;e** such that you have bicycled at least**&nbsp;e** miles on at least**&nbsp;e** days.*\n",
"> *Your [Eddington Number](https://www.triathlete.com/2011/04/training/measuring-bike-miles-eddington-number_301789) is the maximum integer **e** such that you have bicycled at least**&nbsp;e** miles on at least**&nbsp;e** days.*\n",
"\n",
"Let's calculate mine:"
]
@@ -387,7 +389,7 @@
{
"data": {
"text/plain": [
"57"
"58"
]
},
"execution_count": 13,
@@ -397,7 +399,8 @@
],
"source": [
"def Eddington(distances) -> int:\n",
" \"Eddington number: the maximum integer e such that you have bicycled at least e on at least e days.\"\n",
" \"\"\"Eddington number: The maximum integer e such that you have bicycled \n",
" a distance of at least e on at least e days.\"\"\"\n",
" distances = sorted(distances, reverse=True)\n",
" return max(e for e, d in enumerate(distances, 1) if d >= e)\n",
"\n",
@@ -408,15 +411,49 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"My **Eddington Number is 57**: I've done at least 57 miles on at least 57 days. This is a bit above [the mean for Strava users](https://swinny.net/Cycling/-4687-Calculate-your-Eddington-Number). Eddington was 62 years old when he died with a number of **84**, and his available roads, bicycles, and navigation aids were not nearly as nice as mine, so good for him.\n",
"My **Eddington Number is 58**: I've done at least 58 miles on at least 58 days. This is a bit above [the mean for Strava users](https://swinny.net/Cycling/-4687-Calculate-your-Eddington-Number), but not as good as Eddington himself: he was 62 years old when he died with a number of **84**, and his available roads, bicycles, and navigation aids were not nearly as nice as mine, so good for him.\n",
"\n",
"How many more rides would I need to improve my number? Obviously, for anyone to improve from, say, 57 to 60 they need at least 3 more rides. But any rides that were, say, 58 or 59 miles count for 57 but wouldn't count for 60; thus more than 3 rides may be needed. Here is a table of the number of rides I would need&mdash;what I'll call the *gap*&mdash;for increasingly ambitious Eddington numbers:"
"How many rides would I need to improve my number from 58 to 60? It must be 2, right? **Wrong!** Here's the problem:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Ride(miles=59.11, hours=5.0325, feet=3528.0, date='Sat, 10/31/2015', title='Saratoga Ramble'),\n",
" Ride(miles=58.81, hours=4.0633333333333335, feet=2467.0, date='Sat, 8/18/2018', title='Tour de Menlo'),\n",
" Ride(miles=58.69, hours=5.2572222222222225, feet=6742.0, date='Sat, 4/26/2014', title='OLH / Tunitas Creek'),\n",
" Ride(miles=58.42, hours=4.465, feet=4431.0, date='Sat, 6/15/2013', title='Palo Alto to Santa Cruz'),\n",
" Ride(miles=58.29, hours=5.089722222222222, feet=6044.0, date='Sat, 10/11/2014', title='OLH / Tunitas'),\n",
" Ride(miles=58.23, hours=3.8397222222222225, feet=4042.0, date='Sat, 7/9/2016', title='Santa Cruz')]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[r for r in rides if 58 <= r.miles <= 60]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These six rides all counted towards my Eddington number of 58, but don't count towards an Eddington number of 60, because they are all less than 60 miles long. So I would need to replace all of these rides with 60+ mile rides before I get an Eddington number of 60. \n",
"\n",
"The following chart tells me how many rides I have to go&mdash;what I call the **Eddington Gap**&mdash;to reach various Eddington numbers:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
@@ -424,20 +461,19 @@
"text": [
"Dist Days Gap\n",
"---- ---- ---\n",
" 57 58 -1\n",
" 58 55 3\n",
" 59 50 9\n",
" 60 49 11\n",
" 61 43 18\n",
" 62 41 21\n",
" 63 39 24\n",
" 64 37 27\n",
" 65 35 30\n",
" 66 33 33\n",
" 67 28 39\n",
" 68 26 42\n",
" 69 21 48\n",
" 70 20 50\n"
" 58 60 -2\n",
" 59 55 4\n",
" 60 54 6\n",
" 61 48 13\n",
" 62 46 16\n",
" 63 44 19\n",
" 64 42 22\n",
" 65 40 25\n",
" 66 38 28\n",
" 67 32 35\n",
" 68 30 38\n",
" 69 24 45\n",
" 70 23 47\n"
]
}
],
@@ -450,21 +486,19 @@
" days = sum(d >= target for d in distances)\n",
" print(f'{target:4} {days:4} {target - days:3}')\n",
" \n",
"Egaps(miles, range(57, 71))"
"Egaps(miles, range(58, 71))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I'd like to get my Eddington number to meet or beat my age. If I do two 65+ mile rides per month, I'll make it before I turn 65.\n",
"\n",
"An easy way to get bigger Eddington numbers is to use kilometers rather than miles:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 16,
"metadata": {},
"outputs": [
{
@@ -473,7 +507,7 @@
"81"
]
},
"execution_count": 15,
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
@@ -486,7 +520,7 @@
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 17,
"metadata": {},
"outputs": [
{
@@ -495,26 +529,26 @@
"text": [
"Dist Days Gap\n",
"---- ---- ---\n",
" 81 82 -1\n",
" 82 74 8\n",
" 83 73 10\n",
" 84 68 16\n",
" 85 67 18\n",
" 86 66 20\n",
" 87 64 23\n",
" 88 63 25\n",
" 89 62 27\n",
" 90 61 29\n",
" 91 59 32\n",
" 92 58 34\n",
" 93 55 38\n",
" 94 53 41\n",
" 95 50 45\n",
" 96 49 47\n",
" 97 46 51\n",
" 98 43 55\n",
" 99 41 58\n",
" 100 41 59\n"
" 81 87 -6\n",
" 82 79 3\n",
" 83 78 5\n",
" 84 73 11\n",
" 85 72 13\n",
" 86 71 15\n",
" 87 69 18\n",
" 88 68 20\n",
" 89 67 22\n",
" 90 66 24\n",
" 91 64 27\n",
" 92 63 29\n",
" 93 60 33\n",
" 94 58 36\n",
" 95 55 40\n",
" 96 54 42\n",
" 97 51 46\n",
" 98 48 50\n",
" 99 46 53\n",
" 100 46 54\n"
]
}
],
@@ -526,14 +560,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"My **metric Eddington Number is 81**, and I should be able to get to 90 in about a year, and 100 in two or three years, assuming around two 100+ km rides per month.\n",
"My **metric Eddington Number is 81**.\n",
"\n",
"Here is my Eddington number progress over the years, in miles and kms:"
"Here is my Eddington number progress over the years, in miles and kms, from when I first started tracking rides:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"execution_count": 18,
"metadata": {},
"outputs": [
{
@@ -542,14 +576,13 @@
"text": [
"Year E_ml E_km\n",
"---- ----- -----\n",
"2013 23 27\n",
"2014 34 45\n",
"2015 41 60\n",
"2016 46 65\n",
"2017 50 72\n",
"2018 53 75\n",
"2019 54 78\n",
"2020 57 81\n"
"2020 58 81\n"
]
}
],
@@ -562,24 +595,18 @@
" print('---- ----- -----')\n",
" for y in years:\n",
" miles = np.array([r.miles for r in rides if year(r) <= y])\n",
" print(f'{y} {Eddington(miles):5} {Eddington(miles * 1.609344):5}')\n",
" kms = 1.609344 * miles\n",
" print(f'{y} {Eddington(miles):5} {Eddington(kms):5}')\n",
" \n",
"Eprogress(range(2013, 2021))"
"Eprogress(range(2014, 2021))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Note:* the definition of Eddington Number seems to be mathematically precise, but there is an ambiguity: what does *day* mean? Does it mean daytime (sunrise to sunset)? Or calendar day (midnight to midnight)? Or any 24 hour period? I originally assumed it meant calendar date, but I wanted to make an exception for times when I rode with my gear to a camping site, spent the night there, and rode back home the next morning, what bikepackers call a [sub 24 hour overnight (S24O)](https://oneofsevenproject.com/s24o-bikepacking-guide/) ride. And then COVID struck, the camping sites closed, and I further relaxed the definition to allow an S24O ride where I sleep in my own home. I realize Eddington had a lot more hardships than we have (e.g. World War I and World War II), but I hope he would approve of this slight accomodation."
"*Note:* the definition of Eddington Number seems to be mathematically precise, but there is an ambiguity: what exactly does the word ***day*** mean? The New Oxford dictionary mentions (a) \"a period of 24 hours\"; (b) \"a unit of time, reckoned from one midnight to the next\"; and (c) \"the part of a day when it is light\". I originally assumed ***day*** meant \"one midnight to the next,\" but I wanted to make an exception for bikepacking trips where I rode to a camping site in the afternoon, spent the night there, and rode back home the next morning; what bikepackers call a [sub 24 hour overnight (S24O)](https://oneofsevenproject.com/s24o-bikepacking-guide/). I thought that should count as a valid trip. And then COVID struck, the camping sites closed, and I further relaxed the definition to allow an S24O ride where I sleep in my own home, as long as the riding is in a 24 hour window. I realize Eddington had a lot more hardships than we have (the 1918 pandemic, World War I, and World War II), but I hope he would approve of this accomodation on my part."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
+16 -11
View File
@@ -1,5 +1,10 @@
#Ride Date Title mi ft
# 2020 Eddington rides only; most recent first
#2020: Eddington rides only; most recent first
Ride Thu, 7/23/2020 Bay / Tomas Aquino Trail 5:44:49 76.35 mi 1749 ft
Ride Sun, 7/19/2020 Saratoga / Mt Eden 5:49:45 70.43 mi 1,954 ft
Ride Sun, 7/12/2020 Calvares Rd / Niles / Dumbarton 5:30:10 68.23 mi 2,008 ft
Ride Sun, 7/5/2020 Afternoon Ride 5:16:20 66.07 mi 1,286 ft
Ride Fri, 7/3/2020 Sawyer Camp Trail 5:18:23 72.12 mi 1,890 ft
Ride Sun, 6/28/2020 Saratoga 5:31:44 71.01 mi 1,063 ft
Ride Sun, 6/21/2020 Sawyer Camp Trail 6:35:20 79.78 mi 1,738 ft
Ride Sun, 6/13/2020 Canada Rd 5:39:40 70.73 mi 1,841 ft
@@ -8,7 +13,7 @@ Ride Wed, 2/12/2020 Bay Trail 5:25:09 66.02 mi 572 ft
Ride Fri, 2/7/2020 Bay Trail / Cargill 6:07:23 74.04 mi 1,814 ft
Ride Sun, 1/26/2020 Los Gatos / Bay 5:18:15 67.98 mi 1,286 ft
Ride Fri, 1/31/2020 Bay Trail / Guadalupe / Geocaching 5:21:39 69.39 mi 1,125 ft
# 2019 Mostly Eddington; some 25+ mile rides
#2019: Mostly Eddington; some 25+ mile rides
Ride Sun, 6/2/2019 The Sequoia 6:40:43 77.51 mi 6,467 ft
Ride Sat, 6/8/2019 Morning Ride 2:53:08 34.42 mi 1,824 ft
Ride Sat, 6/15/2019 Morning Ride 2:29:38 29.98 mi 1,785 ft
@@ -18,7 +23,7 @@ Ride Sat, 8/24/2019 Tour de Fox 4:43:39 68.66 mi 2,097 ft
Ride Sat, 8/31/2019 San Gregorio via OLH 5:13:21 65.31 mi 4,026 ft
Ride Fri, 9/6/2019 San Mateo / Bay Trail 4:59:29 68.01 mi 1,158 ft
Ride Sat, 11/16/2019 Canada / Crystal Dam / Sawyer Camp / Bay Trail 5:18:46 66.08 mi 1,972 ft
# 2012 to 2018 rides over 25 miles
#2012 to 2018: rides over 25 miles
Ride Fri, 1/9/2012 Otago Rail Trail 8:00:00 101.00 mi 2,200 ft
Ride Thu, 6/14/2012 Coyote Creek Century with Juliet 8:08:15 100.07 mi 1,513 ft
Ride Sat, 5/13/2017 Morgan Hill iCare Classic 7:27:21 100.05 mi 4,596 ft
@@ -50,15 +55,15 @@ Ride Sat, 4/18/2015 Tunitas + Lobitos Creeks 5:14:38 61.27 mi 6,611 ft
Ride Sat, 11/11/2017 Los Gatos / Bay Trail 4:26:24 60.74 mi 1,316 ft
Ride Sun, 4/17/2016 La Honda / Skyline 5:10:41 60.35 mi 4,551 ft
Ride Mon, 7/3/2017 Los Gatos / Bay Trail 4:25:41 60.28 mi 1,329 ft
Ride Sat, 4/16/2016 OLH - San Gregorio - Tunitas 4:57:40 60.12 mi 4,744 ft
Ride Sat, 4/16/2016 OLH / San Gregorio / Tunitas 4:57:40 60.12 mi 4,744 ft
Ride Sun, 1/29/2017 Los Gatos / Guadalupe / San Tomas / Bay Trails 4:33:38 60.11 mi 1,447 ft
Ride Mon, 11/26/2018 Lunch Ride Los Gatos 4:21:35 60.03 mi 1,070 ft
Ride Sat, 10/31/2015 Saratoga Ramble 5:01:57 59.10 mi 3,528 ft
Ride Sat, 10/31/2015 Saratoga Ramble 5:01:57 59.11 mi 3,528 ft
Ride Sat, 8/18/2018 Tour de Menlo 4:03:48 58.81 mi 2,467 ft
Ride Sat, 4/26/2014 OLH - Tunitas Creek 5:15:26 58.69 mi 6,742 ft
Ride Sat, 4/26/2014 OLH / Tunitas Creek 5:15:26 58.69 mi 6,742 ft
Ride Sat, 6/15/2013 Palo Alto to Santa Cruz 4:27:54 58.42 mi 4,431 ft
Ride Sat, 10/11/2014 OLH / La Honda / Tunitas 5:05:23 58.29 mi 6,044 ft
Ride Sat, 7/9/2016 Lunch Ride 3:50:23 58.23 mi 4,042 ft
Ride Sat, 10/11/2014 OLH / Tunitas 5:05:23 58.29 mi 6,044 ft
Ride Sat, 7/9/2016 Santa Cruz 3:50:23 58.23 mi 4,042 ft
Ride Wed, 6/18/2014 Sierra to the Sea Day 4 4:57:53 57.64 mi 5,561 ft
Ride Tue, 7/7/2015 07/07/2015 Palo Alto, CA 4:13:20 57.60 mi 1,280 ft
Ride Mon, 8/6/2018 Bike Ride Northwest Day 2 4:35:48 57.58 mi 4,514 ft
@@ -66,7 +71,7 @@ Ride Fri, 6/20/2014 Sierra to the Sea Day 6 4:33:39 56.91 mi 4,453 ft
Ride Sat, 6/10/2017 Los Gatos / Creek Trails 3:50:24 56.28 mi 1,365 ft
Ride Sat, 3/4/2017 Lunch Ride 3:58:25 56.26 mi 1,378 ft
Ride Sun, 8/5/2018 Bike Ride Northwest Day 1 3:34:42 55.77 mi 1,824 ft
Ride Sat, 8/13/2016 Petaluma - Point Reyes 4:30:12 54.75 mi 5,286 ft
Ride Sat, 8/13/2016 Petaluma / Point Reyes 4:30:12 54.75 mi 5,286 ft
Ride Sun, 6/7/2015 Tour de Cure 3:59:47 54.65 mi 2,748 ft
Ride Wed, 12/16/2015 Los Gatos 4:00:41 53.86 mi 2,595 ft
Ride Fri, 6/2/2017 Morning Ride 3:57:45 53.49 mi 1,375 ft
@@ -157,7 +162,7 @@ Ride Sun, 1/25/2015 Canada Rd 2:45:51 39.99 mi 1,772 ft
Ride Sat, 6/21/2014 Sierra to the Sea Day 7 3:36:53 39.77 mi 3,325 ft
Ride Sat, 9/23/2017 Canada / Crestview 3:25:13 39.77 mi 2,444 ft
Ride Fri, 12/27/2013 OLH to Page Mill 3:24:14 39.73 mi 3,365 ft
Ride Fri, 10/30/2015 OLH - West Alpine 3:28:46 39.51 mi 4,505 ft
Ride Fri, 10/30/2015 OLH / West Alpine 3:28:46 39.51 mi 4,505 ft
Ride Sat, 9/5/2015 Ring of Fire 3:31:55 39.18 mi 3,553 ft
Ride Wed, 8/28/2013 Train Track Crash 2:50:55 39.16 mi 928 ft
Ride Sun, 2/22/2015 Canada Rd Plus 2:57:25 39.14 mi 1,834 ft
@@ -449,7 +454,7 @@ Ride Thu, 6/8/2017 Morning Ride 1:56:19 25.02 mi 285 ft
Ride Thu, 10/13/2016 Morning Ride 1:47:30 25.02 mi 253 ft
Ride Sun, 1/19/2014 01/19/2014 Palo Alto, CA 1:36:55 25.01 mi 1,201 ft
Ride Mon, 9/5/2016 Afternoon Ride 1:42:56 25.00 mi 902 ft
Ride Sat, 11/8/2014 Atherton - Woodside 1:40:51 25.00 mi 972 ft
Ride Sat, 11/8/2014 Atherton / Woodside 1:40:51 25.00 mi 972 ft
# 2013: Rides in the 20 to 25 mile range
Ride Sat, 6/1/2013 Woodside Loop 1:41:20 24.45 mi 1,125 ft
Ride Sun, 6/16/2013 Woodside Loop 1:38:19 24.52 mi 1,137 ft
1 #Ride Date Title mi ft
2 # #2020: Eddington rides only; most recent first
3 Ride Thu, 7/23/2020 Bay / Tomas Aquino Trail 5:44:49 76.35 mi
4 Ride Sun, 7/19/2020 Saratoga / Mt Eden 5:49:45 70.43 mi
5 Ride Sun, 7/12/2020 Calvares Rd / Niles / Dumbarton 5:30:10 68.23 mi
6 Ride Sun, 7/5/2020 Afternoon Ride 5:16:20 66.07 mi
7 Ride Fri, 7/3/2020 Sawyer Camp Trail 5:18:23 72.12 mi
8 Ride Sun, 6/28/2020 Saratoga 5:31:44 71.01 mi
9 Ride Sun, 6/21/2020 Sawyer Camp Trail 6:35:20 79.78 mi
10 Ride Sun, 6/13/2020 Canada Rd 5:39:40 70.73 mi
13 Ride Fri, 2/7/2020 Bay Trail / Cargill 6:07:23 74.04 mi
14 Ride Sun, 1/26/2020 Los Gatos / Bay 5:18:15 67.98 mi
15 Ride Fri, 1/31/2020 Bay Trail / Guadalupe / Geocaching 5:21:39 69.39 mi
16 # #2019: Mostly Eddington; some 25+ mile rides
17 Ride Sun, 6/2/2019 The Sequoia 6:40:43 77.51 mi
18 Ride Sat, 6/8/2019 Morning Ride 2:53:08 34.42 mi
19 Ride Sat, 6/15/2019 Morning Ride 2:29:38 29.98 mi
23 Ride Sat, 8/31/2019 San Gregorio via OLH 5:13:21 65.31 mi
24 Ride Fri, 9/6/2019 San Mateo / Bay Trail 4:59:29 68.01 mi
25 Ride Sat, 11/16/2019 Canada / Crystal Dam / Sawyer Camp / Bay Trail 5:18:46 66.08 mi
26 # #2012 to 2018: rides over 25 miles
27 Ride Fri, 1/9/2012 Otago Rail Trail 8:00:00 101.00 mi
28 Ride Thu, 6/14/2012 Coyote Creek Century with Juliet 8:08:15 100.07 mi
29 Ride Sat, 5/13/2017 Morgan Hill iCare Classic 7:27:21 100.05 mi
55 Ride Sat, 11/11/2017 Los Gatos / Bay Trail 4:26:24 60.74 mi
56 Ride Sun, 4/17/2016 La Honda / Skyline 5:10:41 60.35 mi
57 Ride Mon, 7/3/2017 Los Gatos / Bay Trail 4:25:41 60.28 mi
58 Ride Sat, 4/16/2016 OLH - San Gregorio - Tunitas OLH / San Gregorio / Tunitas 4:57:40 60.12 mi
59 Ride Sun, 1/29/2017 Los Gatos / Guadalupe / San Tomas / Bay Trails 4:33:38 60.11 mi
60 Ride Mon, 11/26/2018 Lunch Ride Los Gatos 4:21:35 60.03 mi
61 Ride Sat, 10/31/2015 Saratoga Ramble 5:01:57 59.10 mi 59.11 mi
62 Ride Sat, 8/18/2018 Tour de Menlo 4:03:48 58.81 mi
63 Ride Sat, 4/26/2014 OLH - Tunitas Creek OLH / Tunitas Creek 5:15:26 58.69 mi
64 Ride Sat, 6/15/2013 Palo Alto to Santa Cruz 4:27:54 58.42 mi
65 Ride Sat, 10/11/2014 OLH / La Honda / Tunitas OLH / Tunitas 5:05:23 58.29 mi
66 Ride Sat, 7/9/2016 Lunch Ride Santa Cruz 3:50:23 58.23 mi
67 Ride Wed, 6/18/2014 Sierra to the Sea Day 4 4:57:53 57.64 mi
68 Ride Tue, 7/7/2015 07/07/2015 Palo Alto, CA 4:13:20 57.60 mi
69 Ride Mon, 8/6/2018 Bike Ride Northwest Day 2 4:35:48 57.58 mi
71 Ride Sat, 6/10/2017 Los Gatos / Creek Trails 3:50:24 56.28 mi
72 Ride Sat, 3/4/2017 Lunch Ride 3:58:25 56.26 mi
73 Ride Sun, 8/5/2018 Bike Ride Northwest Day 1 3:34:42 55.77 mi
74 Ride Sat, 8/13/2016 Petaluma - Point Reyes Petaluma / Point Reyes 4:30:12 54.75 mi
75 Ride Sun, 6/7/2015 Tour de Cure 3:59:47 54.65 mi
76 Ride Wed, 12/16/2015 Los Gatos 4:00:41 53.86 mi
77 Ride Fri, 6/2/2017 Morning Ride 3:57:45 53.49 mi
162 Ride Sat, 6/21/2014 Sierra to the Sea Day 7 3:36:53 39.77 mi
163 Ride Sat, 9/23/2017 Canada / Crestview 3:25:13 39.77 mi
164 Ride Fri, 12/27/2013 OLH to Page Mill 3:24:14 39.73 mi
165 Ride Fri, 10/30/2015 OLH - West Alpine OLH / West Alpine 3:28:46 39.51 mi
166 Ride Sat, 9/5/2015 Ring of Fire 3:31:55 39.18 mi
167 Ride Wed, 8/28/2013 Train Track Crash 2:50:55 39.16 mi
168 Ride Sun, 2/22/2015 Canada Rd Plus 2:57:25 39.14 mi
454 Ride Thu, 10/13/2016 Morning Ride 1:47:30 25.02 mi
455 Ride Sun, 1/19/2014 01/19/2014 Palo Alto, CA 1:36:55 25.01 mi
456 Ride Mon, 9/5/2016 Afternoon Ride 1:42:56 25.00 mi
457 Ride Sat, 11/8/2014 Atherton - Woodside Atherton / Woodside 1:40:51 25.00 mi
458 # 2013: Rides in the 20 to 25 mile range
459 Ride Sat, 6/1/2013 Woodside Loop 1:41:20 24.45 mi
460 Ride Sun, 6/16/2013 Woodside Loop 1:38:19 24.52 mi