Add files via upload

This commit is contained in:
Peter Norvig authored and GitHub committed 2019-07-06 10:47:57 -07:00
1 parent e5d52dc278
commit bd3daab7fe
3 files changed
+109 -92

No files matched your search

+80 -77
View File
@@ -44,7 +44,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"I'll want to plot the data to visualize it, so I'll collect four interesting vectors of numbers: length of ride in miles, speed in miles per hour, grade in feet climbed per mile, and grade in percent:"
"I'll collect three interesting vectors of numbers: length of ride in miles, speed in miles per hour, grade in feet climbed per mile, and grade in percent. Then I'll start with a simple scatter plot visualization:"
]
},
{
@@ -54,7 +54,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
@@ -97,10 +97,9 @@
" plt.rcParams[\"figure.figsize\"] = (12, 10)\n",
" plt.style.use('fivethirtyeight')\n",
" plt.ylabel(ylabel); plt.xlabel(xlabel)\n",
" plt.minorticks_on(); plt.grid(True, which='major'); plt.grid(True, which='minor', alpha=0.4)\n",
" plt.scatter(X, Y) \n",
" X1 = sorted(set(X))\n",
" F = poly_fit(X, Y, degree)\n",
" X1 = sorted(set(X))\n",
" plt.plot(X1, [F(x) for x in X1], 'k:')\n",
" \n",
"def poly_fit(X, Y, degree) -> callable:\n",
@@ -116,7 +115,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAKACAYAAACYDjf4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xt8U/X9P/BX2qQX2tAWKG25lVYKFofcRBCkwFC8ATIRB4K3bfBl6Fd38etlwtQNxfnb1Ck6GXPT+cDpcMhEgU5FO0BkXOrAC7RYaCm0UFpS0vSWpvn9UZMmzTknJ8k5yTnJ6/l4+HiY5OTkc3JOyft9Pp/352OwWCxOEBERERERaURcpBtARERERETkiUkKERERERFpCpMUIiIiIiLSFCYpRERERESkKUxSiIiIiIhIU5ikEBERERGRpjBJISIiIiIiTYlokrJ7924sXLgQhYWFSE9Px4YNG7xeT09PF/zv/vvvj1CLiYiIiIhIbcZIfrjNZsPIkSOxaNEiLF++3Of1o0ePej0uLS3FwoULMW/evHA1kYiIiIiIwiyiScqsWbMwa9YsAMCKFSt8Xs/KyvJ6vHXrVgwbNgxXXnllWNpHREREREThp5ualKamJmzatAl33HFHpJtCREREREQqimhPSiDefvtttLe3Y9GiRX63LS8vD0OLiIiIiIgoGAUFBZKv6yZJee2113D99dejX79+frf1d9CBKC8vV3R/pDyeI+3jOdI+niPt4znSPp4j7eM50g9dDPc6dOgQSktLOdSLiIiIiCgG6CJJee2115Cbm4vp06dHuilERERERKSyiA73ampqQkVFBQCgs7MT1dXVOHToEDIyMjB48GAAQHNzMzZu3Ih7770XBoMhks0lIiIiIqIwiGhPSmlpKYqKilBUVISWlhasWbMGRUVFePLJJ93bbNq0CTabDYsXL45gS4mIiIiIKFwi2pMydepUWCwWyW2WLFmCJUuWhKlFREREREQUabqoSSEiIiIiotjBJIWIiIiIiDSFSQoREREREWkKkxQiIiIiItIUJilERERERKQpTFKIiIiIiEhTmKQQEREREZGmMEkhIiIiIiJNYZJCRERERESawiSFiIiIiIg0hUkKERERERFpCpMUIiIiIiLSFCYpRERERESkKUxSiIiIiIhIU5ikEBERERGRphgj3QAi0pZKqx2rD1pR0+xATq94rBxnRq7ZFOlmERERUQxhkkJEbpVWO+YV1+O41eF+bn9dOzZf05eJChEREYUNh3sRkdvqg1avBAUAjlsdWH3QGqEWERERUSxikkJEbjXNDsHna0WeJyIiIlIDkxQicsvpFS/4fLbI80RERERqYJJCRG4rx5mRZ/ZOSPLMXcXzREREROHCwnkicss1m7D5mr5YfdCK2mYHsjm7FxEREUUAkxQi8pJrNmH9tD6RbgYRERHFMA73IiIiIiIiTWGSQkREREREmsIkhYiIiIiINIVJChERERERaQqTFCIiIiIi0hQmKUREREREpClMUoiIiIiISFOYpBARERERkaYwSSEiIiIiIk1hkkJERERERJrCJIWIiIiIiDSFSQoREREREWkKkxQiIiIiItIUJilERERERKQpTFKIiIiIiEhTmKQQEREREZGmMEkhIiIiIiJNYZJCRERERESawiSFiIiIiIg0hUkKERERERFpCpMUIiIiIiLSFCYpRERERESkKUxSiIiIiIhIU5ikEBERERGRphgj3QAivau02rH6oBU1zQ7k9IrHynFm5JpNkW4WERERkW4xSSEKQaXVjnnF9Thudbif21/Xjs3X9GWiQkRERBQkDvciCsHqg1avBAUAjlsdWH3QGqEWEREREekfkxSiENQ0OwSfrxV5noiIiIj8Y5JCFIKcXvGCz2eLPE9ERERE/rEmhSgEK8eZsb+u3WvIV565q3ieogcnRyAiIgovJilEIcg1m7D5mr5YfdCK2mYHshnARh1OjkBERBR+TFKIQpRrNmH9tD6RbgapRGpyBJ53IiIidUS0JmX37t1YuHAhCgsLkZ6ejg0bNvhsc+zYMSxZsgRDhgxBTk4OioqKcPTo0Qi0lohiESdHICIiCr+I9qTYbDaMHDkSixYtwvLly31eP3HiBK655hosXLgQ7777LtLT01FWVoaUlJQItJaIYhEnRyAiIgq/iCYps2bNwqxZswAAK1as8Hl99erV+O53v4snnnjC/dzQoUPD1TwiIk6OQEREFAGanYK4s7MT27dvx4gRIzB//nxcdNFFmDFjBjZt2hTpphFRDHFNjrAgPxlTsxOwID+ZRfNEREQq02zhfF1dHZqamvDMM8/gF7/4BR599FH8+9//xtKlS5GSkoJrrrkm0k0kohjByRGIiIjC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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -164,7 +163,7 @@
{
"data": {
"text/plain": [
"(69.06954183148986, 62.45380233453545)"
"(69.06919916201585, 62.49077357120634)"
]
},
"execution_count": 6,
@@ -189,7 +188,7 @@
"source": [
"# Segments\n",
"\n",
"The data I have so far helps me estimate the duration for a long ride over varying up-and-down terrain. But what if I just want to know how long it will take to climb the next hill? To answer that I'll go back to Strava and retrieve data from individual segments, some only a fraction of a mile long, some several miles long, but most with a relatively constant grade. I picked some representative segments, wrote down (in [`bikesegments.csv`](bikesegments.csv)) the segment length in miles and climb in feet, along with several of my times on the segment. (I picked my first, fifth, and tenth fastest times when available, or closest to that if I've done the segment less than 10 times.)"
"The data I have so far helps me estimate the duration for a long ride over varying up-and-down terrain. But what if I just want to know how long it will take to climb the next hill? To answer that I'll go back to Strava and retrieve data from individual segments, some only a fraction of a mile long, some several miles long, but most with a relatively constant grade. I picked some representative climbing segments ([`bikesegments.csv`](bikesegments.csv)) with the segment length in miles and climb in feet, along with several of my times on the segment. (I picked the first, midde, and last of the rides shown by Strava&mdash;the 10 fastest rides.)"
]
},
{
@@ -225,7 +224,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzYAAAJ9CAYAAADnp+daAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3XtY1GX+//HXgChoIyiyaB4Ik0x3bUtKO5mZrVYe65LK7LtZZmnrz05WmpTZYlhrfcv0i6bZurvapmVqVprlIXUzM2y1k+ElYhYCQkwjxxHm9wdKDszAAPNh5gPPx3X1B5/De27eTtfl2/u+37clPz/fKQAAAAAwsSB/DwAAAAAAGorCBgAAAIDpUdgAAAAAMD0KGwAAAACmR2EDAAAAwPQobAAAAACYHoUNAAAAANOjsAEAAABgehQ2PpSWlmZIXJvNRlyRX6Pjkl9j45JfY+OSX+Pikltj45JfY+OSX2PjBlp+KWwAAAAAmF4Lfw8gUPiqkjWiIi4qKvJ5TDPGlcivkXEl8mtkXIn8GhlXIr9GxiW3fHfNGlciv0bGlRo/v+Hh4R7vUdicVlOSvJWdne2TOO4Ql/waHZf8GhuX/Bobl/waF5fcGhuX/Bobl/waGzfQ8stSNAAAAACmR2EDAAAAwPQobAAAAACYHoUNAAAAANOjsAEAAABgehQ2AAAAAEyPwgYAAACA6VHYAAAAADA9ChsAAAAApkdhAwAAAMD0KGwAAAAAmB6FDQAAAADTo7ABAAAAYHoUNgAAAABMj8IGAAAAgOlR2AAAAAAwvRb+HkCgsNlsARXnbEVFRT6Paca4Evk1Mq5Efo2MK5FfI+NK5NfIuOSW765Z40rk18i4UuPnNzw83OM9CpvTakqSt7Kzs30Sxx3ikl+j45JfY+OSX2Pjkl/j4pJbY+OSX2Pjkl9j4wZafils/CzD7lBSql2ZhWXq1DpYiX2tirGG+HtYAAAAgKlQ2PhRht2h0ZtylW4vq7y2N6dUa4dGUtwAAAAAdUDzAD9KSrW7FDWSlG4vU1Kq3U8jAgAAAMyJwsaPMgvL3F4/7uE6AAAAAPcobPyoU+tgt9c7ergOAAAAwD0KGz9K7GtVrNW1iIm1VjQQAAAAAOA9mgf4UYw1RGuHRiop1a7jhWXqSFc0AAAAoF4obPwsxhqiJQPb+3sYAAAAgKmxFA0AAACA6VHYAAAAADA9ChsAAAAApkdhAwAAAMD0/FrYvPTSSxo0aJC6du2q888/X7fddpu+/fZbl2ecTqeSk5N14YUXqmPHjho2bJi+++67WmOvW7dO/fv31+9+9zv1799f7733nlG/BgAAAAA/82ths3PnTk2YMEGbNm3S+vXr1aJFC40ePVq//PJL5TOvvPKKFi5cqOeff15btmxRVFSUbr75Ztntdo9x9+zZo3vuuUcJCQnasWOHEhISNH78eO3du7cxfq0Gy7A7NHF7noZ/mKOJ2/N0tKDM30MCAAAAAppf2z2vWbPG5efFixerW7du2r17t2688UY5nU6lpKTooYce0qhRoyRJKSkpiouL09tvv627777bbdyUlBQNGDBA06ZNkyT17NlTO3bsUEpKil5//XVjf6kGyrA7NHpTrtLtvxUze7IsWn+jg/NtAAAAAA8Cao/NyZMnVV5eroiICElSRkaGsrKydN1111U+ExYWpiuvvFKff/65xzhffPGFyzuSNHjw4BrfCRRJqXaXokaSMgqcSkr1PEMFAAAANHcBVdhMnz5dffr0Ub9+/SRJWVlZkqSoqCiX56KiopSdne0xTlZWVp3fCRSZhe6XnR33cB0AAACAn5eine3JJ5/U7t27tXHjRgUHB7vcs1gsLj87nc5q16qq6ztpaWl1HLExcc4pC5FUfclZm7ICpaXlNyi2O0YVe0bF9dWfU1VmywP5NWdc8mtsXPJrXFxya2xc8mtsXPJrbNzGzm9cXJzHdwKisJkxY4bWrFmj9957T+edd17l9ejoaEkVv1iXLl0qr584caLajMzZoqOjqyWjtndqSpK30tLSGhzn+Y4OHayyxyamjUXPD+zs8z02NptN4eHhPo1pZFxf5Ncds+WB/JozLvk1Ni75NS4uuTU2Lvk1Ni75NTZuoOXX70vRnnjiCb399ttav369LrjgApd7MTExio6O1tatWyuvFRcX67PPPlP//v09xrzssstc3pGkrVu31vhOoIixhmjt0EgldA/TgI4tldA9TP+6OpTGAQAAAEAN/DpjM23aNL311lv617/+pYiIiMo9NW3atNE555wji8WiyZMn68UXX1RcXJx69OihefPmqU2bNhozZkxlnJEjRyo+Pl6zZs2SJE2aNEk33XSTXnrpJQ0fPlwbNmzQjh07tHHjRr/8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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -237,18 +236,18 @@
"source": [
"pct2 = [f * 100 / 5280 for f in fpm2]\n",
"\n",
"show(pct2, mph2, xlabel='Grade (percent)', degree=3) "
"show(pct2, mph2, xlabel='Segment Grade (percent)', degree=3) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So I can cruise at 17 mph on flat roads (sometimes only 12.5 mph and occassionally up to 21 mph); I'm down around 6 mph at 6% grade, and down around 5 mph on 8% grades.\n",
"So I can cruise at 17 mph on a 1% grade, but only a bit over 6 mph at 6% grade, and around 5 mph on 8% grades.\n",
"\n",
"# VAM\n",
"\n",
" [VAM](https://en.wikipedia.org/wiki/VAM_(bicycling)) stands for *velocità ascensionale media* in Italian, but since I don't have Campagnolo gear, I'll call it \"mean ascent velocity\": the speed in vertical feet climbed per hour (regardless of horizontal distance travelled). Legend has it that at grades between about 6% to 12%, most of your power is going into lifting against gravity, so your VAM should be about constant no matter what the grade in that range. (I guess that below that grade, power is spent on wind and rolling resistance, and above it, power goes largely to cursing *sotto voce*, as they say in Italian.) Here's a plot of my VAM at various grades:"
"The number of vertical feet climbed per hour (regardless of horizontal distance travelled) is known as [VAM](https://en.wikipedia.org/wiki/VAM_(bicycling)), which stands for *velocità ascensionale media* (when you have Campagnolo components) or *mean ascent velocity* (on SRAM) or 平均上昇率 (on Shimano). Legend has it that at grades between about 6% to 12%, most of your power is going into lifting against gravity, so your VAM should be about constant no matter what the grade in that range. (I guess that below that grade, power is spent on wind and rolling resistance, and above it, power goes largely to cursing *sotto voce*, as they say in Italian.) Here's a plot of my VAM at various grades:"
]
},
{
@@ -258,7 +257,7 @@
"outputs": [
{
"data": {
"image/png": "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bsWN21B+l/XwwoVi0z06kQoplvVoAaUFe3ScKQ9ixeX7V9y4jpZfFjpERERETiBcIcPeQf5ITFfjTpkOwey6RtQgFjpERERETiJcIcPGPi3sPQ0ip8BmBERERERE5HJY6BARERERkcthoUNERERERC6HhQ4REREREbkcFjpERERERORyWOgQEREREZHLYaFDREREREQuh4UOERERERG5HBY6RERERETkcljoEBERERGRy2GhQ0RERERELoeFDhERERERuRwWOkRERERE5HKa2XsCjkqlUjlUnNo0Go3VYzpjXID5FTMuwPyKGRdgfsWMCzC/YsZlbvnedda4APMrZlzA9vlVKpVmH2OhY0ZDSbNUfn6+VeIIYVzmV+y4zK+4cZlfceMyv+LFZW7Fjcv8ihuX+RU3rqPll0vXiIiIiIjI5bDQISIiIiIil8NCh4iIiIiIXA4LHSIiIiIicjksdIiIiIiIyOWw0CEiIiIiIpfDQoeIiIiIiFwOCx0iIiIiInI5LHSIiIiIiMjlsNAhIiIiIiKXw0KHiIiIiIhcDgsdIiIiIiJyOSx0iIiIiIjI5bDQISIiIiIil8NCh4iIiIiIXE4ze0/AUalUKoeKU5tGo7F6TGeMCzC/YsYFmF8x4wLMr5hxAeZXzLjMLd+7zhoXYH7FjAvYPr9KpdLsYyx0zGgoaZbKz8+3ShwhjMv8ih2X+RU3LvMrblzmV7y4zK24cZlfceMyv+LGdbT8cukaERERERG5HBY6RERERETkcljoEBERERGRy2GhQ0RERERELoeFDhERERERuRwWOkRERERE5HJY6BARERERkcthoUNERERERC6HhQ4REREREbkcFjpERERERORyWOgQEREREZHLYaFDREREREQuh4UOERERERG5HBY6RERERETkcljoEBERERGRy2lm7wk4KpVK5VBxatNoNFaP6YxxAeZXzLgA8ytmXID5FTMuwPyKGZe55XvXWeMCzK+YcQHb51epVJp9jIWOGQ0lzVL5+flWiSOEcZlfseMyv+LGZX7Fjcv8iheXuRU3bmPym63WIjFdjdwyHVp5SbEoToFwhczseGfKg1hx+f4VN66j5ZeFDhEREZGTyVZrMfJIEbLUOuO5cwWV2DvIv8Fih6gp4R4dIiIiIieTmK42KXIAIEutQ2K62k4zInI8LHSIiIiInExumU7w/B0z54maIhY6RERERE6mlZdU8HywmfNETRH36BARkU3V3kDtL9NjWQ8v7ikgaqRFcQqcK6g0Wb4WqahuSEBE1VjoEBGRzQhtoL5QXMQN1ESNFK6QYe8gfySmq3GnTIdgC7quETU1LHSIiMhmGtpAvbFPCzvNisg5hStk/LkhagD36BARkc1wAzUREdkKCx0iIrIZbqAmIiJbYaFDREQ2syhOgUiFaVHDDdRERCQG7tEhIiKbqbuBuoVMj2U9WnADNRERWZ3druhs3LgRPXv2RGhoKEJDQ/Hkk0/iyJEjxscNBgPeeecdPPTQQwgODsaQIUNw6dIlkxjFxcWYMmUKwsLCEBYWhilTpqC4uNhkzMWLFzF48GAEBwejY8eOWLlyJQwGg01eIxER1VezgXpffCA+6ObJIoeIiERht0InJCQES5cuxYkTJ5CcnIwnnngC48aNw08//QQAeP/997Fu3TqsXLkS3377LQIDAzFq1Cio1WpjjJdeegkXLlzAzp07sWvXLly4cAEvv/yy8fHffvsNo0aNQsuWLfHtt99ixYoV+Mc//oEPP/zQ5q+XiIiIiIhsx25L14YMGWJy/MYbb+DTTz9FWloaYmJisH79esyZMwcjRowAAKxfvx7R0dHYtWsXJk2ahCtXruDo0aM4fPgwevToAQBYs2YN4uPjkZmZiejoaOzcuRMajQbr16+HXC5Hp06dcPXqVXz00UeYOXMmJBKJzV83ERERERGJzyGaEeh0OvznP/9BaWkpunfvjuzsbOTl5aF///7GMXK5HD179kRKSgoAIDU1Fc2bNzcWOQDw6KOPwtvb22TMY489BrlcbhwzYMAA5ObmIjs720avjoiIiIiIbM2uzQguXryIp556CuXl5fD29saXX36JmJgYY6ESGBhoMj4wMBC5ubkAgPz8fPj7+5tclZFIJAgICEB+fr5xTEhISL0YNY9FRESYnVtmZuYDvz5rxqmr5jU29bjMr7hxmV9x4zK/4sZlfsWLy9yKG5f5FTcu8ytuXFvnNzo62uyfsWuhEx0djZMnT0KlUiEpKQnTpk3D/v37jY/XXVpmMBjqFTZ13WtMTSOCey1bayhplqpZQmdtKpUKSqWyycdlfsWNy/yKG5f5FTcu8yteXOZW3LjMr7hxmV9x4zpafu26dM3d3R1t27ZF165dsWTJEsTGxuKjjz5CUFAQgPqVW2FhofGKTMuWLVFYWGjSQc1gMKCoqMhkjFAMoP7VIiIiIiIich0OsUenhl6vR2VlJcLDwxEUFITk5GTjY+Xl5Thz5oxxT0737t1RUlKC1NRU45jU1FSUlpaajDlz5gzKy8uNY5KTk9GqVSuEh4fb6FUREREREZGt2a3QefPNN3H69GlLine truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -277,7 +276,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sure enough, the best fit cubic curve looks pretty flat between 6% and 12%, but there is a lot of variance. These numbers confirm that I'm an average club climber at about 2000 ft/hour; champion climbers can do 5,000 or even 6,000 feet per hour.\n",
"I don't really get that flat effect; my numbers are widely spread out. This does confirm that I'm an average club climber at about 2000 ft/hour; champion climbers can do 5,000 or even 6,000 feet per hour.\n",
"\n",
"# Eddington Number\n",
"\n",
@@ -292,51 +291,17 @@
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mi Days Gap\n",
"-- ---- ---\n",
"52 54 -2\n",
"53 52 1\n",
"54 49 5\n",
"55 47 8\n",
"56 46 10\n",
"57 43 14\n",
"58 40 18\n",
"59 35 24\n",
"60 34 26\n",
"61 28 33\n",
"62 26 36\n",
"63 24 39\n",
"64 22 42\n",
"65 21 44\n"
]
}
],
"outputs": [],
"source": [
"def eddington(distances, unit):\n",
" \"\"\"Print information on the number of rides and the Eddington gap.\"\"\"\n",
"def eddington(distances, unit='Mi', gaps=range(-1, 41)):\n",
" \"\"\"Print the number of days doing various distances, and the Eddington gap.\"\"\"\n",
" print(f'{unit} Days Gap')\n",
" print(f'-- ---- ---')\n",
" for E in range(1, 999):\n",
" for E in range(1, 200):\n",
" days = sum(d >= E for d in distances)\n",
" gap = E - days\n",
" if -2 <= gap <= 45:\n",
" print(f'{E:2} {days:2} {gap:2}')\n",
"\n",
"eddington(mls, 'Mi')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So my **Eddington Number is 52**: I've done 52 miles or more on more than 52 days, but for 53 miles, only 52 days. This happens to be right around [the mean for Strava users](https://swinny.net/Cycling/-4687-Calculate-your-Eddington-Number). To increase 10% to 57 I would need 14 more 57-mile days. (Eddington's Eddington number was **77**.)\n",
"\n",
"If 52 seems too small a number, we can calculate the metric Eddington number (in kilometers):"
" gap = E - days\n",
" if gap in gaps:\n",
" print(f'{E:2} {days:2} {gap:2}')"
]
},
{
@@ -348,36 +313,74 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Km Days Gap\n",
"Mi Days Gap\n",
"-- ---- ---\n",
"75 76 -1\n",
"76 75 1\n",
"77 74 3\n",
"78 72 6\n",
"79 71 8\n",
"80 70 10\n",
"81 67 14\n",
"82 59 23\n",
"83 58 25\n",
"84 53 31\n",
"85 52 33\n",
"86 51 35\n",
"87 49 38\n",
"88 48 40\n",
"89 47 42\n",
"90 46 44\n"
"53 54 -1\n",
"54 51 3\n",
"55 49 6\n",
"56 48 8\n",
"57 45 12\n",
"58 42 16\n",
"59 37 22\n",
"60 36 24\n",
"61 30 31\n",
"62 28 34\n",
"63 26 37\n",
"64 24 40\n"
]
}
],
"source": [
"eddington([m * 1.609344 for m in mls], 'Km')"
"eddington(mls, 'Mi')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"My **metric Eddington Number is 75**, and to increase 10% to 82 I would need 23 more 82 km (51 mile) days, but to increase 5 more to 80 I would need just 10 such days.\n",
"So my **Eddington Number is 53**: I've done 53 miles or more on 54 days, but 54 miles I've done on only 51 days. This happens to be right around [the mean for Strava users](https://swinny.net/Cycling/-4687-Calculate-your-Eddington-Number). To increase that number by 5 to 58, obviously I would need at least 5 rides, but it turns out I would actually need 16 (because 11 rides were between 53 and 57 miles). Eddington was about my age when he died with a number of **77**, and his available roads and bicycles were not nearly as nice as mine, so good for him.\n",
"\n",
"If 53 seems too small a number, we can use kilometers instead of miles:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Km Days Gap\n",
"-- ---- ---\n",
"76 77 -1\n",
"77 76 1\n",
"78 74 4\n",
"79 73 6\n",
"80 72 8\n",
"81 69 12\n",
"82 61 21\n",
"83 60 23\n",
"84 55 29\n",
"85 54 31\n",
"86 53 33\n",
"87 51 36\n",
"88 50 38\n",
"89 49 40\n"
]
}
],
"source": [
"kms = [m * 5280 * 12 * 2.54 / 100 / 1000 for m in mls]\n",
"eddington(kms, 'Km')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"My **metric Eddington Number is 76**, and to increase by 5 to 81 I would need 12 more rides.\n",
"\n",
"# H-Index\n",
"\n",
@@ -390,12 +393,12 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzYAAAJ9CAYAAADnp+daAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3XtY1GX+//HXgChoIyiyaB4Ik0x3bUtKO5mZrVYe65LK7LtZZmnrz05WmpTZYlhrfcv0i6bZurvapmVqVprlIXUzM2y1k+ElYhYCQkwjxxHm9wdKDszAAPNh5gPPx3X1B5/De27eTtfl2/u+37clPz/fKQAAAAAwsSB/DwAAAAAAGorCBgAAAIDpUdgAAAAAMD0KGwAAAACmR2EDAAAAwPQobAAAAACYHoUNAAAAANOjsAEAAABgehQ2PpSWlmZIXJvNRlyRX6Pjkl9j45JfY+OSX+Pikltj45JfY+OSX2PjBlp+KWwAAAAAmF4Lfw8gUPiqkjWiIi4qKvJ5TDPGlcivkXEl8mtkXIn8GhlXIr9GxiW3fHfNGlciv0bGlRo/v+Hh4R7vUdicVlOSvJWdne2TOO4Ql/waHZf8GhuX/Bobl/waF5fcGhuX/Bobl/waGzfQ8stSNAAAAACmR2EDAAAAwPQobAAAAACYHoUNAAAAANOjsAEAAABgehQ2AAAAAEyPwgYAAACA6VHYAAAAADA9ChsAAAAApkdhAwAAAMD0KGwAAAAAmB6FDQAAAADTo7ABAAAAYHoUNgAAAABMj8IGAAAAgOlR2AAAAAAwvRb+HkCgsNlsARXnbEVFRT6Paca4Evk1Mq5Efo2MK5FfI+NK5NfIuOSW765Z40rk18i4UuPnNzw83OM9CpvTakqSt7Kzs30Sxx3ikl+j45JfY+OSX2Pjkl/j4pJbY+OSX2Pjkl9j4wZafils/CzD7lBSql2ZhWXq1DpYiX2tirGG+HtYAAAAgKlQ2PhRht2h0ZtylW4vq7y2N6dUa4dGUtwAAAAAdUDzAD9KSrW7FDWSlG4vU1Kq3U8jAgAAAMyJwsaPMgvL3F4/7uE6AAAAAPcobPyoU+tgt9c7ergOAAAAwD0KGz9K7GtVrNW1iIm1VjQQAAAAAOA9mgf4UYw1RGuHRiop1a7jhWXqSFc0AAAAoF4obPwsxhqiJQPb+3sYAAAAgKmxFA0AAACA6VHYAAAAADA9ChsAAAAApkdhAwAAAMD0/FrYvPTSSxo0aJC6du2q888/X7fddpu+/fZbl2ecTqeSk5N14YUXqmPHjho2bJi+++67WmOvW7dO/fv31+9+9zv1799f7733nlG/BgAAAAA/82ths3PnTk2YMEGbNm3S+vXr1aJFC40ePVq//PJL5TOvvPKKFi5cqOeff15btmxRVFSUbr75Ztntdo9x9+zZo3vuuUcJCQnasWOHEhISNH78eO3du7cxfq0Gy7A7NHF7noZ/mKOJ2/N0tKDM30MCAAAAAppf2z2vWbPG5efFixerW7du2r17t2688UY5nU6lpKTooYce0qhRoyRJKSkpiouL09tvv627777bbdyUlBQNGDBA06ZNkyT17NlTO3bsUEpKil5//XVjf6kGyrA7NHpTrtLtvxUze7IsWn+jg/NtAAAAAA8Cao/NyZMnVV5eroiICElSRkaGsrKydN1111U+ExYWpiuvvFKff/65xzhffPGFyzuSNHjw4BrfCRRJqXaXokaSMgqcSkr1PEMFAAAANHcBVdhMnz5dffr0Ub9+/SRJWVlZkqSoqCiX56KiopSdne0xTlZWVp3fCRSZhe6XnR33cB0AAACAn5eine3JJ5/U7t27tXHjRgUHB7vcs1gsLj87nc5q16qq6ztpaWl1HLExcc4pC5FUfclZm7ICpaXlNyi2O0YVe0bF9dWfU1VmywP5NWdc8mtsXPJrXFxya2xc8mtsXPJrbNzGzm9cXJzHdwKisJkxY4bWrFmj9957T+edd17l9ejoaEkVv1iXLl0qr584caLajMzZoqOjqyWjtndqSpK30tLSGhzn+Y4OHayyxyamjUXPD+zs8z02NptN4eHhPo1pZFxf5Ncds+WB/JozLvk1Ni75NS4uuTU2Lvk1Ni75NTZuoOXX70vRnnjiCb399ttav369LrjgApd7MTExio6O1tatWyuvFRcX67PPPlP//v09xrzssstc3pGkrVu31vhOoIixhmjt0EgldA/TgI4tldA9TP+6OpTGAQAAAEAN/DpjM23aNL311lv617/+pYiIiMo9NW3atNE555wji8WiyZMn68UXX1RcXJx69OihefPmqU2bNhozZkxlnJEjRyo+Pl6zZs2SJE2aNEk33XSTXnrpJQ0fPlwbNmzQjh07tHHjRr/8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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
@@ -413,7 +416,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"My guess is confirmed: the leftmost red diamond indicates 6 mph at 6% grade, and we can see that my speed curve (dotted black line) is above that point (looks like about 6.3 mph at 6%), but I can't reach 7 mph at 7% (at least not *regularly,* according to the curve; the one outlier point at 7.5 mph at 7% doesn't count.). "
"My guess is confirmed: the leftmost red diamond indicates 6 mph at 6% grade, and we can see that my speed curve (dotted black line) is above that point (looks like about 6.2 mph at 6%), but I can't reach 7 mph at 7% (at least not *regularly,* according to the curve; the one outlier point at 7.5 mph at 7% doesn't count.). "
]
}
],
@@ -433,7 +436,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
"version": "3.7.2"
}
},
"nbformat": 4,
+24 -12
View File
@@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"<div align=\"right\"><i>Peter Norvig<br>2 June 2019</i></div>\n",
"<div align=\"right\"><i>Peter Norvig<br>3 July 2019</i></div>\n",
"\n",
"# Tracking Trump: Electoral Votes Edition\n",
"\n",
@@ -22,8 +22,7 @@
"\n",
"# TL;DR for policy wonks\n",
"\n",
"As of 2 July 2019, Trump would expect **167 electoral votes** under these assumptions (recall that you need **270** to win). If you ran states in order of his approval, the key turning-point state is Pennsylvania; he'd need to win that and every state in which he is more popular. He currently is **9% behind in Pennsylvania**. \n",
"He's been below 270 every month for the last two years, and that remains true even if you factor in an across-the-board 3% swing in his favor (which was the swing above polls that he experienced in 2016).\n",
"As of 2 July 2019, Trump would expect **167 electoral votes** under these assumptions (you need **270** to win). If you list states in order of his approval, the key turning-point state is Pennsylvania; he'd need to win that and every state in which he is more popular. He currently is **9% behind in Pennsylvania**. \n",
"\n",
"\n",
"# The details for data science nerds\n",
@@ -37,7 +36,7 @@
"\n",
"- **Movement**: What's the most a state's net approval could be expected to move, due to random fluctuations (that is, assuming there is no big event that changes people's minds)? I define the maximum expected **movement** of a state as 1/5 of the undecided voters (i.e. assume the undecided voters broke 60/40 one way or the other) plus 2 standard deviations in the net approval over the last 12 months. \n",
"\n",
"- **Swing state**: I define a swing state as one whose maximum expected movement is greater than the absolute value of the net approval. There are 16 such states now; if Trump won them all, he would still lose the elction. Some states that are traditionally considered swing states are out of reach for Trump under my model: he currently trails in Pennsylvania by 9%, in Wisconsin by %14, and in Michigan by %15. My model says these states can be expected to move by no more than 5%. Some traditionally solid Republican states are swing states in my model, such as Texas, which has Trump at +4%, but has 4% undecided voters.\n",
"- **Swing state**: I define a swing state as one whose maximum expected movement is greater than the absolute value of the net approval. There are 16 such states now; if Trump won them all, he would still lose the election. Some states that are traditionally considered swing states are out of reach for Trump under my model: he currently trails in Pennsylvania by 9%, in Wisconsin by %14, and in Michigan by %15. My model says these states can be expected to move by no more than 5%. Some traditionally solid Republican states are swing states in my model, such as Texas, which has Trump at +4%, but has 4% undecided voters.\n",
"\n",
"- **Margin**: Suppose a future event swings voters in one direction or another uniformly, across the board in all states. How much of a swing would be necessary to change the election outcome? We call that the **margin**. Today **Trump's margin is 7%:** if he got 7% more votes in all states he would be over 270 electoral votes. (This could come, for example, by convincing the 3% of undecided voters to break for him at a 2% to 1% ratio, and then convincing 3% of disapproving voters to switch to approving.)\n",
"\n",
@@ -58,7 +57,7 @@
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"100 116k 0 116k 0 0 15866 0 --:--:-- 0:00:07 --:--:-- 31316\n"
"100 116k 0 116k 0 0 286k 0 --:--:-- --:--:-- --:--:-- 286k\n"
]
}
],
@@ -130,7 +129,7 @@
" '1-Jun-18': -11, '1-Jul-18': -10, '1-Aug-18': -12, '1-Sep-18': -14,\n",
" '1-Oct-18': -11, '1-Nov-18': -11, '1-Dec-18': -10, '1-Jan-19': -12,\n",
" '1-Feb-19': -16, '1-Mar-19': -11, '1-Apr-19': -11, '1-May-19': -12,\n",
" '1-Jun-19': -12}"
" '1-Jun-19': -12, '1-Jul-19': -11}"
]
},
{
@@ -215,11 +214,22 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 6,
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"9"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# What across-the-board increase in percentage approval would he need to win?\n",
"# What across-the-board increase in approval would he need to win?\n",
"margin(states)"
]
},
@@ -261,7 +271,7 @@
"source": [
"We see that:\n",
"- Trump is currently leading in states with only **167** electoral votes; \n",
"- The margin is **9%** (if he got 9% more popular in every state, his expected total would be over 270).\n",
"- The margin is **9%** (if he got 9% more popular in key states, his expected total would be over 277.5).\n",
"- Swings from 0 to 10% produce electoral vote totals from 167 to 292."
]
},
@@ -271,7 +281,7 @@
"source": [
"# Electoral votes by month\n",
"\n",
"The following plot shows, for each month in office, the expected number of electoral votes (based on net approval) with error bars indicating a 3% swing in either direction (Why 3%? That was the [average error](https://fivethirtyeight.com/features/the-polls-are-all-right/) in national presidential polls in 2016: Clinton was predicted by polls to win the popular vote by 6% but actually only won by 3%.) Trump hasn't been above 270 since 4 months into his term, and even with the 3% swing, since 6 months in."
"The following plot shows, for each month in office, the expected number of electoral votes with error bars indicating a 3% swing in either direction (Why 3%? That was the [average error](https://fivethirtyeight.com/features/the-polls-are-all-right/) in national presidential polls in 2016: Clinton was predicted by polls to win the popular vote by 6% but actually only won by 3%.) Trump hasn't been above 270 since 4 months into his term, and even with the 3% swing, since 6 months in."
]
},
{
@@ -436,7 +446,9 @@
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
+5 -3
View File
@@ -204,7 +204,7 @@ Ride Sun, 12/6/2015 Canada Rd 2:15:05 34.67 mi 1,237 ft
Ride Wed, 9/13/2017 Healdburg / Jimtown 2:08:03 34.45 mi 912 ft
Ride Thu, 10/2/2014 10/02/2014 Mountain View, California 3:08:06 34.28 mi 2,864 ft
Ride Sat, 2/1/2014 OLH to Page Mill 3:07:43 34.26 mi 3,099 ft
Ride Sat, 10/21/2017 Pescadero 2:47:08 34.25 mi 2,556 ft
Ride Sat, 10/21/2017 Pescadero 5:20:08 67.05 mi 4,938 ft
Ride Sat, 7/30/2016 Morning Ride 2:50:15 34.19 mi 2,799 ft
Ride Mon, 7/10/2017 Morning Ride 2:38:59 34.18 mi 984 ft
Ride Thu, 7/31/2014 Work commute 2:36:53 34.15 mi 564 ft
@@ -227,7 +227,6 @@ Ride Sun, 5/12/2019 Peninsula Bike Trail to Bay Trail 2:29:05 33.00 mi 846 ft
Ride Sun, 8/20/2017 Lunch Ride 2:23:02 32.96 mi 1,407 ft
Ride Sun, 3/6/2016 Lunch Ride 2:57:54 32.86 mi 2,566 ft
Ride Sun, 3/5/2017 Lunch Ride 2:57:09 32.82 mi 1,713 ft
Ride Sat, 10/21/2017 Back from Pescadero 2:36:50 32.80 mi 2,382 ft
Ride Sat, 12/16/2017 Morning Ride 2:48:58 32.72 mi 2,320 ft
Ride Tue, 8/23/2016 Morning Ride 2:32:15 32.61 mi 354 ft
Ride Fri, 12/9/2016 Morning Ride 3:04:52 32.55 mi 2,365 ft
@@ -435,4 +434,7 @@ Ride Sun, 1/19/2014 01/19/2014 Palo Alto, CA 1:36:55 25.01 mi 1,201 ft
Ride Mon, 9/5/2016 Afternoon Ride 1:42:56 25.00 mi 902 ft
Ride Sat, 11/8/2014 Atherton - Woodside 1:40:51 25.00 mi 972 ft
Ride Sun, 12/10/2017 Exercise Bike 1:30:00 25.00 mi 0 ft
Ride Sun, 6/2/2019 The Sequoia 6:40:43 77.51 mi 6,467 ft
Ride Sun, 6/2/2019 The Sequoia 6:40:43 77.51 mi 6,467 ft
Ride Sat, 6/8/2019 Morning Ride 2:53:08 34.42 mi 1,824 ft
Ride Sat, 6/15/2019 Morning Ride 2:29:38 29.98 mi 1,785 ft
Ride Fri, 7/5/2019 Morning Ride 4:30:55 64.05 mi 1,965 ft
1 Ride Thu, 6/14/2012 Coyote Creek Century with Juliet 8:08:15 100.07 mi 1,513 ft
204 Ride Wed, 9/13/2017 Healdburg / Jimtown 2:08:03 34.45 mi 912 ft
205 Ride Thu, 10/2/2014 10/02/2014 Mountain View, California 3:08:06 34.28 mi 2,864 ft
206 Ride Sat, 2/1/2014 OLH to Page Mill 3:07:43 34.26 mi 3,099 ft
207 Ride Sat, 10/21/2017 Pescadero 2:47:08 5:20:08 34.25 mi 67.05 mi 2,556 ft 4,938 ft
208 Ride Sat, 7/30/2016 Morning Ride 2:50:15 34.19 mi 2,799 ft
209 Ride Mon, 7/10/2017 Morning Ride 2:38:59 34.18 mi 984 ft
210 Ride Thu, 7/31/2014 Work commute 2:36:53 34.15 mi 564 ft
227 Ride Sun, 8/20/2017 Lunch Ride 2:23:02 32.96 mi 1,407 ft
228 Ride Sun, 3/6/2016 Lunch Ride 2:57:54 32.86 mi 2,566 ft
229 Ride Sun, 3/5/2017 Lunch Ride 2:57:09 32.82 mi 1,713 ft
Ride Sat, 10/21/2017 Back from Pescadero 2:36:50 32.80 mi 2,382 ft
230 Ride Sat, 12/16/2017 Morning Ride 2:48:58 32.72 mi 2,320 ft
231 Ride Tue, 8/23/2016 Morning Ride 2:32:15 32.61 mi 354 ft
232 Ride Fri, 12/9/2016 Morning Ride 3:04:52 32.55 mi 2,365 ft
434 Ride Mon, 9/5/2016 Afternoon Ride 1:42:56 25.00 mi 902 ft
435 Ride Sat, 11/8/2014 Atherton - Woodside 1:40:51 25.00 mi 972 ft
436 Ride Sun, 12/10/2017 Exercise Bike 1:30:00 25.00 mi 0 ft
437 Ride Sun, 6/2/2019 The Sequoia 6:40:43 77.51 mi 6,467 ft
438 Ride Sat, 6/8/2019 Morning Ride 2:53:08 34.42 mi 1,824 ft
439 Ride Sat, 6/15/2019 Morning Ride 2:29:38 29.98 mi 1,785 ft
440 Ride Fri, 7/5/2019 Morning Ride 4:30:55 64.05 mi 1,965 ft