Add files via upload

This commit is contained in:
Peter Norvig 2022-07-31 23:58:48 -07:00 committed by GitHub
parent 84da1d015e
commit 9e081a7ea2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 3808 additions and 3750 deletions

File diff suppressed because one or more lines are too long

View File

@ -18,7 +18,8 @@
"outputs": [],
"source": [
"from IPython.core.display import HTML\n",
"from typing import Iterator, Tuple, List, Dict\n",
"from typing import Iterator, Iterable, Tuple, List, Dict\n",
"from collections import namedtuple\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
@ -36,7 +37,7 @@
"\n",
" Mon, 10/5\t2020\tHalf way around the bay on bay trail\t6:26:35\t80.05\t541\n",
" \n",
"I parse the file into the pandas dataframe `rides`, adding derived columns for miles per hour, vertical feet climbed per hour (VAM), grade in feet per mile, grade in percent, and kilometers ridden:"
"I parse the file into the pandas dataframe `rides`, adding derived columns for miles per hour, vertical meters climbed per hour (VAM), grade in feet per mile, grade in percent, and kilometers ridden:"
]
},
{
@ -52,9 +53,9 @@
"\n",
"def parse_hours(time: str) -> float: \n",
" \"\"\"Parse '4:30:00' => 4.5 hours.\"\"\"\n",
" while time.count(':') < 2: \n",
" time = '0:' + time\n",
" return round(pd.Timedelta(time).seconds / 60 / 60, 4)\n",
" hrs = sum(int(x) * 60 ** (i - 2) \n",
" for i, x in enumerate(reversed(time.split(':'))))\n",
" return round(hrs, 2)\n",
"\n",
"def parse_int(field: str) -> int: return int(field.replace(',', ''))\n",
"\n",
@ -75,7 +76,10 @@
"metadata": {},
"outputs": [],
"source": [
"rides = parse_rides(open('bikerides.tsv'))"
"rides = parse_rides(open('bikerides.tsv'))\n",
"yearly = parse_rides(open('bikeyears.tsv')).drop(columns=['date', 'title'])\n",
"yearly['miles'] = list(map(round, yearly['miles']))\n",
"yearly.index = [''] * len(yearly)"
]
},
{
@ -123,11 +127,13 @@
"source": [
"# Reading Data: `places`\n",
"\n",
"Monthly, I will take my [summary data from wandrer.earth](https://wandrer.earth/athletes/3534/santa-clara-county-california) and enter it in the file [bikeplaces.txt](bikeplaces.txt), in a format where\n",
"Monthly, I will take my [summary data from wandrer.earth](https://wandrer.earth/athletes/3534/santa-clara-county-california) and enter it in the file [bikeplaceupdates.txt](bikeplaceupdates.txt), in a format where\n",
"\n",
" Cupertino: 172: 22.1 23.9 26.2*3 26.3 | 26.4\n",
" por | 48.2 | Portola Valley | \n",
" --------------------------------------------------------------------------------\n",
" 2022-03 por 99.5 sky 99.24\n",
" \n",
"means that Cupertino has 172 miles of roads, and that by the first month I started keeping track, I had ridden 22.1% of them; in the last month 26.4%; and the `26.2*3` means that for 3 months in a row I had 26.2%. The `|` indicates the end of a year. A line that starts with `#` is a comment."
"means that \"por\" is the abbreviation for Portola Valley, which has 48.2 miles of roads, and in March 2022, I had ridden 99.5% of the roads in Portola Valley, as well as 99.24% of the roads in Sky Londa, etc. (I wanted both the place declarations and the monthly udates to be in one file, in case I decide to global replace some abbreviation.)"
]
},
{
@ -136,321 +142,29 @@
"metadata": {},
"outputs": [],
"source": [
"class Month(int):\n",
" \"\"\"An integer in the form: 12 * year + month.\"\"\"\n",
" def __str__(self): return f'{(self - 1) // 12}-{(self % 12) or 12:02d}'\n",
"Place = namedtuple('Place', 'name, miles, special, months, pcts')\n",
"\n",
"start = Month(2020 * 12 + 7) # Starting month: July 2020\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",
"def wandrer(category, entries, start=start):\n",
" \"\"\"Plot Wandrer.earth data.\"\"\"\n",
" fig, ax = plt.figure(), plt.subplot(111); \n",
" plt.plot()\n",
" for (place, miles, pcts), marker in zip(entries, '^v><osdhxDHPX*1234'):\n",
" N = len(pcts)\n",
" dates = [Month(start + i) for i in range(N)]\n",
" 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",
" 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",
" plt.ylabel('Percent of Area Ridden')\n",
" plt.title(category); plt.tight_layout(); grid(axis='y'); plt.show()\n",
" \n",
"def label(pcts, place, miles) -> str:\n",
" pct = f'{rounded(pcts[-1]):>3}' if pcts[-1] > 1.4 else f'{pcts[-1]}'\n",
" done = miles * pcts[-1]\n",
" bonus = next((f' {rounded((p - pcts[-1]) / 100 * miles):>3} to {p}%' \n",
" for p in bonuses if p >= pcts[-1]), '')\n",
" return f'{pct}% ({rounded(done / 100):>3}/{rounded(miles):<3} mi){bonus} {place}'\n",
" \n",
"def parse_places(lines) -> Dict[str, List[Entry]]:\n",
" \"Parse bikeplaces.txt into a dict of {'Title': [entry,...]}\"\n",
"def parse_places(filename='bikeplaces.txt', sep='-'*80) -> Dict:\n",
" \"\"\"Parse file into a dict:\n",
" places = {'por': Place('Portola Valley', 48.2, '', [month, ...], [pct, ...])}\"\"\"\n",
" places = {}\n",
" category = None\n",
" for line in lines:\n",
" line = line.strip()\n",
" if line.startswith('#') or not line: \n",
" pass\n",
" elif line.startswith(':'):\n",
" title = line.strip(':')\n",
" places[title] = []\n",
" else:\n",
" places[title].append(parse_entry(line))\n",
" places[title].sort(key=lambda entry: -entry[-1][-1])\n",
" declarations, updates = open(filename).read().split(sep)\n",
" for abbrev, miles, name, special in tokenize(declarations, sep='|'):\n",
" places[abbrev] = Place(name, float(miles), special, [], [])\n",
" for month, tokens in enumerate(tokenize(updates)):\n",
" for i in range(1, len(tokens), 2): \n",
" abbrev, pct = tokens[i], float(tokens[i+1])\n",
" places[abbrev].months.append(month)\n",
" places[abbrev].pcts.append(pct)\n",
" return places\n",
" \n",
"def parse_entry(line: str) -> Entry:\n",
" \"\"\"Parse line => ('Place Name', miles, [percents]); '=' can be used.\"\"\"\n",
" if line.count(':') != 2:\n",
" print('bad', line)\n",
" place, miles, pcts = line.replace('|', ' ').split(':')\n",
" pcts = re.sub('( [0-9.]+)[*]([0-9]+)', lambda m: m.group(1) * int(m.group(2)),\n",
" pcts).split()\n",
" for i, p in enumerate(pcts):\n",
" pcts[i] = pcts[i - 1] if p == '=' else 100 if p == '100' else float(p)\n",
" return place, float(miles), pcts \n",
" \n",
"def rounded(x: float) -> str: return f'{round(x):,d}' if x > 10 else f'{x:.1f}'\n",
"\n",
"def wandering(places: dict):\n",
" \"Plot charts of unique roads ridden in various places.\"\n",
" for category in places:\n",
" wandrer(category, places[category])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"places = parse_places(open('bikeplaces.txt'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Updating `bikeplaces.txt` to a new month"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"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",
"def tokenize(text, sep=None): \n",
" \"\"\"Split text into lines split by sep; strip each token; ignore blanks and comments.\"\"\"\n",
" lines = text.splitlines()\n",
" return [[token.strip() for token in line.split(sep)]\n",
" for line in lines if line.strip() and not line.startswith('#')]\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",
" elif '*' in words[-1]:\n",
" m, d = words[-1].split('*')\n",
" words[-1] = m + '*' + str(int(d) + 1)\n",
" else:\n",
" words[-1] += '*2'\n",
" 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": {},
"source": [
"# Eddington Number"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def Ed_number(distances) -> int:\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",
"def Ed_gap(distances, target) -> int:\n",
" \"\"\"The number of rides needed to reach an Eddington number target.\"\"\"\n",
" return target - sum(distances > target)\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_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=f'My Eddington Numbers: {Ed_number(rides.kms)} in kms, {Ed_number(rides.miles)} in miles')\n",
" grid(axis='y')\n",
" return frame"
"places = parse_places()"
]
},
{
@ -462,7 +176,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
@ -499,52 +213,185 @@
]
},
{
"cell_type": "code",
"execution_count": 14,
"cell_type": "markdown",
"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"
"# Plotting Wandrer Places"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": []
"source": [
"special_groups = dict(sf='San Francisco Neighborhoods', sj='San Jose Neighborhoods', \n",
" far='Far Away Places', county='Bay Area Counties', big='California, USA and Earth')\n",
"\n",
"def wandering(places, pcts=(100, 99, 90, 50, 33.3, 25, 0), specials=special_groups):\n",
" \"Plot charts within the various percent ranges, and special groups.\"\n",
" for i in range(len(pcts) - 1):\n",
" hi, lo = pcts[i], pcts[i + 1]\n",
" abbrevs = [a for a in places \n",
" if not places[a].special \n",
" and lo <= max_pct(a) < hi]\n",
" wandrer_plot(f'Places with {lo}% to {hi}% roads traveled', places, abbrevs)\n",
" for s in specials:\n",
" abbrevs = [a for a in places if places[a].special == s]\n",
" wandrer_plot(specials[s], places, abbrevs)\n",
" \n",
"def max_pct(abbrev) -> float: \n",
" \"\"\"The maximum percent of roads achieved for this place abbreviation.\"\"\"\n",
" if not places[abbrev].pcts: print('Warning: No pcts for', abbrev)\n",
" return max(places[abbrev].pcts, default=0)\n",
" \n",
"def wandrer_plot(title, places, abbrevs):\n",
" \"\"\"Plot Wandrer.earth data for the places with given abbrevs.\"\"\"\n",
" if not abbrevs:\n",
" return # Don't make an empty plot\n",
" abbrevs = sorted(abbrevs, key=max_pct, reverse=True)\n",
" fig, ax = plt.figure(), plt.subplot(111); \n",
" plt.plot()\n",
" for abbrev, marker in zip(abbrevs, markers):\n",
" name, miles, special, months, pcts = places[abbrev]\n",
" dates = [month_name(i) for i in range(max(months))]\n",
" name, miles, *_ = places[abbrev]\n",
" ax.plot(months, pcts, ':', marker=marker, label=label(pcts, name, miles))\n",
" ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), shadow=True,\n",
" prop=matplotlib.font_manager.FontProperties(family='monospace'))\n",
" months = places['usa'].months\n",
" plt.xticks(months, labels=[month_name(i) for i in months], rotation=90)\n",
" plt.ylabel('Percent of Roads Ridden')\n",
" plt.title(title); plt.tight_layout(); grid(axis='y'); plt.show()\n",
" \n",
"markers = '^v><osdhxDHPX*' * 3 # Matplotlib markers\n",
"bonuses = (0.02, 0.1, 2, 25, 50, 90, 99) # Percents that earn important bonuses\n",
"\n",
"def label(pcts, name, miles) -> str:\n",
" \"\"\"Make a label for the legend.\"\"\"\n",
" pct = f'{rounded(pcts[-1]):>3}' if pcts[-1] > 1.4 else f'{pcts[-1]}'\n",
" done = miles * pcts[-1]\n",
" bonus = next((f' {rounded((p - pcts[-1]) / 100 * miles):>3} to {p}%' \n",
" for p in bonuses if p >= pcts[-1]), '')\n",
" return f'{pct}% ({rounded(done / 100):>3}/{rounded(miles):<3} mi){bonus} {name}'\n",
"\n",
"def month_name(i, start=2020 * 12 + 6) -> str:\n",
" \"\"\"Maps 0 -> '2020-7' and 13 to '2021-8', etc.\"\"\"\n",
" year = (start + i) // 12\n",
" month = (start + i) % 12 + 1\n",
" return f'{year}-{month:02}'\n",
"\n",
"def rounded(x: float) -> str: \n",
" \"\"\"Round x to 3 spaces wide (if possible).\"\"\"\n",
" return f'{round(x):,d}' if x > 10 else f'{x:.1f}'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pareto Front Across Two Counties"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def make_leaders(data):\n",
" \"\"\"Make a dataframe of leaders in two counties.\"\"\"\n",
" leaders = pd.DataFrame(data, columns=['Name', 'SMC %', 'SCC %', 'Front?'])\n",
" leaders['SMC miles'] = [round(29.51 * d[1]) for d in data]\n",
" leaders['SCC miles'] = [round(75.64 * d[2]) for d in data]\n",
" leaders['Total miles'] = leaders['SMC miles'] + leaders['SCC miles']\n",
" return leaders\n",
"\n",
"leaders = make_leaders([\n",
" ('Barry Mann', 73.37, 29.35, 1), ('Jason Molenda', 7.13, 54.65, 1), \n",
" ('Peter Norvig', 50.06, 30.31, 1), ('Brian Feinberg', 29.72, 35.59, 1),\n",
" ('Jim Brooks', 4.23, 43.39, 0), ('Megan Gardner', 89.43, 8.69, 1),\n",
" ('Matthew Ring', 72.67, 1.48, 0), ('Elliot Huff', 50.43, 8.14, 0)])\n",
" \n",
"def pareto_front(leaders):\n",
" ax = leaders.plot('SMC %', 'SCC %', grid=True, kind='scatter')\n",
" front = sorted((x, y) for i, (_, x, y, f, *_) in leaders.iterrows() if f)\n",
" ax.plot(*zip(*front), ':'); ax.axis('square'); grid()\n",
" for i, (name, x, y, *_) in leaders.iterrows():\n",
" initials = ''.join(w[0] for w in name.split())\n",
" ax.text(x - 2, y + 2, initials)\n",
" return leaders.drop(columns=['Front?'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Eddington Number"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def Ed_number(rides, units) -> int:\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(rides[units], reverse=True)\n",
" return max(e for e, d in enumerate(distances, 1) if d >= e)\n",
"\n",
"def Ed_gap(distances, target) -> int:\n",
" \"\"\"The number of rides needed to reach an Eddington number target.\"\"\"\n",
" return target - sum(distances >= target)\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 = Ed_number(rides, 'kms')\n",
" E_mi = Ed_number(rides, 'miles')\n",
" data = [(E_km + d, Ed_gap(rides.kms, E_km + d), \n",
" E_mi + d, Ed_gap(rides.miles, E_mi + d))\n",
" for d in range(N)]\n",
" df = pd.DataFrame(data, columns=['kms', 'kms gap', 'miles', 'miles gap'])\n",
" return df\n",
"\n",
"def Ed_progress(rides, years=reversed(range(2013, 2022 + 1))) -> pd.DataFrame:\n",
" \"\"\"A table of Eddington numbers by year, and a plot.\"\"\"\n",
" def Ed(year, unit): return Ed_number(rides[rides['year'] <= year], unit)\n",
" data = [(y, Ed(y, 'kms'), Ed(y, 'miles')) for y in years]\n",
" df = pd.DataFrame(data, columns=['year', 'Ed_km', 'Ed_mi'])\n",
" return df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Climbing to Space"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"per_month_climbing = [35.491, 31.765, 39.186, 33.641, 32.782, 14.809, 46.731]\n",
"\n",
"space = {'100 kms': 328.204, '10 Everests': 290.320, '50 miles': 50 * 5.280}\n",
"\n",
"def climbing(per_month=per_month_climbing, space=space):\n",
" \"\"\"Plot progress in climbing\"\"\"\n",
" total = np.cumsum(per_month_climbing)#[sum(per_month[:i+1]) for i in range(len(per_month))]\n",
" for label in space:\n",
" plt.plot(range(12), [space[label]] * 12, ':', label=label)\n",
" plt.plot(range(len(total)), total, 'o-', label='my total')\n",
" plt.plot(range(len(total)), per_month, 's-.', label='per month')\n",
" plt.legend(loc=(1.04, .64), fontsize='large'); grid()\n",
" plt.xlabel('Month of 2022'); plt.ylabel('Total climbing (Kft)')\n",
" plt.xticks(range(13), 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split())"
]
}
],
"metadata": {

View File

@ -1,135 +1,177 @@
: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
# San Mateo County
ath | 56.3 | Atherton |
bel | 98.1 | Belmont |
bri | 40.9 | Brisbane |
brm | 8.8 | Broadmoor |
buh | 6.0 | Burlingame Hills |
bur | 88.4 | Burlingame |
ccp | 3.9 | Coal Creek Preserve |
clm | 13.7 | Colma |
dal | 148.1 | Daly City |
epa | 48.3 | East Palo Alto |
elg | 49.2 | El Granada |
elh | 24.6 | Emerald Lake Hills |
foc | 150.0 | Foster City |
hmb | 68.0 | Half Moon Bay |
hsb | 4.4 | Half Moon Bay State Beach |
hil | 85.3 | Hillsborough |
ken | 0.6 | Kensington Square |
lad | 8.1 | Ladera |
ltw | 5.3 | Los Trancos Woods |
mno | 3.5 | Menlo Oaks |
mpk | 139.5 | Menlo Park |
mlb | 65.0 | Millbrae |
mtr | 27.8 | Montara |
mbe | 19.7 | Moss Beach |
nfo | 26.7 | North Fair Oaks |
pac | 150.9 | Pacifica |
plp | 4.0 | Palomar Park |
por | 48.2 | Portola Valley |
prc | 16.5 | Purisima Creek Preserve |
rwc | 240.5 | Redwood City |
rrp | 12.2 | Russian Ridge Preserve |
sbr | 114.0 | San Bruno |
sca | 99.0 | San Carlos |
sma | 256.0 | San Mateo |
smh | 18.0 | San Mateo Highlands |
seq | 11.5 | Sequoia Tract |
sky | 11.8 | Sky Londa |
sro | 0.8 | Skyline Ridge OSP |
ssf | 185.3 | South San Francisco |
wme | 11.2 | West Menlo Park |
whp | 4.1 | Windy Hill Preserve |
woo | 75.2 | Woodside |
:Over 90%:
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
# Santa Clara County
bra | 44.0 | Branham |
cmb | 119.0 | Campbell |
cmh | 27.8 | Communications Hill |
cup | 172.0 | Cupertino |
ede | 30.0 | Edenvale |
foo | 1.1 | Foothills Preserve |
gar | 23.4 | Gardner |
gil | 188.9 | Gilroy |
hcp | 265.9 | Henry Coe State Park | HIDDEN
lal | 138.2 | Los Altos |
lah | 91.3 | Los Altos Hills |
lga | 148.0 | Los Gatos |
loy | 18.3 | Loyola |
mlp | 224.0 | Milpitas |
mos | 20.4 | Monte Sereno |
mtv | 208.1 | Mountain View |
pal | 297.2 | Palo Alto |
par | 42.5 | Parkview |
sjo |2618.7 | San Jose |
scl | 348.0 | Santa Clara |
smr | 35.3 | San Martin |
sar | 180.0 | Saratoga |
svt | 40.9 | Seven Trees |
spk | 64.3 | Spartan Keyes |
sun | 357.0 | Sunnyvale |
wlg | 81.6 | Willow Glen |
wgs | 63.3 | Willow Glen South |
: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
# Alameda County
che | 20.9 | Cherryland |
fre | 780.2 | Fremont |
hay | 444.5 | Hayward |
new | 147.0 | Newark |
sle | 230.6 | San Leandro |
slo | 55.5 | San Lorenzo |
unc | 208.8 | Union City |
: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
# SF
prt | 2.8 | Presidio Terrace | sf
sob | 4.8 | South Beach | sf
ggp | 40.8 | Golden Gate Park | sf
lks | 3.9 | Lake Street | sf
lin | 4.5 | Lincoln Park | sf
sec | 4.1 | Seacliff | sf
pnp | 43.5 | Presidio National Park | sf
col | 1.7 | Cole Valley | sf
pol | 4.0 | Polk Gulch | sf
bal | 3.4 | Balboa Terrace | sf
nwa | 5.6 | Northern Waterfront | sf
foh | 6.1 | Forest Hill | sf
lho | 3.7 | Little Hollywood | sf
prh | 6.5 | Presidio Heights | sf
aqp | 6.4 | Aquatic Park Fort Mason | sf
clh | 6.0 | Clarendon Heights | sf
fis | 6.2 | Fisherman's Wharf | sf
sut | 7.1 | Sutro Heights | sf
ash | 3.7 | Ashbury Heights | sf
dog | 5.1 | Dogpatch | sf
cow | 12.0 | Cow Hollow | sf
pch | 18.0 | Pacific Heights | sf
ggh | 17.8 | Golden Gate Heights | sf
fin | 9.4 | Financial District | sf
msb | 13.8 | Mission Bay | sf
cwa | 10.2 | Central Waterfront | sf
: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
: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
# Far Away
bar | 1.7 | Barangaroo, NSW | far
mpt | 3.2 | Millers Point, NSW | far
cam | 180.8 | Cambridge, MA | far
mit | 9.6 | MIT, MA | far
mui | 4.6 | Muir Beach, Marin | far
mhl | 65.7 | Marin Headlands GGNRA | far
mtt | 31.7 | Mt Tamalpais State Park | far
daw | 1.8 | Dawes Point, NSW | far
mok | 14.7 | Mokelumne Hill, Calaveras | far
gue | 22.7 | Guerneville, Sonoma | far
hld | 53.7 | Healdsburg, Sonoma | far
bod | 28.9 | Bodega Bay, Sonoma | far
sau | 32.7 | Sausalito, Marin | far
cmd | 51.0 | Corte Madera, Marin | far
sti | 11.2 | Stinson Beach, Marin | far
mlv | 92.2 | Mill Valley, Marin | far
srf | 260.0 | San Rafael, Marin | far
eme | 28.1 | Emeryville | far
ber | 260.3 | Berkeley | far
alb | 42.7 | Albany | far
ros | 5.5 | Rosie Riveter Park |
: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
# Counties
smC |2951.0 | San Mateo | county
scC |7564.0 | Santa Clara | county
alC |5704.0 | Alameda | county
maC |2322.0 | Marin | county
sfC |1197.0 | San Francisco | county
npC |1524.0 | Napa | county
soC |4556.0 | Sonoma | county
szC |2767.0 | Santa Cruz | county
ccC |6034.0 | Contra Costa | county
: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
# Big Places
cal | 375216.0 | California | big
usa | 6406754.0 | USA | big
ear |40818989.0 | Earth | big
: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: 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: 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
--------------------------------------------------------------------------------
2020-07 ken 86.9 epa 74.4 nfo 78.1 woo 51.9 mpk 67.7 mtv 53.0 pal 63.0 lal 40.2 lah 48.4 rwc 34.0 mos 20.5 new 15.0 sca 22.2 bur 9.4 foc 9.1 sun 19.4 cup 22.1 mlp 2.2 scl 6.4 lga 7.5 fre 9.0 cmb 8.9 sma 11.1 bel 15.5 sar 14.5 unc 7.0 hil 3.3 sjo 1.3 gil 7.9 bar 49.9 smr 15.7 mpt 38.2 mit 37.2 mui 35.8 daw 29.2 mok 28.9 gue 23.4 hld 18.5 bod 18.0 sti 9.2 ber 5.0 cam 6.4 smC 20.1 scC 12.7 alC 3.3 maC 6.7 sfC 4.5 npC 5.1 soC 5.1 szC 2.3 ccC 1.0 cal 0.712 usa 0.048 ear 0.008
2020-08 ken 100 epa 91.2 nfo 90.4 elh 94.3 mpk 76.8 mtv 59.9 pal 73.6 lal 43.7 rwc 39.1 sca 26.0 sun 19.9 cup 23.9 lga 8.6 cmb 10.1 bel 17.3 sar 15.7 sjo 1.36 smC 21.2 scC 13.6 cal 0.811 usa 0.052 ear 0.0089
2020-09 epa 91.9 nfo 93.1 woo 52.3 mpk 87.7 mtv 63.0 pal 85.4 lal 72.4 lah 49.0 rwc 46.0 sca 32.9 sun 22.2 cup 26.2 scl 9.6 lga 8.8 cmb 12.4 bel 18.6 sar 17.4 sjo 5.3 smC 22.9 scC 15.4 cal 0.846 usa 0.055 ear 0.0091
2020-10 nfo 93.8 mpk 90.7 mtv 63.6 pal 85.7 lal 77.2 lah 55.1 rwc 51.6 new 17.0 fre 10.0 unc 8.0 ber 7.0 smC 23.4 scC 15.6 alC 3.94 cal 0.867 usa 0.05589 ear 0.00936
2020-11 mno 98.4 wme 97.5 epa 92.2 lad 30.5 ath 91.2 por 57.3 seq 72.8 sky 72.1 nfo 94.8 ltw 71.4 mpk 91.2 mtv 72.9 pal 87.1 loy 60.8 lal 84.5 rwc 56.9 sca 37.2 mlp 4.4 bel 20.6 smC 24.57 scC 16.04 cal 0.8875 usa 0.0571 ear 0.009535
2020-12 mno 99.7 wme 98.1 epa 93.3 ath 94.0 por 59.8 seq 82.3 nfo 96.1 woo 54.0 elh 51.0 mtv 77.1 pal 87.6 loy 62.1 lal 90.8 lah 55.4 rwc 60.8 sca 39.0 cup 26.3 smC 25.53 scC 16.29 usa 0.05749 ear 0.009536
2021-01 plp 91.1 epa 93.4 ath 95.2 seq 92.5 sky 73.2 nfo 96.9 woo 56.1 elh 80.0 mpk 92.5 mtv 91.1 pal 88.1 lal 91.0 lah 55.8 rwc 62.9 new 18.7 sca 40.5 buh 0.8 sun 25.1 cup 26.4 fre 11.7 smh 18.0 sma 11.3 bel 27.4 unc 8.8 hay 4.6 hil 3.6 spk 22.1 wlg 13.9 sjo 5.4 prt 37.0 sob 28.2 ggp 25.6 lin 43.0 sec 23.1 pnp 21.1 col 19.6 pol 18.2 bal 18.2 foh 15.7 prh 15.1 clh 14.3 ash 12.9 cow 5.0 pch 10.8 ggh 10.7 fin 5.8 hmb 8.9 eme 5.5 smC 26.43 scC 16.78 alC 4.73 cal 0.9054 usa 0.05853 ear 0.009597
2021-02 elh 85.8 mos 39.8 new 26.8 buh 34.5 bur 31.5 foc 27.4 mlb 18.4 lga 26.1 cmb 25.2 smh 29.2 sma 25.5 sar 26.9 hil 24.5 smC 30.0 scC 17.73 cal 0.9624 usa 0.06183 ear 0.010136
2021-03 plp 94.9 lad 47.6 por 61.0 nfo 99.1 elh 91.3 pal 90.3 lal 91.1 rwc 65.1 new 30.8 sca 41.4 foc 37.2 mlb 31.6 fre 27.5 cmb 26.5 sma 27.8 bel 27.5 unc 25.7 hil 25.3 smC 31.27 scC 18.15 alC 7.06 cal 1.0289 usa 0.06553 ear 0.010561
2021-04 wme 99.3 ath 94.9 mpk 91.6 pal 90.4 sun 25.8 mlp 26.6 scl 26.6 fre 28.1 sbr 25.4 sjo 6.7 smC 32.24 scC 20.0 alC 7.14 ccC 1.41 cal 1.0758 usa 0.06824 ear 0.010997
2021-05 mno 100 wme 99.7 epa 92.5 ath 96.2 por 66.2 seq 96.4 sky 75.4 woo 62.2 ltw 74.9 mtv 92.3 pal 90.5 loy 91.5 lal 91.2 rwc 66.3 mos 44.1 buh 35.5 bur 35.5 foc 38.7 mlb 32.8 sun 25.9 cup 26.5 mlp 27.2 ros 29.3 lga 28.2 sar 27.2 unc 26.7 hay 5.1 sjo 11.9 sob 39.6 pnp 24.4 nwa 16.4 lho 15.4 aqp 14.9 fis 14.2 sut 14.0 dog 12.4 cow 12.0 fin 9.7 msb 9.3 cwa 6.7 sau 13.1 cmd 13.0 eme 7.0 alb 6.6 mlv 5.1 srf 3.7 smC 32.54 scC 21.1 alC 7.34 maC 7.98 sfC 5.47 cal 1.1278 usa 0.07138 ear 0.011349
2021-06 por 66.4 sky 75.5 woo 65.8 ltw 75.0 pal 90.6 rwc 66.7 sca 41.7 bel 27.4 sjo 13.1 smC 32.98 scC 22.53 cal 1.1386 usa 0.072 ear 0.011448
2021-07 wme 100 lad 50.6 ath 98.7 por 67.4 seq 97.5 woo 81.8 mpk 91.8 loy 91.3 lah 56.4 rwc 67.0 cmb 26.8 ede 47.35 gar 22.6 cmh 34.1 spk 38.9 wlg 29.67 par 30.32 bra 26.5 wgs 22.3 svt 27.96 sjo 18.2 smC 33.48 scC 24.45 cal 1.1812 usa 0.07446 ear 0.011839
2021-08 ath 99.5 por 70.3 seq 98.2 woo 84.3 pal 90.7 lah 59.0 cmb 28.3 gar 40.5 spk 39.0 wlg 32.6 bra 27.9 wgs 30.6 svt 28.0 sjo 19.8 smC 33.56 scC 25.05 cal 1.1939 usa 0.0752 ear 0.011955
2021-09 plp 98.1 ken 99.99 epa 95.0 por 72.0 seq 99.4 nfo 99.17 woo 85.5 elh 92.2 mpk 93.5 lal 90.63 rwc 75.0 cup 29.5 scl 28.8 sbr 25.5 hil 25.5 sjo 23.1 prt 43.7 ggp 37.8 lks 36.8 sec 30.7 pnp 27.7 smC 34.51 scC 25.96 sfC 6.4 cal 1.2007 usa 0.07665 ear 0.012024
2021-10 epa 99.2 lad 82.1 ath 99.3 sky 83.4 mpk 94.7 sro 91.5 mtv 93.5 pal 91.3 lal 90.9 lah 62.1 rwc 77.9 sun 31.0 cup 29.7 mlp 29.5 scl 29.4 lga 28.6 bel 27.5 ede 47.0 gar 43.9 cmh 37.2 spk 35.8 wlg 34.9 par 32.1 bra 32.1 wgs 30.2 sjo 25.6 smC 34.7 scC 27.76 sfC 6.51 cal 1.2524 usa 0.07904 ear 0.0124113
2021-11 lad 92.0 pal 91.5 lah 62.5 new 42.5 slo 34.56 fre 28.8 che 26.8 hay 26.3 smC 35.05 scC 28.03 alC 9.86 cal 1.2987 usa 0.08173 ear 0.012835
2021-12 smC 36.08 scC 28.24 alC 9.87 ccC 1.42 usa 0.08199 ear 0.012886
2022-01 plp 100 epa 99.7 lad 99.7 ath 99.6 por 90.7 sky 87.0 woo 91.1 elh 93.4 ltw 95.8 mpk 94.8 mtv 93.7 pal 93.0 lal 91.3 lah 65.9 rwc 83.1 sun 31.3 smC 36.41 scC 28.39 cal 1.3048 usa 0.08252 ear 0.013799
2022-02 por 94.0 elh 96.1 lal 91.4 lah 71.0 smC 37.3 scC 28.5 cal 1.3106 usa 0.083 ear 0.013855
2022-03 por 99.5 sky 99.2 woo 94.1 mpk 95.7 sro 93.5 lal 91.5 lah 76.3 rwc 90.2 smC 38.06 scC 28.56 cal 1.3136 usa 0.08314 ear 0.013895
2022-04 woo 96.6 loy 92.1 lah 91.0 bri 45.3 slo 34.7 lga 29.1 bel 27.6 sbr 27.1 ssf 26.1 sle 25.9 smC 40.33 scC 29.04 alC 10.96 cal 1.3565 usa 0.08565 ear 0.01429
2022-05 loy 98.7 mtv 92.9 pal 92.8 sjo 26.9 rrp 21.8 whp 99.1 mui 37.2 sti 37.4 mhl 30.8 mtt 40.3 usa 0.087
2022-06 scl 33.9 elh 98.1 foc 51.8 ltw 99.9 mpk 95.1 mlb 31.9 rwc 90.3 sma 46.5 smh 76.7 hcp 0.2 foo 80.7 ccp 36.7 ssf 26.4 usa 0.089
2022-07 sun 46.6 bel 37.1 brm 38.2 dal 12.3 hmb 30.5 hsb 50.7 mtr 26.8 mbe 38.5 pac 27.5 prc 35.7 sca 59.5 clm 24.8 elg 35.2 smC 50.06 scC 30.31 cal 1.4656 usa 0.09215 ear 0.014891

View File

@ -1,5 +1,14 @@
date year title hours miles feet
##### 2019-2021: Mostly Eddington rides; most recent first
##### 2019-2022: Mostly Eddington rides; most recent first
Thu, 7/14 2022 Bike Hut Classic 6:36:30 74.16 6,070
Sat, 7/9 2022 Purisima Creek Trail 7:20:20 62.93 7,139
Sat, 7/2 2022 Bear Gulch, West Side 6:29:10 77.73 6,991
Sat, 6/25 2022 Chabot: Redwood / Skyline / Goldenrod / Cull Canyon 5:02:33 65.15 5,361
Sat, 5/7 2022 Wine Country Century 6:39:02 100.26 5,253
Sat, 4/23 2022 Tierra Bella 100K with Anne and David 5:38:12 68.38 4,892
Sat, 4/9 2022 Kings / Skyline / 92 6:07:05 69.29 5,029
Sat, 1/29 2022 Woodside plus Montebello 6:49:14 67.73 5,553
Sat, 1/15 2022 Crestview 5:43:00 64.49 4,446
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
@ -59,9 +68,7 @@ Fri, 7/5 2019 Crystal Springs 4:30:55 64.05 1,965
Sat, 6/15 2019 Morning Ride 2:29:38 29.98 1,785
Sat, 6/8 2019 Morning Ride 2:53:08 34.42 1,824
Sun, 6/2 2019 The Sequoia 6:40:43 77.51 6,467
##### 2012 to 2018: rides over 25 miles, longest first
Fri, 1/9 2012 Otago Rail Trail 8:00:00 101.00 2,200
Thu, 6/14 2012 Coyote Creek Century with Juliet 8:08:15 100.07 1,513
##### 2013 to 2018: rides over 25 miles, longest first
Sat, 5/13 2017 Morgan Hill iCare Classic 7:27:21 100.05 4,596
Sat, 5/12 2018 ICare Classic, Morgan Hill 6:47:46 91.29 4,160
Sat, 5/6 2017 Wine Country Century 7:15:22 89.49 5,246
@ -499,4 +506,11 @@ Sun, 6/23 2013 Climb 2:16:29 24.30 2,001
Sat, 7/13 2013 Doug's Event 1:51:55 21.35 1,677
Sun, 8/4 2013 Kris's first trike ride 1:51:21 20.96 988
Sun, 11/24 2013 Alpine Rd 1:42:36 21.02 1,289
Fri, 11/29 2013 Woodside Loop 1:33:36 22.75 1,011
Fri, 11/29 2013 Woodside Loop 1:33:36 22.75 1,011
#### 2012 Rides
Thu, 1/5 2012 Tekapo Lake to Omarama New Zealand 5:27:34 79.42 2,145
Fri, 1/6 2012 Omarama to Wanaka New Zealand 4:28:51 70.35 3,262
Sat, 1/7 2012 Wanaka to Queenstown New Zealand 3:23:12 45.18 3,488
Sun, 1/8 2012 Queenstown to Clyde New Zealand 3:59:59 60.02 3,522
Fri, 1/9 2012 Otago Rail Trail Century 7:52:17 102.41 2,286
Thu, 6/14 2012 Coyote Creek Century with Juliet 8:08:15 100.07 1,513
Can't render this file because it has a wrong number of fields in line 2.

View File

@ -7,24 +7,36 @@ Arastradero, 1.19, 193, 6:41, 7:49, 7:55
Arastradero last two bumps, 0.32, 95, 3:10
Atherton Ave Stinger, 0.23, 88, 2:24
Cabrillo Hmy S, 0.46, 153, 4:31
Camaritas climb, 0.10, 48, 0:51
Canada to College, 1.37, 119, 5:55, 6:23, 6:35
Canon, 0.90, 295, 11:04, 11:55
Canon to No Cycling, 0.75, 198, 5:14, 5:41
Cemetery Sprint, 0.08, 33, 0:33
Chalk Hill SB sprint, 0.17, 21, 2:11
Coe Second Switchback to flat, 1.00, 483, 13:27
Communications Hill Climb, 0.20, 103, 2:32
Davenport Kicker, 0.24, 74, 1:17
DNA hill, 0.28, 83, 2:08
Dunne Steeps, 0.42, 204, 5:11
Entrance Way Hill Repeats, 0.10, 76, 1:25
Faught Turn, 0.22, 60, 1:16
Foothill Homestead, 1.22, 126, 5:31, 6:36, 6:53
Green Valley Roller of Death, 0.17, 84, 2:08
green valley kicker, 0.29, 178, 4:33
Haskins, 1.51, 566, 17:47, 18:43, 18:47
Highway 1 Cascanoa to Cascade, 1.61, 89, 5:20
Highway 9, 0.56, 260, 8:33
Highway 9 Mantalvo, 0.45, 35, 1:36, 1:48, 1:53
Huddart, 0.92, 385, 10:15, 11:18, 12:55
Joaquin, 0.33, 254, 6:19, 7:27
Invernes to Firecrest Climb, 0.28, 143, 2:35
Joaquin, 0.33, 254, 5:22, 6:00, 7:27
Kaboom Portola Rd, 0.67, 102, 3:14, 3:26, 3:33
Kings half way, 2.89, 820, 27:26, 29:45, 32:43
Kings to Skeggs, 1.10, 273, 9:07, 10:39, 10:53
Kings Greer to Skyline, 3.92, 1536, 46:53, 48:36, 54:25
Kings Mountain Rd Climb, 0.56, 296, 8:23
Kings Mountain final sprint, 0.31, 135, 2:26
Klamath Dr., 0.12, 77, 0:55
Laning Bump, 0.24, 94, 2:00
Limantour Spit, 0.47, 303, 5:19
Limantour steepest, 0.20, 159, 5:41
@ -33,6 +45,7 @@ Lower Redwood Gulch, 1.03, 474, 13:00
Mapache, 0.24, 111, 2:52, 2:55
Mt Eden climb, 1.02, 272, 8:32, 9:43, 11:59
Mt Eden to Archery, 0.54, 180, 5:19, 5:39, 6:12
Official Bike Hut Classic 8.33, 1908, 1:08:50
Old La Honda (Bridge to Stop), 3.33, 1255, 28:42, 30:32, 36:04
Old La Honda Mile 1, 0.99, 370, 8:02, 9:36, 9:51
Paloma Climb, 0.14, 82, 1:26
@ -48,6 +61,8 @@ Redwood Gulch wall, 0.43, 258, 6:39
Sand Gill Sharon-top, 0.85, 136, 4:03, 4:16, 4:24
Sand Hill 280 to horse, 0.49, 95, 2:34, 2:44, 2:51
Sand Hill Alpine to 280, 1.67, 180, 7:02, 7:39, 8:02
Sharon Park steep part, 0.21, 86, 1:57
Skyline Bump at OLH, 0.21, 63, 1:16, 1:40, 1:49
Stair Step, 0.32, 175, 5:25
Stage Rd, 1.01, 373, 11:36, 11:51, 12:28
Stanford Ave, 0.63, 85, 3:14, 3:32, 3:49
@ -57,17 +72,21 @@ Stirrup to Moon, 0.36, 159, 3:41, 6:07
Summit Rd Climb, 0.60, 275, 8:00
Tepa, 0.58, 248, 6:34, 7:14, 8:21
The Boneyard, 1.48, 135, 6:05, 6:36, 7:00
Top of Groton Rd heading west, 0.92, 291, 7:59
Try not to fall back, 0.71, 410, 12:45
Tunitas Knoll to Star, 1.55, 339, 12:28, 12:56, 13:51
Tunitas flattens, 0.42, 166, 3:16, 3:25, 3:51
Tunitas lower climb, 1.30, 421, 13:34, 16:00, 17:33
Tunitas steep, 1.20, 599, 16:15, 17:47, 20:44
Tunitas flattens, 0.42, 166, 3:15, 3:16, 3:25
Tunitas lower climb, 1.30, 421, 12:58, 13:34, 16:00
Tunitas steep, 1.20, 599, 15:17, 16:15, 17:47
Valparaiso steep, 0.18, 145, 2:26, 2:56, 3:18
Vickrey Fruitvale, 0.99, 68, 3:41, 3:58, 4:26
Watts (Sonoma), 1.20, 313, 8:37
West Alpine switchback, 0.78, 322, 8:56, 10:52, 11:55
West Alpine full, 7.38, 1887, 1:23:26
Westridge, 0.68, 385, 8:28, 9:52, 10:18
Westridge 3min, 0.37, 240, 4:41, 5:35, 6:31
Westridge Hill 1, 0.51, 104, 3:19, 3:58
Westridge Hill 2, 0.51, 166, 4:42, 5:10, 5:20
Woghler Slap, 0.20, 47, 1:24
Woodland Way, 0.13, 63, 1:36
Woodside Climb, 1.71, 295, 8:05, 9:00, 9:35
1 Alma Mountain Charlie, 3.12, 875, 31:49
7 Arastradero last two bumps, 0.32, 95, 3:10
8 Atherton Ave Stinger, 0.23, 88, 2:24
9 Cabrillo Hmy S, 0.46, 153, 4:31
10 Camaritas climb, 0.10, 48, 0:51
11 Canada to College, 1.37, 119, 5:55, 6:23, 6:35
12 Canon, 0.90, 295, 11:04, 11:55
13 Canon to No Cycling, 0.75, 198, 5:14, 5:41
14 Cemetery Sprint, 0.08, 33, 0:33
15 Chalk Hill SB sprint, 0.17, 21, 2:11
16 Coe Second Switchback to flat, 1.00, 483, 13:27
17 Communications Hill Climb, 0.20, 103, 2:32
18 Davenport Kicker, 0.24, 74, 1:17
19 DNA hill, 0.28, 83, 2:08
20 Dunne Steeps, 0.42, 204, 5:11
21 Entrance Way Hill Repeats, 0.10, 76, 1:25
22 Faught Turn, 0.22, 60, 1:16
23 Foothill Homestead, 1.22, 126, 5:31, 6:36, 6:53
24 Green Valley Roller of Death, 0.17, 84, 2:08
25 green valley kicker, 0.29, 178, 4:33
26 Haskins, 1.51, 566, 17:47, 18:43, 18:47
27 Highway 1 Cascanoa to Cascade, 1.61, 89, 5:20
28 Highway 9, 0.56, 260, 8:33
29 Highway 9 Mantalvo, 0.45, 35, 1:36, 1:48, 1:53
30 Huddart, 0.92, 385, 10:15, 11:18, 12:55
31 Joaquin, 0.33, 254, 6:19, 7:27 Invernes to Firecrest Climb, 0.28, 143, 2:35
32 Joaquin, 0.33, 254, 5:22, 6:00, 7:27
33 Kaboom Portola Rd, 0.67, 102, 3:14, 3:26, 3:33
34 Kings half way, 2.89, 820, 27:26, 29:45, 32:43
35 Kings to Skeggs, 1.10, 273, 9:07, 10:39, 10:53
36 Kings Greer to Skyline, 3.92, 1536, 46:53, 48:36, 54:25
37 Kings Mountain Rd Climb, 0.56, 296, 8:23
38 Kings Mountain final sprint, 0.31, 135, 2:26
39 Klamath Dr., 0.12, 77, 0:55
40 Laning Bump, 0.24, 94, 2:00
41 Limantour Spit, 0.47, 303, 5:19
42 Limantour steepest, 0.20, 159, 5:41
45 Mapache, 0.24, 111, 2:52, 2:55
46 Mt Eden climb, 1.02, 272, 8:32, 9:43, 11:59
47 Mt Eden to Archery, 0.54, 180, 5:19, 5:39, 6:12
48 Official Bike Hut Classic 8.33, 1908, 1:08:50
49 Old La Honda (Bridge to Stop), 3.33, 1255, 28:42, 30:32, 36:04
50 Old La Honda Mile 1, 0.99, 370, 8:02, 9:36, 9:51
51 Paloma Climb, 0.14, 82, 1:26
61 Sand Gill Sharon-top, 0.85, 136, 4:03, 4:16, 4:24
62 Sand Hill 280 to horse, 0.49, 95, 2:34, 2:44, 2:51
63 Sand Hill Alpine to 280, 1.67, 180, 7:02, 7:39, 8:02
64 Sharon Park steep part, 0.21, 86, 1:57
65 Skyline Bump at OLH, 0.21, 63, 1:16, 1:40, 1:49
66 Stair Step, 0.32, 175, 5:25
67 Stage Rd, 1.01, 373, 11:36, 11:51, 12:28
68 Stanford Ave, 0.63, 85, 3:14, 3:32, 3:49
72 Summit Rd Climb, 0.60, 275, 8:00
73 Tepa, 0.58, 248, 6:34, 7:14, 8:21
74 The Boneyard, 1.48, 135, 6:05, 6:36, 7:00
75 Top of Groton Rd heading west, 0.92, 291, 7:59
76 Try not to fall back, 0.71, 410, 12:45
77 Tunitas Knoll to Star, 1.55, 339, 12:28, 12:56, 13:51
78 Tunitas flattens, 0.42, 166, 3:16, 3:25, 3:51 Tunitas flattens, 0.42, 166, 3:15, 3:16, 3:25
79 Tunitas lower climb, 1.30, 421, 13:34, 16:00, 17:33 Tunitas lower climb, 1.30, 421, 12:58, 13:34, 16:00
80 Tunitas steep, 1.20, 599, 16:15, 17:47, 20:44 Tunitas steep, 1.20, 599, 15:17, 16:15, 17:47
81 Valparaiso steep, 0.18, 145, 2:26, 2:56, 3:18
82 Vickrey Fruitvale, 0.99, 68, 3:41, 3:58, 4:26
83 Watts (Sonoma), 1.20, 313, 8:37
84 West Alpine switchback, 0.78, 322, 8:56, 10:52, 11:55
85 West Alpine full, 7.38, 1887, 1:23:26
86 Westridge, 0.68, 385, 8:28, 9:52, 10:18
87 Westridge 3min, 0.37, 240, 4:41, 5:35, 6:31
88 Westridge Hill 1, 0.51, 104, 3:19, 3:58
89 Westridge Hill 2, 0.51, 166, 4:42, 5:10, 5:20
90 Woghler Slap, 0.20, 47, 1:24
91 Woodland Way, 0.13, 63, 1:36
92 Woodside Climb, 1.71, 295, 8:05, 9:00, 9:35

9
ipynb/bikeyears.tsv Normal file
View File

@ -0,0 +1,9 @@
date year title hours miles feet
all 2021 Yearly 490:32:00 6064.5 196634
all 2020 Yearly 438:53:00 5341.9 94777
all 2019 Yearly 476:19:00 6016.1 149797
all 2018 Yearly 475:56:00 6101.0 158642
all 2017 Yearly 567:20:00 7356.4 202096
all 2016 Yearly 486:23:00 6339.2 201453
all 2015 Yearly 419:57:00 5452.6 209859
all 2014 Yearly 191:02:00 2469.1 118481
1 date year title hours miles feet
2 all 2021 Yearly 490:32:00 6064.5 196634
3 all 2020 Yearly 438:53:00 5341.9 94777
4 all 2019 Yearly 476:19:00 6016.1 149797
5 all 2018 Yearly 475:56:00 6101.0 158642
6 all 2017 Yearly 567:20:00 7356.4 202096
7 all 2016 Yearly 486:23:00 6339.2 201453
8 all 2015 Yearly 419:57:00 5452.6 209859
9 all 2014 Yearly 191:02:00 2469.1 118481