Add files via upload

This commit is contained in:
Peter Norvig 2021-12-14 17:36:41 -08:00 committed by GitHub
parent 3d9fede756
commit d289d5bac8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 4610 additions and 128 deletions

4219
ipynb/Bike-Stats.ipynb Normal file

File diff suppressed because one or more lines are too long

View File

@ -32,7 +32,7 @@
"source": [
"# Reading Data: `rides`\n",
"\n",
"I downloaded a bunch of my recorded [Strava](https://www.strava.com/athletes/575579) rides, most of them longer than 25 miles (with a few exceptions), as [`bikerides.tsv`](bikerides.tsv). The columns are: the date; the year; a title; the elapsed time of the ride; the length of the ride in miles; and the total climbing in feet, e.g.: \n",
"I saved a bunch of my recorded [Strava](https://www.strava.com/athletes/575579) rides, most of them longer than 25 miles, as [`bikerides.tsv`](bikerides.tsv). The columns are: the date; the year; a title; the elapsed time of the ride; the length of the ride in miles; and the total climbing in feet, e.g.: \n",
"\n",
" Mon, 10/5\t2020\tHalf way around the bay on bay trail\t6:26:35\t80.05\t541\n",
" \n",
@ -45,6 +45,11 @@
"metadata": {},
"outputs": [],
"source": [
"def parse_rides(lines):\n",
" \"\"\"Parse a bikerides.tsv file.\"\"\"\n",
" return add_columns(pd.read_table(lines, comment='#',\n",
" converters=dict(hours=parse_hours, feet=parse_int)))\n",
"\n",
"def parse_hours(time: str) -> float: \n",
" \"\"\"Parse '4:30:00' => 4.5 hours.\"\"\"\n",
" while time.count(':') < 2: \n",
@ -53,13 +58,15 @@
"\n",
"def parse_int(field: str) -> int: return int(field.replace(',', ''))\n",
"\n",
"def add_derived_columns(rides) -> pd.DataFrame:\n",
"def add_columns(rides) -> pd.DataFrame:\n",
" \"\"\"Compute new columns from existing ones.\"\"\"\n",
" mi, hr, ft = rides['miles'], rides['hours'], rides['feet']\n",
" return rides.assign(\n",
" mph=round(rides['miles'] / rides['hours'], 2),\n",
" vam=round(rides['feet'] / rides['hours']),\n",
" fpm=round(rides['feet'] / rides['miles']),\n",
" pct=round(rides['feet'] / rides['miles'] * 100 / 5280, 2),\n",
" kms=round(rides['miles'] * 1.609, 2))"
" mph=round(mi / hr, 2),\n",
" vam=round(ft / hr / 3.28084),\n",
" fpm=round(ft / mi),\n",
" pct=round(ft / mi * 100 / 5280, 2),\n",
" kms=round(mi * 1.609, 2))"
]
},
{
@ -68,8 +75,7 @@
"metadata": {},
"outputs": [],
"source": [
"rides = add_derived_columns(pd.read_table(open('bikerides.tsv'), comment='#',\n",
" converters=dict(hours=parse_hours, feet=parse_int)))"
"rides = parse_rides(open('bikerides.tsv'))"
]
},
{
@ -91,13 +97,15 @@
"metadata": {},
"outputs": [],
"source": [
"def parse_segments(lines):\n",
"def parse_segments(lines) -> pd.DataFrame:\n",
" \"\"\"Parse segments into rides. Each ride is a tuple of:\n",
" (segment_title, time, miles, feet_climb).\"\"\"\n",
" records = []\n",
" for segment in lines:\n",
" title, mi, ft, *times = segment.split(',')[:5]\n",
" for time in times:\n",
" yield title, parse_hours(time), float(mi), parse_int(ft)"
" records.append((title, parse_hours(time), float(mi), parse_int(ft)))\n",
" return add_columns(pd.DataFrame(records, columns=('title', 'hours', 'miles', 'feet')))"
]
},
{
@ -106,9 +114,7 @@
"metadata": {},
"outputs": [],
"source": [
"segments = add_derived_columns(pd.DataFrame(\n",
" parse_segments(open('bikesegments.csv')), \n",
" columns='title\thours\tmiles\tfeet'.split()))"
"segments = parse_segments(open('bikesegments.csv'))"
]
},
{
@ -135,7 +141,7 @@
" def __str__(self): return f'{(self - 1) // 12}-{(self % 12) or 12:02d}'\n",
"\n",
"start = Month(2020 * 12 + 7) # Starting month: July 2020\n",
"bonuses = (25, 90, 99) # Percents the earn important bonuses\n",
"bonuses = (0.1, 25, 90, 99) # Percents the earn important bonuses\n",
"\n",
"Entry = Tuple[str, float, List[float]] # (Place_Name, miles_of_roads, [pct_by_month,...])\n",
"\n",
@ -149,10 +155,6 @@
" X = [dates[i] for i in range(N) if pcts[i]]\n",
" Y = [pcts[i] for i in range(N) if pcts[i]]\n",
" ax.plot(X, Y, ':', marker=marker, label=label(pcts, place, miles))\n",
" all_pcts = [p for _, _, pcts in entries for p in pcts if p]\n",
" for p in bonuses: \n",
" if min(all_pcts) < p < max(all_pcts):\n",
" ax.plot(dates, [p] * N, 'k:', lw=1, alpha=3/4) # Plot bonus line\n",
" ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), shadow=True,\n",
" prop=matplotlib.font_manager.FontProperties(family='monospace'))\n",
" plt.xticks(dates, [str(d) for d in dates], rotation=90)\n",
@ -210,6 +212,13 @@
"places = parse_places(open('bikeplaces.txt'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Updating `bikeplaces.txt` to a new month"
]
},
{
"cell_type": "code",
"execution_count": 8,
@ -217,9 +226,11 @@
"outputs": [],
"source": [
"def update_places(filename='bikeplaces.txt'):\n",
" \"\"\"Print an update of the bikeplaces.txt file by adding a new month.\"\"\"\n",
" return ''.join(map(update_line, open(filename)))\n",
"\n",
"def update_line(line):\n",
" \"\"\"Update a line by adding a new month with the same % as the previous.\"\"\"\n",
" words = line.split()\n",
" if not words or words[0].startswith(':'):\n",
" pass\n",
@ -231,6 +242,157 @@
" return ' '.join(words) + '\\n'"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
":Complete!:\n",
"Atherton: 56.0: 0*4 91.2 94.0 | 95.2*2 94.2 94.9 96.2*2 98.7 99.5 99.19 99.3*2\n",
"Kensington Square: 0.6: 86.9 100*5 | 100*4 99.9*4 99.99*3\n",
"Menlo Oaks: 3.5: 0*4 98.4 99.7 | 99.7*4 100*4 99.99*3\n",
"West Menlo Park: 11.2: 0*4 97.5 98.1 | 98.1*3 99.3 99.7*2 100*2 99.99*3\n",
"North Fair Oaks: 26.7: 78.1 90.4 93.1 93.8 94.8 96.1 | 96.9*2 99.1*6 99.17*3\n",
"Sequoia Tract: 11.5: 0*4 72.8 82.3 | 92.5*4 96.4*2 97.5 98.2 99.4*3\n",
"East Palo Alto: 47.6: 74.4 91.2 91.9*2 92.2 93.3 | 93.4*2 92.4*2 92.5*4 95.0 99.2*2\n",
"\n",
":Over 90%:\n",
"Los Altos: 139.6: 40.2 43.7 72.4 77.2 84.5 90.8 | 91.0*2 91.1*2 91.2 90.4*3 90.63 90.9*2\n",
"Emerald Lake Hills: 24.6: 0.0 94.3*3 44.7 51.0 | 80.0 85.8 91.3*6 92.2*3\n",
"Menlo Park: 141.1: 67.7 76.8 87.7 90.7 91.2 90.1 | 92.5*2 91.4 91.6*3 91.8*2 93.5 94.7*2\n",
"Mountain View: 211.8: 53.0 59.9 63.0 63.6 72.9 77.1 | 91.1*4 92.3*4 91.12 93.5*2\n",
"Palo Alto: 298.8: 63.0 73.6 85.4 85.7 87.1 87.6 | 88.1*2 90.3 90.4 90.5 90.6*2 90.7 89.8 91.3*2\n",
"Loyola: 18.3: 0*4 60.8 62.1 | 62.1*4 91.5 90.6 91.3*2\n",
"Palomar Park: 4.1: 0*6 | 91.1*2 94.9*6 98.1*3\n",
"Syline Ridge OSP: 0.8: 0*6 | 0*9 91.5*2\n",
"\n",
":Between 33% and 90%:\n",
"Monte Sereno: 20.4: 20.5*6 | 20.5 39.8*3 44.1*7\n",
"Burlingame: 88.4: 9.4*6 | 9.4 31.5*3 35.5*7\n",
"Los Altos Hills: 91: 48.4*2 49.0 55.1*2 55.4 | 55.8*4 54.0*2 56.4 59.0*2 62.1*2\n",
"Portola Valley: 59: 0*4 57.3 59.8 | 59.8*2 61.0*2 66.2 66.4 67.4 70.3 72.0*2\n",
"Redwood City: 242.2: 34.0 39.1 46.0 51.6 56.9 60.8 | 62.9*2 65.1*2 66.3 66.7 67.0*2 75.0 77.9*2\n",
"San Carlos: 99: 22.2 26.0 32.9 32.9 37.2 39.0 | 40.5*2 41.4*2 41.0 41.7*6\n",
"Woodside: 75.2: 51.9*2 52.3*3 54.0 | 56.1*4 62.2 65.8 81.8 84.3 85.5*3\n",
"Ladera: 8.0: 0*4 30.5 29.8 | 29.8*2 47.6*2 44.5*2 50.6*3 82.1*2\n",
"Los Trancos Woods: 5.3: 0*4 71.4*2 | 71.4*4 74.9 75.0*6\n",
"Sky Londa: 11.8: 0*4 72.1*2 | 73.2*4 75.4 75.5*4 83.4*2\n",
"Foster City: 150: 9.1*6 | 9.1 27.4 37.2*2 38.7*5 34.3*2\n",
"Burlingame Hills: 6: 0*6 | 0.8 34.5*3 35.5*7\n",
"\n",
":Between 25% and 33%:\n",
"Newark: 147: 15*3 17*3 | 18.7 26.8 30.8*9\n",
"Millbrae: 65: 0*6 | 0 18.4 31.6*2 32.8*7\n",
"Cupertino: 172: 22.1 23.9 26.2*3 26.3 | 26.4*4 26.5*4 29.5 29.7*2\n",
"Belmont: 98.1: 15.5 17.3 18.6 18.6 20.6*2 | 27.4*2 27.5*2 27.3 27.4*4 27.5*2\n",
"Campbell: 119: 8.9 10.1 12.4*4 | 12.4 25.2 26.5*4 26.8 28.3*2\n",
"Hillsborough: 85.3: 3.3*6 | 3.6 24.5 25.3*6 25.5*3\n",
"Los Gatos: 148: 7.5 8.6 8.8*4 | 8.8 26.1*3 28.2*5 28.6*2\n",
"San Mateo: 256: 11.1*6 | 11.3 25.5 27.8*9\n",
"Saratoga: 180: 14.5 15.7 17.4*4 | 17.4 26.9*3 27.2*7\n",
"Sunnyvale: 357: 19.4 19.9 22.2*4 | 25.1*3 25.8 25.9*5 31.0*2\n",
"Union City: 208.8: 7*3 8*3 | 8.8*2 25.7*2 26.7*7\n",
"Fremont: 780.2: 9*3 10*3 | 11.7*2 27.5 28.1*8\n",
"San Mateo Highlands: 18: 0*6 | 18.0 29.2*3 28.0*7\n",
"Santa Clara: 348: 6.4*2 9.6*4 | 9.6*3 26.6*5 28.8 29.4*2\n",
"San Bruno: 114: 0*6 | 0*3 25.4*5 25.5*3\n",
"Milpitas: 224: 2.2*4 4.4*2 | 4.4*3 26.6 27.2*5 29.5*2\n",
"\n",
":A Few Places Below 25%:\n",
"Half Moon Bay: 68: 0*6 | 8.9*11\n",
"Emeryville: 28.1: 0*6 | 5.5*4 7.0*7\n",
"Hayward: 444.5: 0*6 | 4.6*4 5.1*7\n",
"Berkeley: 260.3: 5.0*3 7.0*3 | 7.0*11\n",
"Albany: 42.7: 0*6 | 0*4 6.6*7\n",
"\n",
":San Jose Neighborhoods:\n",
"San Jose: 2618.7: 1.3 1.36 5.3*4 | 5.4*3 6.7 11.9 13.1 18.2 19.8 23.1 25.6*2\n",
"Spartan Keyes: 64.3: 0*6 | 22.1*6 38.9 39.0 35.74 35.8*2\n",
"Willow Glen: 81.6: 0*6 | 13.9*6 29.67 32.6 31.95 34.9*2\n",
"Gardner: 23.4: 0*6 | 0*6 22.6 40.5 39.69 43.9*2\n",
"Seven Trees: 40.9: 0*6 | 0*6 27.96 28.0 25.9*3\n",
"Edenvale: 30: 0*6 | 0*6 47.35*2 46.81 47.0*2\n",
"Parkview: 42.5: 0*6 | 0*6 30.32*2 27.8 32.1*2\n",
"Branham: 44.0: 0*6 | 0*6 26.5 27.9 27.75 32.1*2\n",
"Willow Glen South: 63.3: 0*6 | 0*6 22.3 30.6 29.23 30.2*2\n",
"Communications Hill: 27.8: 0*6 | 0*6 34.1*2 33.96 37.2*2\n",
"\n",
":San Francisco Neighborhoods Over 25%:\n",
"Golden Gate Park: 40.8: 0*6 | 25.6*8 37.8*3\n",
"Lincoln Park: 4.5: 0*6 | 43*8 35.4*3\n",
"Presidio National Park: 43.5: 0*6 | 21.1*4 24.4*4 27.7*3\n",
"Presidio Terrace: 2.8: 0*6 | 37.0*8 43.7*3\n",
"Seacliff: 4.1: 0*6 | 23.1*8 30.7*3\n",
"South Beach: 4.8: 0*6 | 28.2*4 39.6*7\n",
"Lake Street: 3.9: 0*6 | 0*8 36.8*3\n",
"\n",
":San Francisco Neighborhoods Under 25%:\n",
"Little Hollywood: 3.7: 0*6 | 0*4 15.4*7\n",
"Mission Bay: 13.8: 0*6 | 0*4 9.3*7\n",
"Sutro Heights: 7.1: 0*6 | 0*4 14.0*7\n",
"Pacific Heights: 18: 0*6 | 10.8*11\n",
"Ashbury Heights: 3.7: 0*6 | 12.9*11\n",
"Clarendon Heights: 6: 0*6 | 14.3*11\n",
"Cow Hollow: 12: 0*6 |5*4 12.0*7\n",
"Financial District: 9.4: 0*6 |5.8*4 9.7*7\n",
"Golden Gate Heights: 17.8: 0*6 | 10.7*11\n",
"Polk Gulch: 4: 0*6 | 18.2*11\n",
"Presidio Heights: 6.5: 0*6 | 15.1*11\n",
"Aquatic Park / Fort Mason: 6.4: 0*6 | 0*4 14.9*7\n",
"Central Waterfront: 10.2: 0*6 | 0*4 6.7*7\n",
"Northern Waterfront: 5.6: 0*6 | 0*4 16.4*7\n",
"Dogpatch: 5.1: 0*6 | 0*4 12.4*7\n",
"Fisherman's Wharf: 6.2: 0*6 | 0*4 14.2*7\n",
"Balboa Terrace: 3.4: 0*6 | 18.2*11\n",
"Cole Valley: 1.7: 0*6 | 19.6*11\n",
"Forest Hill: 6.1: 0*6 | 15.7*11\n",
"\n",
":Far, Far Away:\n",
"Mokelumne Hill, Calaveras: 14.7: 28.9*6| 28.9*11\n",
"MIT, Cambridge, MA: 9.6: 37.2*6 | 37.2*11\n",
"Barangaroo, NSW: 1.7: 49.9*6 | 49.9*11\n",
"Dawes Point, NSW: 1.8: 29.2*6 | 29.2*11\n",
"Millers Point, NSW: 3.2: 38.2*6 | 38.2*11\n",
"Stinson Beach, Marin: 11.2: 9.2*6 | 9.2*11\n",
"Muir Beach, Marin: 4.6: 35.8*6 | 35.8*11\n",
"Corte Madera, Marin: 51: 0*6 | 0*4 13*7\n",
"Mill Valley, Marin: 92.2: 0*6 | 0*4 5.1*7\n",
"San Rafael, Marin: 260: 0*6 | 0*4 3.7*7\n",
"Sausalito, Marin: 32.7: 0*6 | 0*4 13.1*7\n",
"Cambridge, MA: 180.8: 6.4*6 | 6.4*11\n",
"Bodega Bay, Sonoma: 28.9: 18*6 | 18*11\n",
"Guerneville, Sonoma: 22.7: 23.4*6 | 23.4*11\n",
"Healdsburg, Sonoma: 53.7: 18.5*6 | 18.5*11\n",
"\n",
":California Bay Area Counties:\n",
"Contra Costa: 6052: 1.0*6 | 1.0*3 1.41*8\n",
"San Mateo: 3173: 20.1 21.2 22.9 23.4 24.57 25.53 | 26.43 30.0 31.27 32.24 32.54 32.98 33.48 33.56 34.51 34.7*2\n",
"Santa Clara: 7507: 12.7 13.6 15.4 15.6 16.04 16.29 | 16.78 17.73 18.15 20.0 21.1 22.53 24.45 25.05 25.96 27.76*2\n",
"Alameda: 5704: 3.3*3 3.94*3 | 4.73*2 7.06 7.14 7.34*7\n",
"Marin: 2322: 6.7*6 | 6.7*4 7.98*7\n",
"Napa: 1524: 5.1*6 | 5.1*11\n",
"Sonoma: 4556: 5.1*6 | 5.1*11\n",
"San Francisco: 1197: 4.5*6 | 4.5*4 5.47*4 6.4 6.51*2\n",
"Santa Cruz: 2767: 2.3*6 | 2.3*11\n",
"\n",
":California:\n",
"California: 371717: .712 .811 .846 .867 .8875 .8873 | .9054 .9624 1.0289 1.0758 1.1278 1.1386 1.1812 1.1939 1.2007 1.2524*2\n",
"\n",
":USA and Earth\n",
"USA: 6333164: .048 .052 .055 .05589 .0571 .05749 | .05853 .06183 .06553 .06824 0.07138 0.07200 0.07446 0.0752 0.07665 0.07904*2\n",
"Earth: 40818989: .008 .0089 .0091 .00936 .009535 .009536| .009597 .010136 .010561 .010997 .011349 0.011448 0.011839 0.011955 0.012024 0.0124113*2\n",
"\n"
]
}
],
"source": [
"#print(update_places()) #### Do this once a month and copy/paste the output"
]
},
{
"cell_type": "markdown",
"metadata": {},
@ -240,7 +402,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
@ -254,13 +416,39 @@
" \"\"\"The number of rides needed to reach an Eddington number target.\"\"\"\n",
" return target - sum(distances > target)\n",
"\n",
"def Ed_progress(years=range(2013, 2022), rides=rides) -> pd.DataFrame:\n",
"def Ed_gaps(rides, N=10) -> dict:\n",
" \"\"\"A table of gaps to Eddington numbers by year, and a plot.\"\"\"\n",
" E_km, E_mi = Ed_number(rides.kms), Ed_number(rides.miles)\n",
" data = [(E_km + d, Ed_gap(rides.kms, E_km + d), E_mi + d, Ed_gap(rides.miles, E_mi + d))\n",
" for d in range(N)]\n",
" frame = pd.DataFrame(data, columns=['kms', 'Ed gap (kms)', 'miles', 'Ed gap (miles)'])\n",
" figure, (ax1, ax2) = plt.subplots(1, 2)\n",
" frame.plot(ax=ax1, kind='line', x='kms', y='Ed gap (kms)', style='o:', grid=1,\n",
" title='Metric Eddington Gaps')\n",
" frame.plot(ax=ax2, kind='line', x='miles', y='Ed gap (miles)', style='o:', grid=1,\n",
" title='Eddington Gaps')\n",
" return frame\n",
"\n",
"def Ed_gaps(rides, N=10) -> dict:\n",
" \"\"\"A table of gaps to Eddington numbers by year, and a plot..\"\"\"\n",
" E_km, E_mi = Ed_number(rides.kms), Ed_number(rides.miles)\n",
" data = [(E_km + d, Ed_gap(rides.kms, E_km + d), E_mi + d, Ed_gap(rides.miles, E_mi + d))\n",
" for d in range(N)]\n",
" frame = pd.DataFrame(data, columns=['kms', 'Ed gap (kms)', 'miles', 'Ed gap (miles)'])\n",
" figure, (ax1, ax2) = plt.subplots(1, 2)\n",
" frame.plot(ax=ax1, kind='line', x='kms', y='Ed gap (kms)', style='o:', grid=1,\n",
" title='Metric Eddington Gaps')\n",
" frame.plot(ax=ax2, kind='line', x='miles', y='Ed gap (miles)', style='o:', grid=1,\n",
" title='Eddington Gaps')\n",
" return frame\n",
"\n",
"def Ed_progress(years=reversed(range(2013, 2022)), rides=rides) -> pd.DataFrame:\n",
" \"\"\"A table of Eddington numbers by year, and a plot.\"\"\"\n",
" def Ed(year, d): return Ed_number(rides[rides['year'] <= year][d])\n",
" data = [(y, Ed(y, 'kms'), Ed(y, 'miles')) for y in years]\n",
" frame = pd.DataFrame(data, columns=['year', 'Ed_km', 'Ed_mi'])\n",
" frame.plot('year', ['Ed_km', 'Ed_mi'], style='o:',\n",
" title='Eddington Numbers in kms and miles')\n",
" title=f'My Eddington Numbers: {Ed_number(rides.kms)} in kms, {Ed_number(rides.miles)} in miles')\n",
" grid(axis='y')\n",
" return frame"
]
@ -274,7 +462,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
@ -305,10 +493,58 @@
"\n",
"def estimate(miles, feet, estimator=estimator) -> float:\n",
" \"\"\"Given a ride distance in miles and total climb in feet, estimate time in minutes.\"\"\"\n",
" return 60 * miles / estimator(feet / miles)\n",
" return round(60 * miles / estimator(feet / miles))\n",
"\n",
"def top(frame, field, n=20): return frame.sort_values(field, ascending=False).head(n)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{6, 10}"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"class Acker:\n",
" def __init__(self, n=0):\n",
" self.HWM = n\n",
" self._set = {n}\n",
" \n",
" def ack(self, n):\n",
" if n <= self.HWM:\n",
" warn(f'duplicate ack of {n}')\n",
" else:\n",
" self._set.add(n)\n",
" while self.HWM + 1 in self._set:\n",
" self._set.remove(self.HWM)\n",
" self.HWM += 1\n",
"\n",
"A = Acker(3)\n",
"A.ack(5)\n",
"A.ack(6)\n",
"A.ack(10)\n",
"assert A.HWM == 3\n",
"A.ack(4)\n",
"assert A.HWM == 6\n",
"A._set\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {

