Bike update
This commit is contained in:
parent
9e081a7ea2
commit
850d297630
File diff suppressed because one or more lines are too long
@ -6,14 +6,14 @@
|
||||
"source": [
|
||||
"<div align=\"right\" style=\"text-align: right\"><i>Peter Norvig, Oct 2017<br>pandas Aug 2020<br>Data updated monthly</i></div>\n",
|
||||
"\n",
|
||||
"# Bike Code\n",
|
||||
"# Bike Stats Code\n",
|
||||
"\n",
|
||||
"Code to support the analysis in the notebook [Bike Speed versus Grade.ipynb](Bike%20Speed%20versus%20Grade.ipynb)."
|
||||
"Code to support the analysis in the notebook [Bike-Stats.ipynb](Bike-Stats.ipynb)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"execution_count": 20,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@ -31,7 +31,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Reading Data: `rides`\n",
|
||||
"# Reading Data: `rides` and `yearly`\n",
|
||||
"\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",
|
||||
@ -42,14 +42,14 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": 35,
|
||||
"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",
|
||||
" return drop_index(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",
|
||||
@ -67,19 +67,22 @@
|
||||
" 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))"
|
||||
" kms=round(mi * 1.609, 2))\n",
|
||||
"\n",
|
||||
"def drop_index(frame) -> pd.DataFrame:\n",
|
||||
" \"\"\"Drop the index column.\"\"\"\n",
|
||||
" frame.index = [''] * len(frame)\n",
|
||||
" return frame"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 39,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"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)"
|
||||
"yearly = parse_rides(open('bikeyears.tsv')).drop(columns=['date', 'title'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -97,7 +100,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 23,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@ -114,7 +117,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"execution_count": 24,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@ -125,46 +128,83 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Reading Data: `places`\n",
|
||||
"# Reading Data: `places` and `tiles`\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 [bikeplaceupdates.txt](bikeplaceupdates.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 [bikeplaces.csv](bikeplaces.csv), in a format where\n",
|
||||
"\n",
|
||||
" por | 48.2 | Portola Valley | \n",
|
||||
" --------------------------------------------------------------------------------\n",
|
||||
" 2022-03 por 99.5 sky 99.24\n",
|
||||
" \n",
|
||||
"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.)"
|
||||
" San Carlos,99.0,SMC,22.2,26.0,32.9,,37.2,39.0,40.5,,41.4,,,41.7,,,,,,59.5,78.7\n",
|
||||
"means that San Carlos has 99.0 miles of roads, is in San Mateo County (SMC), and in the first month that I had ridden 22.2% of the roads in the first month that I kept track, and 78.7% in the most recent month. In months with no entry, there was no change."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": 25,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"Place = namedtuple('Place', 'name, miles, special, months, pcts')\n",
|
||||
"\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",
|
||||
" 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 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",
|
||||
"places = parse_places()"
|
||||
"places = pd.read_csv('bikeplaces.csv', comment='#')\n",
|
||||
"months = [m for m in places.columns if '/' in m]\n",
|
||||
"places['maxpct'] = [max(p for p in place[4:] if not pd.isna(p))\n",
|
||||
" for place in places.itertuples()]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 41,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<div>\n",
|
||||
"<style scoped>\n",
|
||||
" .dataframe tbody tr th:only-of-type {\n",
|
||||
" vertical-align: middle;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .dataframe tbody tr th {\n",
|
||||
" vertical-align: top;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .dataframe thead th {\n",
|
||||
" text-align: right;\n",
|
||||
" }\n",
|
||||
"</style>\n",
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: right;\">\n",
|
||||
" <th></th>\n",
|
||||
" <th>date</th>\n",
|
||||
" <th>tiles</th>\n",
|
||||
" <th>square</th>\n",
|
||||
" <th>cluster</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th></th>\n",
|
||||
" <td>Sep 2022</td>\n",
|
||||
" <td>2481</td>\n",
|
||||
" <td>11x11</td>\n",
|
||||
" <td>295</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" date tiles square cluster\n",
|
||||
" Sep 2022 2481 11x11 295"
|
||||
]
|
||||
},
|
||||
"execution_count": 41,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tiles = drop_index(pd.DataFrame(columns='date tiles square cluster'.split(),\n",
|
||||
" data=[('Sep 2022', 2481, '11x11', 295)]))"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -176,11 +216,11 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"execution_count": 27,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plt.rcParams[\"figure.figsize\"] = (10, 6)\n",
|
||||
"plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
|
||||
"\n",
|
||||
"def show(X, Y, data, title='', degrees=(2, 3)): \n",
|
||||
" \"\"\"Plot X versus Y and a best fit curve to it, with some bells and whistles.\"\"\"\n",
|
||||
@ -221,46 +261,35 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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",
|
||||
"special_areas = 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",
|
||||
"def wandering(places, pcts=(100, 99, 90, 50, 33.3, 25, 0), special_areas=special_areas):\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",
|
||||
" inrange = places[(places.maxpct > lo) & (places.maxpct <= hi) & ~places.area.isin(special_areas)]\n",
|
||||
" wandrer_plot(f'Places with {lo}% to {hi}% roads traveled', inrange)\n",
|
||||
" for area in special_areas:\n",
|
||||
" wandrer_plot(special_areas[area], places[places.area == area])\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",
|
||||
"def wandrer_plot(title, places):\n",
|
||||
" \"\"\"Plot Wandrer.earth data for the places with given abbrevs.\"\"\"\n",
|
||||
" if not abbrevs:\n",
|
||||
" if len(places) == 0:\n",
|
||||
" return # Don't make an empty plot\n",
|
||||
" abbrevs = sorted(abbrevs, key=max_pct, reverse=True)\n",
|
||||
" places = places.sort_values(by='maxpct', ascending=False)\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",
|
||||
" for (_, name, miles, area, *pcts, maxpct), marker in zip(places.itertuples(), markers):\n",
|
||||
" pcts = replace_nans(pcts)\n",
|
||||
" ax.plot(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.xticks(range(len(pcts)), labels=months, rotation=90, fontfamily='monospace')\n",
|
||||
" plt.ylabel('Percent of Roads Ridden')\n",
|
||||
" plt.title(title); plt.tight_layout(); grid(axis='y'); plt.show()\n",
|
||||
" \n",
|
||||
@ -274,12 +303,18 @@
|
||||
" 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 replace_nans(numbers) -> list:\n",
|
||||
" \"\"\"Replace NaN (not a number) values with the previous actual number.\"\"\"\n",
|
||||
" result = []\n",
|
||||
" prev = 0\n",
|
||||
" for x in numbers:\n",
|
||||
" if x == x:\n",
|
||||
" prev = x\n",
|
||||
" else: # Not a Number \n",
|
||||
" x = prev\n",
|
||||
" result.append(x)\n",
|
||||
" return result \n",
|
||||
"\n",
|
||||
"def rounded(x: float) -> str: \n",
|
||||
" \"\"\"Round x to 3 spaces wide (if possible).\"\"\"\n",
|
||||
@ -290,35 +325,35 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Pareto Front Across Two Counties"
|
||||
"# Pareto Front "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": 34,
|
||||
"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 = pd.DataFrame(data, columns=['Name', 'Initials', 'SMC %', 'SCC %', 'Front?'])\n",
|
||||
" leaders['SMC miles'] = [round(29.51 * d[2]) for d in data]\n",
|
||||
" leaders['SCC miles'] = [round(75.64 * d[3]) for d in data]\n",
|
||||
" leaders['Total miles'] = leaders['SMC miles'] + leaders['SCC miles']\n",
|
||||
" return leaders\n",
|
||||
" leaders['Total %'] = leaders['SMC %'] + leaders['SCC %']\n",
|
||||
" return drop_index(leaders.sort_values('Total %', ascending=False))\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",
|
||||
"leaders = make_leaders([ # Data as of Sept 8, 2022\n",
|
||||
" ('Barry Mann', 'BM', 75.34, 29.32, 1), ('Jason Molenda', 'JM', 7.13, 54.59, 1), \n",
|
||||
" ('Peter Norvig', 'PN', 55.26, 30.31, 1), ('Brian Feinberg', 'BF', 29.72, 35.93, 1),\n",
|
||||
" ('Jim Brooks', 'JB', 4.23, 43.53, 0), ('Megan Gardner', 'MG', 92.51, 8.69, 1),\n",
|
||||
" ('Matthew Ring', 'MR', 75.53, 1.48, 0), ('Elliot Huff', 'EF', 51.78, 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",
|
||||
" 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",
|
||||
" for i, (name, initials, x, y, *_) in leaders.iterrows():\n",
|
||||
" ax.text(x - 2, y + 2, initials)\n",
|
||||
" return leaders.drop(columns=['Front?'])"
|
||||
]
|
||||
@ -332,7 +367,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": 30,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@ -354,14 +389,14 @@
|
||||
" 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",
|
||||
" return drop_index(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"
|
||||
" return drop_index(df)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -373,30 +408,30 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 31,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"per_month_climbing = [35.491, 31.765, 39.186, 33.641, 32.782, 14.809, 46.731]\n",
|
||||
"per_month_climbing = [35.491, 31.765, 39.186, 33.641, 32.782, 14.809, 46.731, 38.556]\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",
|
||||
" total = np.cumsum(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())"
|
||||
" plt.xticks(range(12), 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split())"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@ -410,7 +445,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.7"
|
||||
"version": "3.9.12"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
157
ipynb/bikeplaces.csv
Normal file
157
ipynb/bikeplaces.csv
Normal file
@ -0,0 +1,157 @@
|
||||
name,miles,area,Jul/20,Aug/20,Sep/20,Oct/20,Nov/20,Dec/20,Jan/21,Feb/21,Mar/21,Apr/21,May/21,Jun/21,Jul/21,Aug/21,Sep/21,Oct/21,Nov/21,Dec/21,Jan/22,Feb/22,Mar/22,Apr/22,May/22,Jun/22,Jul/22,Aug/22
|
||||
#
|
||||
# Sam Mateo County
|
||||
#
|
||||
Atherton,56.3,SMC,,,,,91.2,94.0,95.2,,,94.9,96.2,,98.7,99.5,,99.3,,,99.6,,,,,,,
|
||||
Belmont,98.1,SMC,15.5,17.3,18.6,,20.6,,27.4,,27.5,,,27.4,,,,27.5,,,,,,27.6,,,37.1,51.5
|
||||
Brisbane,40.9,SMC,,,,,,,,,,,,,,,,,,,,,,45.3,,,,
|
||||
Broadmoor,8.8,SMC,,,,,,,,,,,,,,,,,,,,,,,,,38.2,
|
||||
Burlingame Hills,6.0,SMC,,,,,,,0.8,34.5,,,35.5,,,,,,,,,,,,,,,
|
||||
Burlingame,88.4,SMC,9.4,,,,,,,31.5,,,35.5,,,,,,,,,,,,,,,54.3
|
||||
Coal Creek Preserve,3.9,SMC,,,,,,,,,,,,,,,,,,,,,,,,36.7,,
|
||||
Colma,13.7,SMC,,,,,,,,,,,,,,,,,,,,,,,,,24.8,38.3
|
||||
Daly City,148.1,SMC,,,,,,,,,,,,,,,,,,,,,,,,,12.3,25.8
|
||||
East Palo Alto,48.3,SMC,74.4,91.2,91.9,,92.2,93.3,93.4,,,,92.5,,,,95.0,99.2,,,99.7,,,,,,,
|
||||
El Granada,49.2,SMC,,,,,,,,,,,,,,,,,,,,,,,,,35.2,
|
||||
Emerald Lake Hills,24.6,SMC,,94.3,,,,51.0,80.0,85.8,91.3,,,,,,92.2,,,,93.4,96.1,,,,98.1,,98.9
|
||||
Foster City,150.0,SMC,9.1,,,,,,,27.4,37.2,,38.7,,,,,,,,,,,,,51.8,,
|
||||
Half Moon Bay,68.0,SMC,,,,,,,8.9,,,,,,,,,,,,,,,,,,30.5,
|
||||
Half Moon Bay State Beach,4.4,SMC,,,,,,,,,,,,,,,,,,,,,,,,,50.7,
|
||||
Hillsborough,85.3,SMC,3.3,,,,,,3.6,24.5,25.3,,,,,,25.5,,,,,,,,,,,52.5
|
||||
Kensington Square,0.6,SMC,86.9,100.0,,,,,,,,,,,,,99.99,,,,,,,,,,,
|
||||
Ladera,8.1,SMC,,,,,30.5,,,,47.6,,,,50.6,,,82.1,92.0,,99.7,,,,,,,
|
||||
Los Trancos Woods,5.3,SMC,,,,,71.4,,,,,,74.9,75.0,,,,,,,95.8,,,,,99.9,,
|
||||
Menlo Oaks,3.5,SMC,,,,,98.4,99.7,,,,,100.0,,,,,,,,,,,,,,,
|
||||
Menlo Park,139.5,SMC,67.7,76.8,87.7,90.7,91.2,,92.5,,,91.6,,,91.8,,93.5,94.7,,,94.8,,95.7,,,95.1,,95.1
|
||||
Millbrae,65.0,SMC,,,,,,,,18.4,31.6,,32.8,,,,,,,,,,,,,31.9,,40.9
|
||||
Montara,27.8,SMC,,,,,,,,,,,,,,,,,,,,,,,,,26.8,
|
||||
Moss Beach,19.7,SMC,,,,,,,,,,,,,,,,,,,,,,,,,38.5,
|
||||
North Fair Oaks,26.7,SMC,78.1,90.4,93.1,93.8,94.8,96.1,96.9,,99.1,,,,,,99.17,,,,,,,,,,,
|
||||
Pacifica,150.9,SMC,,,,,,,,,,,,,,,,,,,,,,,,,27.5,
|
||||
Palomar Park,4.0,SMC,,,,,,,91.1,,94.9,,,,,,98.1,,,,100.0,,,,,,,
|
||||
Portola Valley,48.2,SMC,,,,,57.3,59.8,,,61.0,,66.2,66.4,67.4,70.3,72.0,,,,90.7,94.0,99.5,,,,,
|
||||
Purisima Creek Preserve,16.5,SMC,,,,,,,,,,,,,,,,,,,,,,,,,35.7,
|
||||
Redwood City,240.5,SMC,34.0,39.1,46.0,51.6,56.9,60.8,62.9,,65.1,,66.3,66.7,67.0,,75.0,77.9,,,83.1,,90.2,,,90.3,,90.8
|
||||
Russian Ridge Preserve,12.2,SMC,,,,,,,,,,,,,,,,,,,,,,,21.8,,,
|
||||
San Bruno,114.0,SMC,,,,,,,,,,25.4,,,,,25.5,,,,,,,27.1,,,,
|
||||
San Carlos,99.0,SMC,22.2,26.0,32.9,,37.2,39.0,40.5,,41.4,,,41.7,,,,,,,,,,,,,59.5,78.7
|
||||
San Mateo,256.0,SMC,11.1,,,,,,11.3,25.5,27.8,,,,,,,,,,,,,,,46.5,,50.6
|
||||
San Mateo Highlands,18.0,SMC,,,,,,,18.0,29.2,,,,,,,,,,,,,,,,76.7,,
|
||||
Sequoia Tract,11.0,SMC,,,,,72.8,82.3,92.5,,,,96.4,,97.5,98.2,99.4,,,,,,,,,,,
|
||||
Sky Londa,11.8,SMC,,,,,72.1,,73.2,,,,75.4,75.5,,,,83.4,,,87.0,,99.2,,,,,
|
||||
Skyline Ridge OSP,0.8,SMC,,,,,,,,,,,,,,,,91.5,,,,,93.5,,,,,
|
||||
South San Francisco,185.3,SMC,,,,,,,,,,,,,,,,,,,,,,26.1,,26.4,,
|
||||
West Menlo Park,11.2,SMC,,,,,97.5,98.1,,,,99.3,99.7,,100.0,,,,,,,,,,,,,
|
||||
Windy Hill Preserve,4.1,SMC,,,,,,,,,,,,,,,,,,,,,,,99.1,,,
|
||||
Woodside,75.2,SMC,51.9,,52.3,,,54.0,56.1,,,,62.2,65.8,81.8,84.3,85.5,,,,91.1,,94.1,96.6,,,,99.3
|
||||
#
|
||||
# Santa Clara County
|
||||
#
|
||||
Branham,44.0,SCC,,,,,,,,,,,,,26.5,27.9,,32.1,,,,,,,,,,
|
||||
Campbell,119.0,SCC,8.9,10.1,12.4,,,,,25.2,26.5,,,,26.8,28.3,,,,,,,,,,,,
|
||||
Communications Hill,27.8,SCC,,,,,,,,,,,,,34.1,,,37.2,,,,,,,,,,
|
||||
Cupertino,172.0,SCC,22.1,23.9,26.2,,,26.3,26.4,,,,26.5,,,,29.5,29.7,,,,,,,,,,
|
||||
Edenvale,30.0,SCC,,,,,,,,,,,,,47.35,,,47.0,,,,,,,,,,
|
||||
Foothills Preserve,1.1,SCC,,,,,,,,,,,,,,,,,,,,,,,,80.7,,
|
||||
Gardner,23.4,SCC,,,,,,,,,,,,,22.6,40.5,,43.9,,,,,,,,,,
|
||||
Gilroy,188.9,SCC,7.9,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Henry Coe State Park,265.9,SCC,,,,,,,,,,,,,,,,,,,,,,,,0.2,,
|
||||
Los Altos,138.2,SCC,40.2,43.7,72.4,77.2,84.5,90.8,91.0,,91.1,,91.2,,,,90.63,90.9,,,91.3,91.4,91.5,,,,,
|
||||
Los Altos Hills,91.3,SCC,48.4,,49.0,55.1,,55.4,55.8,,,,,,56.4,59.0,,62.1,62.5,,65.9,71.0,76.3,91.0,,,,91.1
|
||||
Los Gatos,148.0,SCC,7.5,8.6,8.8,,,,,26.1,,,28.2,,,,,28.6,,,,,,29.1,,,,
|
||||
Loyola,18.3,SCC,,,,,60.8,62.1,,,,,91.5,,91.3,,,,,,,,,92.1,98.7,,,99.5
|
||||
Milpitas,224.0,SCC,2.2,,,,4.4,,,,,26.6,27.2,,,,,29.5,,,,,,,,,,
|
||||
Monte Sereno,20.4,SCC,20.5,,,,,,,39.8,,,44.1,,,,,,,,,,,,,,,
|
||||
Mountain View,208.1,SCC,53.0,59.9,63.0,63.6,72.9,77.1,91.1,,,,92.3,,,,,93.5,,,93.7,,,,92.9,,,
|
||||
Palo Alto,297.2,SCC,63.0,73.6,85.4,85.7,87.1,87.6,88.1,,90.3,90.4,90.5,90.6,,90.7,,91.3,91.5,,93.0,,,,92.8,,,93.0
|
||||
Parkview,42.5,SCC,,,,,,,,,,,,,30.32,,,32.1,,,,,,,,,,
|
||||
San Jose,2618.7,SCC,1.3,1.36,5.3,,,,5.4,,,6.7,11.9,13.1,18.2,19.8,23.1,25.6,,,,,,,26.9,,,
|
||||
Santa Clara,348.0,SCC,6.4,,9.6,,,,,,,26.6,,,,,28.8,29.4,,,,,,,,33.9,,
|
||||
San Martin,35.3,SCC,15.7,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Saratoga,180.0,SCC,14.5,15.7,17.4,,,,,26.9,,,27.2,,,,,,,,,,,,,,,
|
||||
Seven Trees,40.9,SCC,,,,,,,,,,,,,27.96,28.0,,,,,,,,,,,,
|
||||
Spartan Keyes,64.3,SCC,,,,,,,22.1,,,,,,38.9,39.0,,35.8,,,,,,,,,,
|
||||
Sunnyvale,357.0,SCC,19.4,19.9,22.2,,,,25.1,,,25.8,25.9,,,,,31.0,,,31.3,,,,,,46.6,
|
||||
Willow Glen,81.6,SCC,,,,,,,13.9,,,,,,29.67,32.6,,34.9,,,,,,,,,,
|
||||
Willow Glen South,63.3,SCC,,,,,,,,,,,,,22.3,30.6,,30.2,,,,,,,,,,
|
||||
#
|
||||
# Alameda County
|
||||
#
|
||||
Cherryland,20.9,AlC,,,,,,,,,,,,,,,,,26.8,,,,,,,,,
|
||||
Fremont,780.2,AlC,9.0,,,10.0,,,11.7,,27.5,28.1,,,,,,,28.8,,,,,,,,,
|
||||
Hayward,444.5,AlC,,,,,,,4.6,,,,5.1,,,,,,26.3,,,,,,,,,
|
||||
Newark,147.0,AlC,15.0,,,17.0,,,18.7,26.8,30.8,,,,,,,,42.5,,,,,,,,,
|
||||
San Leandro,230.6,AlC,,,,,,,,,,,,,,,,,,,,,,25.9,,,,
|
||||
San Lorenzo,55.5,AlC,,,,,,,,,,,,,,,,,34.56,,,,,34.7,,,,
|
||||
Union City,208.8,AlC,7.0,,,8.0,,,8.8,,25.7,,26.7,,,,,,,,,,,,,,,
|
||||
#
|
||||
# SF Neighborhoods
|
||||
#
|
||||
Presidio Terrace,2.8,sf,,,,,,,37.0,,,,,,,,43.7,,,,,,,,,,,
|
||||
South Beach,4.8,sf,,,,,,,28.2,,,,39.6,,,,,,,,,,,,,,,
|
||||
Golden Gate Park,40.8,sf,,,,,,,25.6,,,,,,,,37.8,,,,,,,,,,,
|
||||
Lake Street,3.9,sf,,,,,,,,,,,,,,,36.8,,,,,,,,,,,
|
||||
Lincoln Park,4.5,sf,,,,,,,43.0,,,,,,,,,,,,,,,,,,,
|
||||
Seacliff,4.1,sf,,,,,,,23.1,,,,,,,,30.7,,,,,,,,,,,
|
||||
Presidio National Park,43.5,sf,,,,,,,21.1,,,,24.4,,,,27.7,,,,,,,,,,,
|
||||
Cole Valley,1.7,sf,,,,,,,19.6,,,,,,,,,,,,,,,,,,,
|
||||
Polk Gulch,4.0,sf,,,,,,,18.2,,,,,,,,,,,,,,,,,,,
|
||||
Balboa Terrace,3.4,sf,,,,,,,18.2,,,,,,,,,,,,,,,,,,,
|
||||
Northern Waterfront,5.6,sf,,,,,,,,,,,16.4,,,,,,,,,,,,,,,
|
||||
Forest Hill,6.1,sf,,,,,,,15.7,,,,,,,,,,,,,,,,,,,
|
||||
Little Hollywood,3.7,sf,,,,,,,,,,,15.4,,,,,,,,,,,,,,,
|
||||
Presidio Heights,6.5,sf,,,,,,,15.1,,,,,,,,,,,,,,,,,,,
|
||||
Aquatic Park Fort Mason,6.4,sf,,,,,,,,,,,14.9,,,,,,,,,,,,,,,
|
||||
Clarendon Heights,6.0,sf,,,,,,,14.3,,,,,,,,,,,,,,,,,,,
|
||||
Fisherman's Wharf,6.2,sf,,,,,,,,,,,14.2,,,,,,,,,,,,,,,
|
||||
Sutro Heights,7.1,sf,,,,,,,,,,,14.0,,,,,,,,,,,,,,,
|
||||
Ashbury Heights,3.7,sf,,,,,,,12.9,,,,,,,,,,,,,,,,,,,
|
||||
Dogpatch,5.1,sf,,,,,,,,,,,12.4,,,,,,,,,,,,,,,
|
||||
Cow Hollow,12.0,sf,,,,,,,5.0,,,,12.0,,,,,,,,,,,,,,,
|
||||
Pacific Heights,18.0,sf,,,,,,,10.8,,,,,,,,,,,,,,,,,,,
|
||||
Golden Gate Heights,17.8,sf,,,,,,,10.7,,,,,,,,,,,,,,,,,,,
|
||||
Financial District,9.4,sf,,,,,,,5.8,,,,9.7,,,,,,,,,,,,,,,
|
||||
Mission Bay,13.8,sf,,,,,,,,,,,9.3,,,,,,,,,,,,,,,
|
||||
Central Waterfront,10.2,sf,,,,,,,,,,,6.7,,,,,,,,,,,,,,,
|
||||
#
|
||||
# Far Away Places
|
||||
#
|
||||
Barangaroo; NSW,1.7,far,49.9,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Millers Point; NSW,3.2,far,38.2,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Cambridge; MA,180.8,far,6.4,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
MIT; MA,9.6,far,37.2,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Muir Beach; Marin,4.6,far,35.8,,,,,,,,,,,,,,,,,,,,,,37.2,,,
|
||||
Marin Headlands GGNRA,65.7,far,,,,,,,,,,,,,,,,,,,,,,,30.8,,,
|
||||
Mt Tamalpais State Park,31.7,far,,,,,,,,,,,,,,,,,,,,,,,40.3,,,
|
||||
Dawes Point; NSW,1.8,far,29.2,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Mokelumne Hill; Calaveras,14.7,far,28.9,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Guerneville; Sonoma,22.7,far,23.4,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Healdsburg; Sonoma,53.7,far,18.5,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Bodega Bay; Sonoma,28.9,far,18.0,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Sausalito; Marin,32.7,far,,,,,,,,,,,13.1,,,,,,,,,,,,,,,
|
||||
Corte Madera; Marin,51.0,far,,,,,,,,,,,13.0,,,,,,,,,,,,,,,
|
||||
Stinson Beach; Marin,11.2,far,9.2,,,,,,,,,,,,,,,,,,,,,,37.4,,,
|
||||
Mill Valley; Marin,92.2,far,,,,,,,,,,,5.1,,,,,,,,,,,,,,,
|
||||
San Rafael; Marin,260.0,far,,,,,,,,,,,3.7,,,,,,,,,,,,,,,
|
||||
Emeryville,28.1,far,,,,,,,5.5,,,,7.0,,,,,,,,,,,,,,,
|
||||
Berkeley,260.3,far,5.0,,,7.0,,,,,,,,,,,,,,,,,,,,,,
|
||||
Albany,42.7,far,,,,,,,,,,,6.6,,,,,,,,,,,,,,,
|
||||
Rosie Riveter Park,5.5,far,,,,,,,,,,,29.3,,,,,,,,,,,,,,,
|
||||
#
|
||||
# Counties
|
||||
#
|
||||
San Mateo,2951.0,county,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,36.08,36.41,37.3,38.06,40.33,47.2,48.1,50.06,53.96
|
||||
Santa Clara,7564.0,county,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,28.24,28.39,28.5,28.56,29.04,,,30.31,30.34
|
||||
Alameda,5704.0,county,3.3,,,3.94,,,4.73,,7.06,7.14,7.34,,,,,,9.86,9.87,,,,10.96,,,,
|
||||
Marin,2322.0,county,6.7,,,,,,,,,,7.98,,,,,,,,,,,,,,,
|
||||
San Francisco,1197.0,county,4.5,,,,,,,,,,5.47,,,,6.4,6.51,,,,,,,,,,
|
||||
Napa,1524.0,county,5.1,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Sonoma,4556.0,county,5.1,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Santa Cruz,2767.0,county,2.3,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Contra Costa,6034.0,county,1.0,,,,,,,,,1.41,,,,,,,,1.42,,,,,,,,
|
||||
#
|
||||
# Big Places
|
||||
#
|
||||
California,375216.0,big,0.712,0.811,0.846,0.867,0.8875,,0.9054,0.9624,1.0289,1.0758,1.1278,1.1386,1.1812,1.1939,1.2007,1.2524,1.2987,,1.3048,1.3106,1.3136,1.3565,1.3877,1.4023,1.4656,1.4968
|
||||
USA,6406754.0,big,0.048,0.052,0.055,0.05589,0.0571,0.05749,0.05853,0.06183,0.06553,0.06824,0.07138,0.072,0.07446,0.0752,0.07665,0.07904,0.08173,0.08199,0.08252,0.083,0.08314,0.08565,0.087,0.089,0.09215,0.09399
|
||||
Earth,40818989.0,big,0.008,0.0089,0.0091,0.00936,0.009535,0.009536,0.009597,0.010136,0.010561,0.010997,0.011349,0.011448,0.011839,0.011955,0.012024,0.0124113,0.012835,0.012886,0.013799,0.013855,0.013895,0.01429,0.01479,0.01482,0.014891,0.015172
|
|
@ -1,5 +1,6 @@
|
||||
date year title hours miles feet
|
||||
##### 2019-2022: Mostly Eddington rides; most recent first
|
||||
Sat, 9/17 2022 San Gregorio / Tunitas 6:33:44 80.53 6,015
|
||||
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
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -1,9 +1,10 @@
|
||||
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
|
||||
all 2022 Yearly 398:48:00 4382 292575
|
||||
all 2021 Yearly 490:32:00 6064 196634
|
||||
all 2020 Yearly 438:53:00 5341 94777
|
||||
all 2019 Yearly 476:19:00 6016 149797
|
||||
all 2018 Yearly 475:56:00 6101 158642
|
||||
all 2017 Yearly 567:20:00 7356 202096
|
||||
all 2016 Yearly 486:23:00 6339 201453
|
||||
all 2015 Yearly 419:57:00 5452 209859
|
||||
all 2014 Yearly 191:02:00 2469 118481
|
|
BIN
ipynb/tilehunter.jpg
Normal file
BIN
ipynb/tilehunter.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 257 KiB |
Loading…
Reference in New Issue
Block a user