Add files via upload

This commit is contained in:
Peter Norvig
2021-03-03 22:12:21 -08:00
committed by GitHub
parent 655100de00
commit 9482cc3a91
3 changed files with 799 additions and 743 deletions

File diff suppressed because one or more lines are too long

View File

@@ -19,6 +19,7 @@
"source": [ "source": [
"from IPython.core.display import HTML\n", "from IPython.core.display import HTML\n",
"from typing import Iterator, Tuple, List, Dict\n", "from typing import Iterator, Tuple, List, Dict\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n", "import matplotlib.pyplot as plt\n",
"import numpy as np\n", "import numpy as np\n",
"import pandas as pd\n", "import pandas as pd\n",
@@ -159,9 +160,10 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"plt.rcParams[\"figure.figsize\"] = (10, 6)\n",
"\n",
"def show(X, Y, xlabel='Segment Grade (percent)', ylabel='Speed (mph)', degrees=(2, 3)): \n", "def show(X, Y, xlabel='Segment Grade (percent)', ylabel='Speed (mph)', degrees=(2, 3)): \n",
" \"\"\"Plot X versus Y and a best fit curve to it, with some bells and whistles.\"\"\"\n", " \"\"\"Plot X versus Y and a best fit curve to it, with some bells and whistles.\"\"\"\n",
" plt.rcParams[\"figure.figsize\"] = (9, 6)\n",
" grid(); plt.ylabel(ylabel); plt.xlabel(xlabel)\n", " grid(); plt.ylabel(ylabel); plt.xlabel(xlabel)\n",
" plt.scatter(X, Y, c='grey', marker='+')\n", " plt.scatter(X, Y, c='grey', marker='+')\n",
" X1 = np.linspace(min(X), max(X), 100)\n", " X1 = np.linspace(min(X), max(X), 100)\n",
@@ -185,6 +187,532 @@
" return 60 * dist / mph(climb / dist)" " return 60 * dist / mph(climb / dist)"
] ]
}, },
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Strava Data\n",
"\n",
"Here is my raw data from Strava, for rides and segments:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"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>title</th>\n",
" <th>hours</th>\n",
" <th>miles</th>\n",
" <th>feet</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Sun, 2/7/2021</td>\n",
" <td>Saratoga / Campbell</td>\n",
" <td>5.8925</td>\n",
" <td>78.38</td>\n",
" <td>2270.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Fri, 1/8/2021</td>\n",
" <td>Coyote Hills Geocaching</td>\n",
" <td>4.9689</td>\n",
" <td>69.08</td>\n",
" <td>797.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun, 10/11/2020</td>\n",
" <td>Los Altos Hills Paths</td>\n",
" <td>5.8247</td>\n",
" <td>65.03</td>\n",
" <td>1870.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Mon, 10/5/2020</td>\n",
" <td>Half way around the bay on bay trail</td>\n",
" <td>6.4431</td>\n",
" <td>80.05</td>\n",
" <td>541.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Tue, 9/29/2020</td>\n",
" <td>Saratoga Geocaching</td>\n",
" <td>4.9722</td>\n",
" <td>64.30</td>\n",
" <td>961.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>474</th>\n",
" <td>Sat, 3/19/2016</td>\n",
" <td>Morning Ride</td>\n",
" <td>1.4667</td>\n",
" <td>24.00</td>\n",
" <td>1125.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>475</th>\n",
" <td>Sat, 7/13/2013</td>\n",
" <td>Doug's Event</td>\n",
" <td>1.8653</td>\n",
" <td>21.35</td>\n",
" <td>1677.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>476</th>\n",
" <td>Sun, 8/4/2013</td>\n",
" <td>Kris's first trike ride</td>\n",
" <td>1.8558</td>\n",
" <td>20.96</td>\n",
" <td>988.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>477</th>\n",
" <td>Sun, 11/24/2013</td>\n",
" <td>Alpine Rd</td>\n",
" <td>1.7100</td>\n",
" <td>21.02</td>\n",
" <td>1289.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>478</th>\n",
" <td>Fri, 11/29/2013</td>\n",
" <td>Woodside Loop</td>\n",
" <td>1.5600</td>\n",
" <td>22.75</td>\n",
" <td>1011.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>479 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" date title hours miles \\\n",
"0 Sun, 2/7/2021 Saratoga / Campbell 5.8925 78.38 \n",
"1 Fri, 1/8/2021 Coyote Hills Geocaching 4.9689 69.08 \n",
"2 Sun, 10/11/2020 Los Altos Hills Paths 5.8247 65.03 \n",
"3 Mon, 10/5/2020 Half way around the bay on bay trail 6.4431 80.05 \n",
"4 Tue, 9/29/2020 Saratoga Geocaching 4.9722 64.30 \n",
".. ... ... ... ... \n",
"474 Sat, 3/19/2016 Morning Ride 1.4667 24.00 \n",
"475 Sat, 7/13/2013 Doug's Event 1.8653 21.35 \n",
"476 Sun, 8/4/2013 Kris's first trike ride 1.8558 20.96 \n",
"477 Sun, 11/24/2013 Alpine Rd 1.7100 21.02 \n",
"478 Fri, 11/29/2013 Woodside Loop 1.5600 22.75 \n",
"\n",
" feet \n",
"0 2270.0 \n",
"1 797.0 \n",
"2 1870.0 \n",
"3 541.0 \n",
"4 961.0 \n",
".. ... \n",
"474 1125.0 \n",
"475 1677.0 \n",
"476 988.0 \n",
"477 1289.0 \n",
"478 1011.0 \n",
"\n",
"[479 rows x 5 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rides"
]
},
{
"cell_type": "code",
"execution_count": 9,
"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>hours</th>\n",
" <th>miles</th>\n",
" <th>feet</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>479.000000</td>\n",
" <td>479.000000</td>\n",
" <td>479.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>3.090990</td>\n",
" <td>39.931900</td>\n",
" <td>1632.755741</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>1.294152</td>\n",
" <td>15.772976</td>\n",
" <td>1345.854656</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>1.466700</td>\n",
" <td>20.960000</td>\n",
" <td>68.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>2.129850</td>\n",
" <td>27.980000</td>\n",
" <td>657.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>2.666900</td>\n",
" <td>34.280000</td>\n",
" <td>1286.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>3.616350</td>\n",
" <td>45.180000</td>\n",
" <td>2088.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>8.137500</td>\n",
" <td>101.000000</td>\n",
" <td>7644.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" hours miles feet\n",
"count 479.000000 479.000000 479.000000\n",
"mean 3.090990 39.931900 1632.755741\n",
"std 1.294152 15.772976 1345.854656\n",
"min 1.466700 20.960000 68.000000\n",
"25% 2.129850 27.980000 657.500000\n",
"50% 2.666900 34.280000 1286.000000\n",
"75% 3.616350 45.180000 2088.500000\n",
"max 8.137500 101.000000 7644.000000"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rides.describe()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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>title</th>\n",
" <th>miles</th>\n",
" <th>feet</th>\n",
" <th>hours</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Alma Mountain Charlie</td>\n",
" <td>3.12</td>\n",
" <td>875.0</td>\n",
" <td>0.5303</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Alpine Westridge</td>\n",
" <td>0.76</td>\n",
" <td>99.0</td>\n",
" <td>0.0572</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Alpine Westridge</td>\n",
" <td>0.76</td>\n",
" <td>99.0</td>\n",
" <td>0.0581</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Alpine Westridge</td>\n",
" <td>0.76</td>\n",
" <td>99.0</td>\n",
" <td>0.0619</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Alpine last kicker</td>\n",
" <td>0.39</td>\n",
" <td>114.0</td>\n",
" <td>0.0531</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>129</th>\n",
" <td>Westridge Hill 2</td>\n",
" <td>0.51</td>\n",
" <td>166.0</td>\n",
" <td>0.0861</td>\n",
" </tr>\n",
" <tr>\n",
" <th>130</th>\n",
" <td>Westridge Hill 2</td>\n",
" <td>0.51</td>\n",
" <td>166.0</td>\n",
" <td>0.0889</td>\n",
" </tr>\n",
" <tr>\n",
" <th>131</th>\n",
" <td>Woodside Climb</td>\n",
" <td>1.71</td>\n",
" <td>295.0</td>\n",
" <td>0.1347</td>\n",
" </tr>\n",
" <tr>\n",
" <th>132</th>\n",
" <td>Woodside Climb</td>\n",
" <td>1.71</td>\n",
" <td>295.0</td>\n",
" <td>0.1500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>133</th>\n",
" <td>Woodside Climb</td>\n",
" <td>1.71</td>\n",
" <td>295.0</td>\n",
" <td>0.1597</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>134 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" title miles feet hours\n",
"0 Alma Mountain Charlie 3.12 875.0 0.5303\n",
"1 Alpine Westridge 0.76 99.0 0.0572\n",
"2 Alpine Westridge 0.76 99.0 0.0581\n",
"3 Alpine Westridge 0.76 99.0 0.0619\n",
"4 Alpine last kicker 0.39 114.0 0.0531\n",
".. ... ... ... ...\n",
"129 Westridge Hill 2 0.51 166.0 0.0861\n",
"130 Westridge Hill 2 0.51 166.0 0.0889\n",
"131 Woodside Climb 1.71 295.0 0.1347\n",
"132 Woodside Climb 1.71 295.0 0.1500\n",
"133 Woodside Climb 1.71 295.0 0.1597\n",
"\n",
"[134 rows x 4 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"segments"
]
},
{
"cell_type": "code",
"execution_count": 11,
"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>miles</th>\n",
" <th>feet</th>\n",
" <th>hours</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>134.000000</td>\n",
" <td>134.000000</td>\n",
" <td>134.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.927761</td>\n",
" <td>264.037313</td>\n",
" <td>0.141800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.631672</td>\n",
" <td>223.422436</td>\n",
" <td>0.113192</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.170000</td>\n",
" <td>35.000000</td>\n",
" <td>0.026700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.470000</td>\n",
" <td>122.000000</td>\n",
" <td>0.066450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>0.760000</td>\n",
" <td>193.000000</td>\n",
" <td>0.109000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>1.215000</td>\n",
" <td>322.000000</td>\n",
" <td>0.169200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>3.120000</td>\n",
" <td>1255.000000</td>\n",
" <td>0.612200</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" miles feet hours\n",
"count 134.000000 134.000000 134.000000\n",
"mean 0.927761 264.037313 0.141800\n",
"std 0.631672 223.422436 0.113192\n",
"min 0.170000 35.000000 0.026700\n",
"25% 0.470000 122.000000 0.066450\n",
"50% 0.760000 193.000000 0.109000\n",
"75% 1.215000 322.000000 0.169200\n",
"max 3.120000 1255.000000 0.612200"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"segments.describe()"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@@ -200,7 +728,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 12,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -209,7 +737,8 @@
" def __str__(self): return f'{(self - 1) // 12}-{self % 12 or 12:02d}'\n", " def __str__(self): return f'{(self - 1) // 12}-{self % 12 or 12:02d}'\n",
"\n", "\n",
"start = Month(2020 * 12 + 7) # Starting month: July 2020\n", "start = Month(2020 * 12 + 7) # Starting month: July 2020\n",
"dates = [Month(start + i) for i in range(7)]\n", "dates = [Month(start + i) for i in range(8)]\n",
"bonuses = (25, 90, 99)\n",
"\n", "\n",
"Entry = Tuple[str, float, List[float]] # (Place_Name, miles_of_roads, [pct_by_month,...])\n", "Entry = Tuple[str, float, List[float]] # (Place_Name, miles_of_roads, [pct_by_month,...])\n",
"\n", "\n",
@@ -220,17 +749,24 @@
" for (place, miles, pcts), marker in zip(entries, '^v><osdhxDHPX*1234'):\n", " for (place, miles, pcts), marker in zip(entries, '^v><osdhxDHPX*1234'):\n",
" X = [dates[i] for i in range(D) if pcts[i]]\n", " X = [dates[i] for i in range(D) if pcts[i]]\n",
" Y = [pcts[i] for i in range(D) if pcts[i]]\n", " Y = [pcts[i] for i in range(D) if pcts[i]]\n",
" L = f'{pcts[-1]}% {place} ({rounded(miles * pcts[-1] / 100)}/{rounded(miles)} mi)'\n", " ax.plot(X, Y, ':', marker=marker, label=label(pcts, place, miles))\n",
" ax.plot(X, Y, ':', marker=marker, label=L)\n",
" all_pcts = [p for _, _, pcts in entries for p in pcts if p]\n", " all_pcts = [p for _, _, pcts in entries for p in pcts if p]\n",
" for p in (25, 90): # Bonus Points (also, 50, 75, 99)\n", " for p in bonuses: \n",
" if min(all_pcts) < p < max(all_pcts):\n", " if min(all_pcts) < p < max(all_pcts):\n",
" ax.plot(dates, [p] * D, 'k:', lw=1, alpha=3/4) # Plot bonus line\n", " ax.plot(dates, [p] * D, 'k:', lw=1, alpha=3/4) # Plot bonus line\n",
" ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), shadow=True)\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.xticks(dates, [str(d) for d in dates], rotation=90)\n",
" plt.ylabel('Percent of Area Ridden')\n", " plt.ylabel('Percent of Area Ridden')\n",
" plt.title(category); plt.tight_layout(); grid(axis='y'); plt.show()\n", " plt.title(category); plt.tight_layout(); grid(axis='y'); plt.show()\n",
" \n", " \n",
"def label(pcts, place, miles) -> str:\n",
" pct = f'{rounded(pcts[-1]):>3}' if pcts[-1] > 1 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", "def parse_places(lines) -> Dict[str, List[Entry]]:\n",
" \"Parse bikeplaces.txt into a dict of {'Title': [entry,...]}\"\n", " \"Parse bikeplaces.txt into a dict of {'Title': [entry,...]}\"\n",
" places = {}\n", " places = {}\n",
@@ -249,6 +785,8 @@
" \n", " \n",
"def parse_entry(line: str, dates=dates) -> Entry:\n", "def parse_entry(line: str, dates=dates) -> Entry:\n",
" \"\"\"Parse line => ('Place Name', miles, [percents]); '=' can be used.\"\"\"\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", " 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 = re.sub('( [0-9.]+)[*]([0-9]+)', lambda m: m.group(1) * int(m.group(2)),\n",
" pcts).split()\n", " pcts).split()\n",
@@ -267,7 +805,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 13,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [

View File

@@ -1,63 +1,94 @@
:Around 90%: :Around 90%:
Los Altos: 138: 40.2 43.7 72.4 77.2 84.5 90.8 | 91.0 Los Altos: 138: 40.2 43.7 72.4 77.2 84.5 90.8 | 91.0*2
Atherton: 56.8: 0*4 91.2 94.0 | 95.2 Atherton: 56.8: 0*4 91.2 94.0 | 95.2*2
East Palo Alto: 46.5: 74.4 91.2 91.9*2 92.2 93.3 | 93.4 East Palo Alto: 46.5: 74.4 91.2 91.9*2 92.2 93.3 | 93.4*2
Menlo Park: 131.5: 67.7 76.8 87.7 90.7 91.2 90.1 | 92.5 Emerald Lake Hills: 24.8: 0.0 94.3*3 44.7 51.0 | 80.0 85.8
North Fair Oaks: 27: 48.1 90.4 93.1 93.8 94.8 96.1 | 96.9 Menlo Park: 131.5: 67.7 76.8 87.7 90.7 91.2 90.1 | 92.5*2
Mountain View: 205: 53.0 59.9 63.0 63.6 72.9 77.1 | 91.1 North Fair Oaks: 27: 48.1 90.4 93.1 93.8 94.8 96.1 | 96.9*2
Palo Alto: 292: 63.0 73.6 85.4 85.7 87.1 87.6 | 88.1 Mountain View: 205: 53.0 59.9 63.0 63.6 72.9 77.1 | 91.1*2
Palo Alto: 292: 63.0 73.6 85.4 85.7 87.1 87.6 | 88.1*2
:Around 50%:
Burlingame: 88.4: 9.4*6 | 9.4 31.5
Los Altos Hills: 91: 48.4*2 49.0 55.1*2 55.4 | 55.8*2
Monte Sereno: 20.4: 20.5*6 | 20.5 39.8
Portola Valley: 59: 0*4 57.3 59.8 | 59.8*2
Redwood City: 241: 34.0 39.1 46.0 51.6 56.9 60.8 | 62.9*2
San Carlos: 99: 22.2 26.0 32.9 32.9 37.2 39.0 | 40.5*2
Woodside: 77: 51.9*2 52.3*3 54.0 | 54*2
:Around 25%: :Around 25%:
Cupertino: 172: 22.1 23.9 26.2*3 26.3 | 26.4 Belmont: 98: 15.5 17.3 18.6 18.6 20.6*2 | 27.4*2
Saratoga: 180: 14.5 15.7 17.4*4 | 17.4 Bodega Bay: 28.9: 18*6 | 18*2
Sunnyvale: 357: 19.4 19.9 22.2*4 | 25.1 Campbell: 119: 8.9 10.1 12.4*4 | 12.4 25.2
Belmont: 98: 15.5 17.3 18.6 18.6 20.6 20.6 | 27.4 Cupertino: 172: 22.1 23.9 26.2*3 26.3 | 26.4*2
Newark: 145: 15*3 17*3 | 18.7 Guerniville: 22.7: 23.4*6 | 23.4*2
Healdsburg: 53.7: 18.5*6 | 18.5*2
:In Between 25% and 90%: Foster City: 150: 9.1*6 | 9.1 27.4
Los Altos Hills: 91: 48.4*2 49.0 55.1*2 55.4 | 55.8 Hillsborough: 85.3: 3.3*6 | 3.6 24.5
Portola Valley: 59: 0*4 57.3 59.8 | 59.8 Los Gatos: 148: 7.5 8.6 8.8*4 | 8.8 26.1
Redwood City: 241: 34.0 39.1 46.0 51.6 56.9 60.8 | 62.9 Millbrae: 65: 0*6 | 0 18.4
San Carlos: 99: 22.2 26.0 32.9 32.9 37.2 39.0 | 40.5 Newark: 145: 15*3 17*3 | 18.7 26.8
Woodside: 77: 51.9*2 52.3*3 54.0 | 54 San Mateo: 256: 11.1*6 | 11.3 25.5
Saratoga: 180: 14.5 15.7 17.4*4 | 17.4 26.9
Sunnyvale: 357: 19.4 19.9 22.2*4 | 25.1*2
Union City: 207: 7*3 8*3 | 8.8 14.51
:Just Getting Started: :Just Getting Started:
Campbell: 119: 8.9 10.1 12.4*4 | 12.4 Milpitas: 224: 2.2*4 4.4*2 | 4.4*2
Los Gatos: 148: 7.5 8.6 8.8*4 | 8.8 San Jose: 2543: 1.3 1.36 5.3*4 | 5.4*2
Milpitas: 224: 2.2*4 4.4*2 | 4.4 Santa Clara: 348: 6.4*2 9.6*4 | 9.6*2
San Jose: 2543: 1.3 1.36 5.3*4 | 5.3 Berkeley: 260: 5.0*3 7.0*3 | 7.0*2
Santa Clara: 348: 6.4*2 9.6*4 | 9.6 Fremont: 771: 9*3 10*3 | 11.7*2
Foster City: 150: 9.1*6 | 9.1 Cambridge: 180.8: 6.4*6 | 6.4*2
San Mateo: 412: 11.1*6 | 11.3
Berkeley: 260: 5.0*3 7.0*3 | 7.0
Fremont: 771: 9*3 10*3 | 11.7
Union City: 207: 7*3 8*3 | 8.8
:Small Neighborhoods (under 25 road miles): :Small Neighborhoods (under 20 road miles):
Emerald Lake Hills: 24.8: 0.0 94.3*3 44.7 51.0 | 80.0 Burlingame Hills: 6: 0*6 | 0.8 34.5
Kensington Square: 0.6: 86.9 99.4 100*4 | 100 Kensington Square: 0.6: 86.9 100*5 | 100*2
Ladera: 8.0: 0*4 30.5 29.8 | 29.8 Ladera: 8.0: 0*4 30.5 29.8 | 29.8*2
Loyola: 18.3: 0*4 60.8 62.1 | 62.1 Loyola: 18.3: 0*4 60.8 62.1 | 62.1*2
Los Trancos Woods: 5.4: 0*4 71.4*2 | 71.4 Los Trancos Woods: 5.4: 0*4 71.4*2 | 71.4*2
Menlo Oaks: 3.6: 0*4 98.4 99.7 | 99.7 Menlo Oaks: 3.6: 0*4 98.4 99.7 | 99.7*2
Monte Sereno: 20.4: 20.5*6 | 20.5 Muir Beach: 4.6: 0*6 | 35.8*2
Palomar Park: 3.9: 0*6 | 91.1 Palomar Park: 3.9: 0*6 | 91.1*2
San Mateo Highlands: 18: 0*6 | 18.0 San Mateo Highlands: 18: 0*6 | 18.0 29.2
Sequoia Tract: 11.9: 0*4 72.8 82.3 | 92.5 Sequoia Tract: 11.9: 0*4 72.8 82.3 | 92.5*2
Sky Londa: 11.8: 0*4 72.1*2 | 73.2 Stinson Beach: 11.2: 0*6 | 9.2*2
West Menlo Park: 11: 0*4 97.5 98.1 | 98.1 Sky Londa: 11.8: 0*4 72.1*2 | 73.2*2
West Menlo Park: 11: 0*4 97.5 98.1 | 98.1*2
Mokelumne Hill: 14.7: 28.9*6 | 28.9*2
MIT, Cambridge: 9.6: 37.2*6 | 37.2*2
:Large Places (over 300,000 road miles): :San Francisco Neighborhoods:
California: 365188: .712 .811 .846 .867 .8875 .8873 | .9054 Balboa Terrace: 3.4: 0*6 | 18.2*2
USA: 6317607: .048 .052 .055 .05589 .0571 .05749 | .05853 Cole Valley: 1.7: 0*6 | 19.6*2
Earth: 38609276: .008 .0089 .0091 .00936 .009535 .009426| .009597 Forest Hill: 6.1: 0*6 | 15.7*2
Golden Gate Park: 40.5: 0*6 | 25.8*2
Lincoln Park: 3.8: 0*6 | 42.4*2
Pacific Heights: 18: 0*6 | 10.8*2
Ashbury Heights: 3.7: 0*6 | 12.9*2
Clarendon Heights: 6: 0*6 | 14.3*2
Cow Hollow: 12: 0*6 |5*2
Financial District: 9.4: 0*6 |5.8*2
Golden Gate Heights: 17.8: 0*6 | 10.7*2
Polk Gulch: 4: 0*6 | 18.2*2
Presidio Heights: 6.5: 0*6 | 15.1*2
Presidio Park: 43.1: 0*6 | 21.1*2
Presidio Terrace: 2.7: 0*6 | 37.7*2
Seacliff: 4.1: 0*6 | 23.1*2
South Beach: 4.8: 0*6 | 28.2*2
:California Counties: :California Counties:
San Mateo: 3248: 20.1 21.2 22.9 23.4 24.57 25.53 | 26.43 San Mateo: 3248: 20.1 21.2 22.9 23.4 24.57 25.53 | 26.43 30.0
Santa Clara: 7396: 12.7 13.6 15.4 15.6 16.04 16.29 | 16.78 Santa Clara: 7396: 12.7 13.6 15.4 15.6 16.04 16.29 | 16.78 17.73
Alameda: 5704: 3.3*3 3.94*3 | 3.97 Alameda: 5704: 3.3*3 3.94*3 | 3.97*2
Marin: 2322: 6.7*6 | 6.7 Marin: 2322: 6.7*6 | 6.7*2
Napa: 1524: 5.1*6 | 5.1 Napa: 1524: 5.1*6 | 5.1*2
Sonoma: 4556: 5.1*6 | 5.1 Sonoma: 4556: 5.1*6 | 5.1*2
San Francisco: 1183: 4.5*6 | 4.5 San Francisco: 1183: 4.5*6 | 4.5*2
Santa Cruz: 2767: 2.3*6 | 2.3 Santa Cruz: 2767: 2.3*6 | 2.3*2
:Large Places (over 300,000 road miles):
California: 365188: .712 .811 .846 .867 .8875 .8873 | .9054 .9624
USA: 6317607: .048 .052 .055 .05589 .0571 .05749 | .05853 .06183
Earth: 38609276: .008 .0089 .0091 .00936 .009535 .009426| .009597 .010136