View File

@ -1,116 +1,135 @@
:Complete!:
Atherton: 56.0: 0*4 91.2 94.0 | 95.2*2 94.2 94.9 96.2*2 98.7 99.5 99.19 99.3*2
Kensington Square: 0.6: 86.9 100*5 | 100*4 99.9*4 99.99*3
Menlo Oaks: 3.5: 0*4 98.4 99.7 | 99.7*4 100*4 99.99*3
West Menlo Park: 11.2: 0*4 97.5 98.1 | 98.1*3 99.3 99.7*2 100*2 99.99*3
North Fair Oaks: 26.7: 78.1 90.4 93.1 93.8 94.8 96.1 | 96.9*2 99.1*6 99.17*3
Sequoia Tract: 11.5: 0*4 72.8 82.3 | 92.5*4 96.4*2 97.5 98.2 99.4*3
East Palo Alto: 47.6: 74.4 91.2 91.9*2 92.2 93.3 | 93.4*2 92.4*2 92.5*4 95.0 99.2*2
:Over 90%:
Los Altos: 138: 40.2 43.7 72.4 77.2 84.5 90.8 | 91.0*2 91.1*3
Atherton: 55.7: 0*4 91.2 94.0 | 95.2*2 94.2 94.9*2
East Palo Alto: 46.5: 74.4 91.2 91.9*2 92.2 93.3 | 93.4*2 92.4*3
Emerald Lake Hills: 24.4: 0.0 94.3*3 44.7 51.0 | 80.0 85.8 91.3*3
Menlo Park: 136.4: 67.7 76.8 87.7 90.7 91.2 90.1 | 92.5*2 91.4 91.6*2
North Fair Oaks: 26.8: 48.1 90.4 93.1 93.8 94.8 96.1 | 96.9*2 99.1*3
Mountain View: 205: 53.0 59.9 63.0 63.6 72.9 77.1 | 91.1*5
Palo Alto: 292: 63.0 73.6 85.4 85.7 87.1 87.6 | 88.1*2 90.3 90.4*2
Loyola: 18.3: 0*4 60.8 62.1 | 62.1*4 88.6
Los Altos: 139.6: 40.2 43.7 72.4 77.2 84.5 90.8 | 91.0*2 91.1*2 91.2 90.4*3 90.63 90.9*2
Emerald Lake Hills: 24.6: 0.0 94.3*3 44.7 51.0 | 80.0 85.8 91.3*6 92.2*3
Menlo Park: 141.1: 67.7 76.8 87.7 90.7 91.2 90.1 | 92.5*2 91.4 91.6*3 91.8*2 93.5 94.7*2
Mountain View: 211.8: 53.0 59.9 63.0 63.6 72.9 77.1 | 91.1*4 92.3*4 91.12 93.5*2
Palo Alto: 298.8: 63.0 73.6 85.4 85.7 87.1 87.6 | 88.1*2 90.3 90.4 90.5 90.6*2 90.7 89.8 91.3 91.5
Loyola: 18.3: 0*4 60.8 62.1 | 62.1*4 91.5 90.6 91.3*2
Palomar Park: 4.1: 0*6 | 91.1*2 94.9*6 98.1*3
Syline Ridge OSP: 0.8: 0*6 | 0*9 91.5*2
Ladera: 8.0: 0*4 30.5 29.8 | 29.8*2 47.6*2 44.5*2 50.6*3 82.1 92.0
:Between 30% and 90%:
Foster City: 150: 9.1*6 | 9.1 27.4 37.2*3
Burlingame: 88.4: 9.4*6 | 9.4 31.5*4
Los Altos Hills: 91: 48.4*2 49.0 55.1*2 55.4 | 55.8*5
Millbrae: 65: 0*6 | 0 18.4 31.6*3
Monte Sereno: 20.4: 20.5*6 | 20.5 39.8*4
Portola Valley: 59: 0*4 57.3 59.8 | 59.8*2 61.0*3
Redwood City: 235.1: 34.0 39.1 46.0 51.6 56.9 60.8 | 62.9*2 65.1*3
San Carlos: 99: 22.2 26.0 32.9 32.9 37.2 39.0 | 40.5*2 41.4*3
Woodside: 75.2: 51.9*2 52.3*3 54.0 | 56.1*5
Newark: 147: 15*3 17*3 | 18.7 26.8 30.8*3
:Between 33% and 90%:
Monte Sereno: 20.4: 20.5*6 | 20.5 39.8*3 44.1*7
Burlingame: 88.4: 9.4*6 | 9.4 31.5*3 35.5*7
Los Altos Hills: 91: 48.4*2 49.0 55.1*2 55.4 | 55.8*4 54.0*2 56.4 59.0*2 62.1 62.5
Portola Valley: 59: 0*4 57.3 59.8 | 59.8*2 61.0*2 66.2 66.4 67.4 70.3 72.0*2
Redwood City: 242.2: 34.0 39.1 46.0 51.6 56.9 60.8 | 62.9*2 65.1*2 66.3 66.7 67.0*2 75.0 77.9*2
San Carlos: 99: 22.2 26.0 32.9 32.9 37.2 39.0 | 40.5*2 41.4*2 41.0 41.7*6
Woodside: 75.2: 51.9*2 52.3*3 54.0 | 56.1*4 62.2 65.8 81.8 84.3 85.5*3
Los Trancos Woods: 5.3: 0*4 71.4*2 | 71.4*4 74.9 75.0*6
Sky Londa: 11.8: 0*4 72.1*2 | 73.2*4 75.4 75.5*4 83.4*2
Foster City: 150: 9.1*6 | 9.1 27.4 37.2*2 38.7*5 34.3*2
Burlingame Hills: 6: 0*6 | 0.8 34.5*3 35.5*7
San Lorenzo: 55.5: 0*6 | 0*10 34.56
Newark: 147: 15*3 17*3 | 18.7 26.8 30.8*8 42.5
Millbrae: 65: 0*6 | 0 18.4 31.6*2 32.8*7
:Just Over 25%:
Belmont: 98.1: 15.5 17.3 18.6 18.6 20.6*2 | 27.4*2 27.5*3
Campbell: 119: 8.9 10.1 12.4*4 | 12.4 25.2*4
Cupertino: 172: 22.1 23.9 26.2*3 26.3 | 26.4*5
Hillsborough: 85.3: 3.3*6 | 3.6 24.5 25.3*3
Los Gatos: 148: 7.5 8.6 8.8*4 | 8.8 26.1*4
San Mateo: 256: 11.1*6 | 11.3 25.5 27.8*3
Saratoga: 180: 14.5 15.7 17.4*4 | 17.4 26.9*4
Sunnyvale: 357: 19.4 19.9 22.2*4 | 25.1*3 25.8*2
Union City: 208.8: 7*3 8*3 | 8.8*2 25.7*2 26.7
Fremont: 780.2: 9*3 10*3 | 11.7*2 27.5 28.1*2
San Mateo Highlands: 18: 0*6 | 18.0 29.2*4
Santa Clara: 348: 6.4*2 9.6*4 | 9.6*3 26.6*2
San Bruno: 114: 0*6 | 0*3 25.4*2
Milpitas: 224: 2.2*4 4.4*2 | 4.4*3 26.6*2
:Between 25% and 33%:
Cherryland: 20.9: 0*6 | 0*10 26.8
Cupertino: 172: 22.1 23.9 26.2*3 26.3 | 26.4*4 26.5*4 29.5 29.7*2
Belmont: 98.1: 15.5 17.3 18.6 18.6 20.6*2 | 27.4*2 27.5*2 27.3 27.4*4 27.5*2
Campbell: 119: 8.9 10.1 12.4*4 | 12.4 25.2 26.5*4 26.8 28.3*2
Hillsborough: 85.3: 3.3*6 | 3.6 24.5 25.3*6 25.5*3
Los Gatos: 148: 7.5 8.6 8.8*4 | 8.8 26.1*3 28.2*5 28.6*2
San Mateo: 256: 11.1*6 | 11.3 25.5 27.8*9
Saratoga: 180: 14.5 15.7 17.4*4 | 17.4 26.9*3 27.2*7
Sunnyvale: 357: 19.4 19.9 22.2*4 | 25.1*3 25.8 25.9*5 31.0*2
Union City: 208.8: 7*3 8*3 | 8.8*2 25.7*2 26.7*7
Fremont: 780.2: 9*3 10*3 | 11.7*2 27.5 28.1*7 28.8
San Mateo Highlands: 18: 0*6 | 18.0 29.2*3 28.0*7
Santa Clara: 348: 6.4*2 9.6*4 | 9.6*3 26.6*5 28.8 29.4*2
San Bruno: 114: 0*6 | 0*3 25.4*5 25.5*3
Milpitas: 224: 2.2*4 4.4*2 | 4.4*3 26.6 27.2*5 29.5*2
Hayward: 444.5: 0*6 | 4.6*4 5.1*6 26.3
Rosie the Riveter Park: 5.5: 0*6 | 0*4 29.3*7
:Just Getting Started:
Half Moon Bay: 68: 0*6 | 8.9*5
Emeryville: 28.1: 0*6 | 5.5*4 7.0
Hayward: 445.1: 0*6 | 4.6*4 5.1
San Jose: 2543: 1.3 1.36 5.3*4 | 5.4*3 6.7 8.4
Berkeley: 260.3: 5.0*3 7.0*3 | 7.0*5
San Rafael: 260: 0*6 | 0*4 3.7
Albany: 42.7: 0*6 | 0*4 6.6
Corte Madera: 51: 0*6 | 0*4 13
Mill Valley: 92.2: 0*6 | 0*4 5.1
Sausalito: 32.7: 0*6 | 0*4 13.1
:San Jose Neighborhoods:
San Jose: 2618.7: 1.3 1.36 5.3*4 | 5.4*3 6.7 11.9 13.1 18.2 19.8 23.1 25.6*2
Spartan Keyes: 64.3: 0*6 | 22.1*6 38.9 39.0 35.74 35.8*2
Willow Glen: 81.6: 0*6 | 13.9*6 29.67 32.6 31.95 34.9*2
Gardner: 23.4: 0*6 | 0*6 22.6 40.5 39.69 43.9*2
Seven Trees: 40.9: 0*6 | 0*6 27.96 28.0 25.9*3
Edenvale: 30: 0*6 | 0*6 47.35*2 46.81 47.0*2
Parkview: 42.5: 0*6 | 0*6 30.32*2 27.8 32.1*2
Branham: 44.0: 0*6 | 0*6 26.5 27.9 27.75 32.1*2
Willow Glen South: 63.3: 0*6 | 0*6 22.3 30.6 29.23 30.2*2
Communications Hill: 27.8: 0*6 | 0*6 34.1*2 33.96 37.2*2
:Tiny Neighborhoods (under 12 road miles):
Burlingame Hills: 6: 0*6 | 0.8 34.5*4
Kensington Square: 0.6: 86.9 100*5 | 100*5
Ladera: 8.0: 0*4 30.5 29.8 | 29.8*2 47.6*3
Los Trancos Woods: 5.4: 0*4 71.4*2 | 71.4*5
Menlo Oaks: 3.6: 0*4 98.4 99.7 | 99.7*5
Palomar Park: 3.9: 0*6 | 91.1*2 94.9*3
Sequoia Tract: 11.6: 0*4 72.8 82.3 | 92.5*5
Sky Londa: 11.8: 0*4 72.1*2 | 73.2*5
West Menlo Park: 11.2: 0*4 97.5 98.1 | 98.1*3 99.3*2
:San Francisco Neighborhoods Over 25%:
Golden Gate Park: 40.8: 0*6 | 25.6*8 37.8*3
Lincoln Park: 4.5: 0*6 | 43*8 35.4*3
Presidio National Park: 43.5: 0*6 | 21.1*4 24.4*4 27.7*3
Presidio Terrace: 2.8: 0*6 | 37.0*8 43.7*3
Seacliff: 4.1: 0*6 | 23.1*8 30.7*3
South Beach: 4.8: 0*6 | 28.2*4 39.6*7
Lake Street: 3.9: 0*6 | 0*8 36.8*3
:San Francisco Neighborhoods:
Aquatic Park / Fort Mason: 6.4: 0*6 | 0*4 14.9
Central Waterfront: 10.2: 0*6 | 0*4 6.7
Northern Waterfront: 5.6: 0*6 | 0*4 16.4
Dogpatch: 5.1: 0*6 | 0*4 12.4
Fisherman's Wharf: 6.2: 0*6 | 0*4 14.2
Balboa Terrace: 3.4: 0*6 | 18.2*5
Cole Valley: 1.7: 0*6 | 19.6*5
Forest Hill: 6.1: 0*6 | 15.7*5
Golden Gate Park: 40.8: 0*6 | 25.6*5
Lincoln Park: 3.7: 0*6 | 43*5
Pacific Heights: 18: 0*6 | 10.8*5
Ashbury Heights: 3.7: 0*6 | 12.9*5
Clarendon Heights: 6: 0*6 | 14.3*5
Cow Hollow: 12: 0*6 |5*4 12.0
Financial District: 9.4: 0*6 |5.8*4 9.7
Golden Gate Heights: 17.8: 0*6 | 10.7*5
Polk Gulch: 4: 0*6 | 18.2*5
Presidio Heights: 6.5: 0*6 | 15.1*5
Presidio National Park: 43.5: 0*6 | 21.1*4 24.4
Presidio Terrace: 2.8: 0*6 | 37.0*5
Seacliff: 4.1: 0*6 | 23.1*5
South Beach: 4.8: 0*6 | 28.2*4 39.7
Little Hollywood: 3.7: 0*6 | 0*4 15.4
:San Francisco Neighborhoods Under 25%:
Little Hollywood: 3.7: 0*6 | 0*4 15.4*7
Mission Bay: 13.8: 0*6 | 0*4 9.3*7
Sutro Heights: 7.1: 0*6 | 0*4 14.0*7
Pacific Heights: 18: 0*6 | 10.8*11
Ashbury Heights: 3.7: 0*6 | 12.9*11
Clarendon Heights: 6: 0*6 | 14.3*11
Cow Hollow: 12: 0*6 |5*4 12.0*7
Financial District: 9.4: 0*6 |5.8*4 9.7*7
Golden Gate Heights: 17.8: 0*6 | 10.7*11
Polk Gulch: 4: 0*6 | 18.2*11
Presidio Heights: 6.5: 0*6 | 15.1*11
Aquatic Park / Fort Mason: 6.4: 0*6 | 0*4 14.9*7
Central Waterfront: 10.2: 0*6 | 0*4 6.7*7
Northern Waterfront: 5.6: 0*6 | 0*4 16.4*7
Dogpatch: 5.1: 0*6 | 0*4 12.4*7
Fisherman's Wharf: 6.2: 0*6 | 0*4 14.2*7
Balboa Terrace: 3.4: 0*6 | 18.2*11
Cole Valley: 1.7: 0*6 | 19.6*11
Forest Hill: 6.1: 0*6 | 15.7*11
:Far Away (When will I return?):
Mokelumne Hill, Calaveras: 14.7: 28.9*6| 28.9*5
MIT, Cambridge, MA: 9.6: 37.2*6 | 37.2*5
Barangaroo, NSW: 1.7: 49.9*6 | 49.9*5
Dawes Point, NSW: 1.8: 29.2*6 | 29.2*5
Millers Point, NSW: 3.2: 38.2*6 | 38.2*5
Stinson Beach, Marin: 11.2: 9.2*6 | 9.2*5
Muir Beach, Marin: 4.6: 35.8*6 | 35.8*5
Cambridge, MA: 180.8: 6.4*6 | 6.4*5
Bodega Bay, Sonoma: 28.9: 18*6 | 18*5
Guerneville, Sonoma: 22.7: 23.4*6 | 23.4*5
Healdsburg, Sonoma: 53.7: 18.5*6 | 18.5*5
:Farther Away:
Mokelumne Hill, Calaveras: 14.7: 28.9*6| 28.9*11
MIT, Cambridge, MA: 9.6: 37.2*6 | 37.2*11
Barangaroo, NSW: 1.7: 49.9*6 | 49.9*11
Dawes Point, NSW: 1.8: 29.2*6 | 29.2*11
Millers Point, NSW: 3.2: 38.2*6 | 38.2*11
Stinson Beach, Marin: 11.2: 9.2*6 | 9.2*11
Muir Beach, Marin: 4.6: 35.8*6 | 35.8*11
Corte Madera, Marin: 51: 0*6 | 0*4 13*7
Mill Valley, Marin: 92.2: 0*6 | 0*4 5.1*7
San Rafael, Marin: 260: 0*6 | 0*4 3.7*7
Sausalito, Marin: 32.7: 0*6 | 0*4 13.1*7
Cambridge, MA: 180.8: 6.4*6 | 6.4*11
Bodega Bay, Sonoma: 28.9: 18*6 | 18*11
Guerneville, Sonoma: 22.7: 23.4*6 | 23.4*11
Healdsburg, Sonoma: 53.7: 18.5*6 | 18.5*11
Half Moon Bay: 68: 0*6 | 8.9*11
Emeryville: 28.1: 0*6 | 5.5*4 7.0*7
Berkeley: 260.3: 5.0*3 7.0*3 | 7.0*11
Albany: 42.7: 0*6 | 0*4 6.6*7
:California Counties:
San Mateo: 3248: 20.1 21.2 22.9 23.4 24.57 25.53 | 26.43 30.0 31.27 32.24 32.61
Santa Clara: 7396: 12.7 13.6 15.4 15.6 16.04 16.29 | 16.78 17.73 18.15 20.0 20.68
Alameda: 5704: 3.3*3 3.94*3 | 4.73*2 7.06 7.14 7.33
Marin: 2322: 6.7*6 | 6.7*4 7.98
Napa: 1524: 5.1*6 | 5.1*5
Sonoma: 4556: 5.1*6 | 5.1*5
San Francisco: 1183: 4.5*6 | 4.5*4 5.46
Santa Cruz: 2767: 2.3*6 | 2.3*5
:California Bay Area Counties:
Contra Costa: 6052: 1.0*6 | 1.0*3 1.41*8
San Mateo: 3171: 20.1 21.2 22.9 23.4 24.57 25.53 | 26.43 30.0 31.27 32.24 32.54 32.98 33.48 33.56 34.51 34.7 35.05
Santa Clara: 7445: 12.7 13.6 15.4 15.6 16.04 16.29 | 16.78 17.73 18.15 20.0 21.1 22.53 24.45 25.05 25.96 27.76 28.03
Alameda: 5704: 3.3*3 3.94*3 | 4.73*2 7.06 7.14 7.34*6 9.86
Marin: 2322: 6.7*6 | 6.7*4 7.98*7
Napa: 1524: 5.1*6 | 5.1*11
Sonoma: 4556: 5.1*6 | 5.1*11
San Francisco: 1197: 4.5*6 | 4.5*4 5.47*4 6.4 6.51*2
Santa Cruz: 2767: 2.3*6 | 2.3*11
:California:
California: 365188: .712 .811 .846 .867 .8875 .8873 | .9054 .9624 1.0289 1.0758 1.1052
California: 372710: .712 .811 .846 .867 .8875 .8873 | .9054 .9624 1.0289 1.0758 1.1278 1.1386 1.1812 1.1939 1.2007 1.2524 1.2987
:USA and Earth
USA: 6317607: .048 .052 .055 .05589 .0571 .05749 | .05853 .06183 .06553 .06824 0.06993
Earth: 38609276: .008 .0089 .0091 .00936 .009535 .009536| .009597 .010136 .010561 .010997 .011269
USA: 6400536: .048 .052 .055 .05589 .0571 .05749 | .05853 .06183 .06553 .06824 0.07138 0.07200 0.07446 0.0752 0.07665 0.07904 0.08173
Earth: 40818989: .008 .0089 .0091 .00936 .009535 .009536| .009597 .010136 .010561 .010997 .011349 0.011448 0.011839 0.011955 0.012024 0.0124113 0.012835

View File

@ -1,5 +1,12 @@
date year title hours miles feet
##### 2019-2021: Mostly Eddington rides; most recent first
Sun, 11/14 2021 Hayward 5:08:23 72.23 1,132
Sat, 10/16 2021 San Jose 5:47:00 70.18 2,562
Sat, 9/2 2021 San Jose 4:38:20 60.54 1,079
Tue, 8/3 2021 San Jose Neighborhoods 4:41:27 62.35 1,825
Sat, 8/7 2021 Emerald Hills etc. 5:45:30 73.38 3,015
Sun, 7/11 2021 San Jose 4:05:49 65.10 1,086
Sat, 6/12 2021 Up OLH, down Page Mill 5:48:48 71.42 3,525
Sun, 5/16 2021 Palo Alto / SF / San Rafael 5:41:52 70.33 2,073
Sat, 5/15 2021 San Rafael to Palo Alto over 20 bridges 5:23:44 68.30 871
Sat, 4/24 2021 Alviso / Niles / Dumbarton 100km with Juliet 5:44:24 69.79 1,230
@ -97,6 +104,7 @@ Sat, 7/9 2016 Santa Cruz 3:50:23 58.23 4,042
Wed, 6/18 2014 Sierra to the Sea Day 4 4:57:53 57.64 5,561
Tue, 7/7 2015 Palo Alto, CA 4:13:20 57.60 1,280
Mon, 8/6 2018 Bike Ride Northwest Day 2 4:35:48 57.58 4,514
Su, 1/26 2020 Los Gatos 4:24:58 57.05 1,086
Fri, 6/20 2014 Sierra to the Sea Day 6 4:33:39 56.91 4,453
Sat, 6/10 2017 Los Gatos / Creek Trails 3:50:24 56.28 1,365
Sat, 3/4 2017 Lunch Ride 3:58:25 56.26 1,378

Can't render this file because it has a wrong number of fields in line 2.