Add files via upload
This commit is contained in:
1 parent
bd61b676b2
commit
730af5fde5
2 files changed
+517
-182
No files matched your search
+469
-172
@@ -4,11 +4,13 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div align=\"right\"><i>Peter Norvig<br>Dec 2019</i></div>\n",
|
||||
"<div align=\"right\"><i>Peter Norvig<br>Feb 2020</i></div>\n",
|
||||
"\n",
|
||||
"# Predicting Presidential Electoral Votes from Approval Polls\n",
|
||||
"\n",
|
||||
"Various sites aggregate opinion polls on presidential job performance. The polls are broken out state-by-state, month-by-month at [Mourning Consult](https://morningconsult.com/tracking-trump/). Trump's national **net approval** (percent approving minus percent disapproving) is currently -7% on [RealClearPolitics](https://www.realclearpolitics.com/epolls/other/president_trump_job_approval-6179.html), -8% on [538](https://projects.fivethirtyeight.com/trump-approval-ratings/), and -9% on [Gallup](https://news.gallup.com/poll/203198/presidential-approval-ratings-donald-trump.aspx). There are four big caveats in jumping from these numbers to conclusions about the election:\n",
|
||||
"> **NOTE**: This notebook was useful in 2018-2019, before we knew who Trump's opponent would be. Now that we know that Biden is the Democratic nominee, there are many sites tracking head-to-head polls, and **this notebook is no longer useful.**\n",
|
||||
"\n",
|
||||
"Various sites aggregate opinion polls on presidential job performance. The polls are broken out state-by-state, month-by-month at [Mourning Consult](https://morningconsult.com/tracking-trump/) (and overall approval ratings are at [RealClearPolitics](https://www.realclearpolitics.com/epolls/other/president_trump_job_approval-6179.html), [538](https://projects.fivethirtyeight.com/trump-approval-ratings/), and [Gallup](https://news.gallup.com/poll/203198/presidential-approval-ratings-donald-trump.aspx). There are four big caveats in jumping from these approval numbers to conclusions about the coming election:\n",
|
||||
"\n",
|
||||
"1. Today is not election day 2020. \n",
|
||||
"\n",
|
||||
@@ -18,18 +20,8 @@
|
||||
"\n",
|
||||
"4. Popular votes are not electoral votes. \n",
|
||||
"\n",
|
||||
"I have nothing to offer on the first three points. But can we use state-by-state approval polls to \n",
|
||||
"predict electoral votes? ***Yes we can!***\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# TL;DR: In this model, Trump gets 104 to 235 Electoral Votes\n",
|
||||
"\n",
|
||||
"There is a lot of uncertainty, so I won't try to give an exact single number. Rather, I will say that, as of December 2019, under the assumption that Trump wins the electoral votes of states where he currently has positive net approval and loses the states where he has negative net approval:\n",
|
||||
"- His mean expected number of electoral votes is **149.5**.\n",
|
||||
"- He is tied (net approval zero) in Texas and North Carolina, so depending on how they go, the total would be **123 to 176**.\n",
|
||||
"- If you allow for a swing of up to 3.5% across the board, then the totals range anywere from **104 to 235**.\n",
|
||||
"- Recall that you need **270** to win.\n",
|
||||
"- To reach 270, he'd need to take all the states where he is ahead or tied, plus six states where he is behind by up to **5%**.\n"
|
||||
"I have nothing to offer on the first three points. But given these caveats, can we use state-by-state approval polls to \n",
|
||||
"predict electoral votes? ***Yes we can!*** I propose and implement a model where the president wins exactly the states in which he has a positive net approval rating.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -38,7 +30,11 @@
|
||||
"source": [
|
||||
"# Details for data science nerds\n",
|
||||
"\n",
|
||||
"View, verify, or modify **[my code](ElectoralVotesCode.ipynb)**."
|
||||
"View, verify, or modify **[my code](ElectoralVotesCode.ipynb)**.\n",
|
||||
"\n",
|
||||
"# The Bottom Line\n",
|
||||
"\n",
|
||||
"With the February 2020 approval polls, here is the number of electoral vote Trump would have expected according to the model:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -49,7 +45,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"149.5"
|
||||
"235"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
@@ -60,16 +56,16 @@
|
||||
"source": [
|
||||
"%run ElectoralVotesCode.ipynb\n",
|
||||
"\n",
|
||||
"EV(states) # Number of electoral vote Trump can expect according to this model"
|
||||
"EV(states) "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The `.5` indicates a tie in one or more states. \n",
|
||||
"235 is 35 votes short of winning.\n",
|
||||
"\n",
|
||||
"Imagine a swing in voter approval of just 0.5% in either direction, for every state across the board. That would break ties, and we'd get a range of electoral votes: fewer in one direction, more in the other. If we allowed larger swings in approval, we'd get an even larger range. Here's how it goes:"
|
||||
"Now, Imagine a swing in voter approval of just 0.5% in either direction, for every state across the board. That would break ties, and we'd get a range of electoral votes: fewer in one direction, more in the other. If we allowed larger swings in approval, we'd get an even larger range. Here's how it goes:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -82,16 +78,16 @@
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Swing EV Range\n",
|
||||
"±0.5% 123 to 176\n",
|
||||
"±1.5% 118 to 205\n",
|
||||
"±2.5% 118 to 224\n",
|
||||
"±3.5% 104 to 235\n",
|
||||
"±4.5% 104 to 253\n",
|
||||
"±5.5% 89 to 286\n",
|
||||
"±6.5% 79 to 290\n",
|
||||
"±7.5% 67 to 290\n",
|
||||
"±8.5% 60 to 290\n",
|
||||
"±9.5% 52 to 306\n"
|
||||
"±0.5% 235 to 235\n",
|
||||
"±1.5% 224 to 273\n",
|
||||
"±2.5% 208 to 273\n",
|
||||
"±3.5% 179 to 273\n",
|
||||
"±4.5% 173 to 273\n",
|
||||
"±5.5% 155 to 302\n",
|
||||
"±6.5% 147 to 306\n",
|
||||
"±7.5% 109 to 306\n",
|
||||
"±8.5% 99 to 306\n",
|
||||
"±9.5% 85 to 306\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -103,7 +99,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"That is, the `4.5%` row says that if Trump's approval slipped 4.5% in every state, he would suffer a blowout loss, getting only 104 electoral votes. If he gained 4.5% in every state, it would be a close loss with 253 electoral votes (to 285 for the opponent)."
|
||||
"That is, with a swing of 1.5% in his favor in every state (or just in a few key states), Trump could win with a slim 273-265 margin, or with a 1.5% swing against him, lose by a large 224 to 314 margin."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -112,7 +108,9 @@
|
||||
"source": [
|
||||
"# Details for policy wonks\n",
|
||||
"\n",
|
||||
"The following plot shows, for each month in office, the expected number of electoral votes, with error bars indicating a 3% approval swing in either direction (that is: the blue diamond is the total number of electoral votes for states where he has net positive approval; the top and bottom of the grey bars give the total if he were to gain or lose 3% in every state. 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 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. He's been below 200 for a year."
|
||||
"# Electoral votes by month\n",
|
||||
"\n",
|
||||
"The following plot shows, for each month in office, the expected number of electoral votes, with error bars indicating a 3% approval swing in either direction (that is: the blue diamond is the total number of electoral votes for states where he has net positive approval; the top and bottom of the grey bars give the total if he were to gain or lose 3% in every state. 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 to win the popular vote by 6% but actually only won by 3%.) "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -122,7 +120,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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WCyce+65PP/88wDMnj2bCy+8kO+++84sUl955RUuvfRS2rVrB8BPP/1Er169OPPMMwkPD6dbt26MHDnSi+zFX/m0scKLL77I2rVr2blzJyEhIUybNo2BAweybNkyADZt2kR4eDjdu3fn2LFj3H///bhcLnbv3k1oaCgbNmxg7ty55OTkYLFYzPOef/759OrVixUrVlQ5blpaWpPm9Ul+ALd/E4rN9VtMYQFuHh9o54xYVw1HioiIPwsLC6tU1CWu69isMWReneH1sX/961/ZunUr27Zto3v37lXuM2XKFJKSknj22WfNxw4dOsT555/Pp59+ahanALfeeitZWVm89tprVZ5r2bJlbNmypdIV2IiICDp06ACUF7kjR45kxowZ3HPPPXz22WdMnTqVHTt2MGTIEAAOHz7MzJkziY2N5eyzz2bChAlMmDCBgACf/yFavJCdne3RtdRQU5MTn12hTUtLY+nSpWzfvp2QkJAq97nkkkvM/ycnJzN06FAGDx7Mjh07mDFjRrXnNn7Dq05DOs7UZk+6nTv252Jzef6eYHNZuONIOOsnxTO2U2idztVWOuu0lLH9NW5fju2vcftybMXduse2Wq1m5ySji5K3V0y97cIU5uWxCxcuZOvWrbz55pskJSVVefzhw4f54osvWLx4scf2bt26AeX5d+nSxdyWl5dHYmJitbEEBQURGhrKgAEDoIa4r776atauXcuSJUtYv349gwYN8rgCO2LECA4fPsz27dv5+OOPufXWWxk0aBBbt26tc1Hrrx23/DXumkRHR5vPqbry2a8uBw8eJDc3l5SUFOLj44mPj+fDDz/kueeeIz4+Hru98n2nnTp1onPnzhw9ehSADh064HQ6PfrZQ/nN4if/htxc5u/No8RZ9UXvEqeb+XvzqtwmIiLiK3fddRcbN25k27Zt5pJZVXnxxRdJSkpi3LhxHo93796dxMREdu3aZT5ms9nYv39/o/zp/6qrriIrK4utW7eyefNm88NgFUVFRTFjxgwee+wx3njjDfbs2WPWC9L6+ewK7bRp0xg2bJjHY/Pnz6dXr17ccccdVV61zc3NJT09ncTERACGDh1KcHAwu3bt4rLLLgPgl19+ITU11Wf3zjw5Jo6ZO3OrLGrDAy08OSauiqNERER8484772T9+vWsW7eO2NhYMjMzsdvtnHLKKURGRpr7FRcXs2HDBv70pz9V+iuoxWJh3rx5LF++nB49ejBgwAAeffRRIiIiuPTSS2sc3+FwmPfg2u12QkPL/4pp/KwH6NKlCxMmTOD//u//KCsr4/LLL/c4xxNPPEHHjh3p27cvkZGRbNiwgejoaDp37tyg7434D58VtMa6shW1a9eOuLg4Bg4cSGFhIX/729+YMWMGiYmJHDt2jKVLl5KQkMD06dMBiImJ4ZprruHee+8lISGBuLg4/vKXv5CcnFzpt8fmMrZTKOsnxVcqasMDLfW63UBERKQ5PPfccwDmigGGu+66i4ULF5pfb968maKiIq666qoqz3PrrbdSUlLCwoULsVqtDB8+nM2bNxMVFVXj+GlpafTr16/S4zk5OQQF/VamXHPNNezcuZPLLrusUv0QFRXF3//+d77//nsCAgIYPHgwGzZsMD80Jq2fz1c5qE5gYCDffPMNr7/+OlarlcTERMaMGcMLL7zg8eJ48MEHCQwM5Prrr8dmszF27FjWrFlDYGCgz2I3itqLtmfitAQSYEHFrIiItEj5+ZXv8a3q3sirr76aq6++utrzWCwWFi5cyO23317n+yoXLlzoUTTXdE/mjBkzqowV4Nprr+Xaa69tsns6peVrUQXt22+/bf4/PDyczZs313pMWFgYy5YtM1dGaCnGdgrlkuKPeaPdKCwWC0Pig30dkoiIiEirpPUsmtBAx690d+bgdMO7P1VefkJEREREGk4FbRMbUPYzANt+LPFxJCIiIiKtkwraJjag7BcA3vvZTlGZmiqIiIiINDYVtE0sxl3CGQnBlDjdvPdL5bV1RURERKRh2mxBm5mZicPhoLS0lOzsbKC8w0lhYSEAGRkZOJ1O7HY7OTk5QPknQYuKigBIT0/H5XJhs9nMxg55eXkUFxcD8Ouvv5pjTSzv3sfGb/Ox2Wy4XC6zt3VRUZH5qc2cnBzsdjtOp5OMjPLWhYWFhVitVqC8FVxpaanHmn0FBQUUFBRUysngbU6GqnIqLi4mL6+8QURubm6lnIzzepuTkVdzzpPxdXU51WWeDPWZJyOniufwJqeKOdR1nhrjuWfwdp4M9ZknIyegQTkB9Z6nxnjuGbydJ8Dr9wig2V5PJ+dkHF/feTLibMg8AV7nZKjPPJWVleFyucz/G3PmcDg8trvdbo/tTqfT3O52uz2Odzgclba7XK4qtxs/A1wulzlmVdsrxuRwOMyYqtpeXcxVbTdUlVN1MdeWc2lpqXl8TTkZjzd2TjXNU2051TRPxvaKsdd3nirm7E1Oxj6NnVNDnnsOh6PK94iaWPLz86tuayUNtmLFCgAu/MPNDN2YSVSwhe+u6ERoYPVteStqK60iW8rY/hq3L8f217h9Obbibt1jW61WYmJLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x504 with 1 Axes>"
|
||||
]
|
||||
@@ -135,6 +133,35 @@
|
||||
"show_evs()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Margin and country-wide net approval by month\n",
|
||||
"\n",
|
||||
"The next plot gives the swing margin needed to reach 270 for each month, along with the country-wide net approval. Trump has been in negative territory on all metrics since his fourth month in office. He's been net -10% or worse country-wide every month since his third in office. We see that the state-by-state margin roughly correlates with the country-wide net approval, but not exactly."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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ti1xt562gyVurVbr0yVSveFu+9XV1cTExBAeHk54eDgxMTE89thjXHnllSxdupSoqCjr88XExHD06FH27t1Lr169APvv/7y8PEaPHm33XO60/ec//5ljx46xfft21OraK9yO7dhS2gHo37+/3TLHp0+fJiwsjDFjxhAZGWmNfcCAAZw8edIak9K2N5pybqDbrk98fLzdRUt3tJjitlOnTgCcO3eOrl27WrcXFxc7/ZbqL+NSo8kcej9rv73fYU8MxCzl8e/OYzTDn4a2I0xWjBFCCCEaNHToUK677joeeugh7rvvPrt9ZrOZyZMn89hjjwGg1+utV029qQPeeustXn/9df773/9aawxX7diybSc2NtZunzI0wRVZNc63Wkxx2717dzp16sSOHTsYOnQoUPtbxNdff82jjz4asLj+OuZ2Xj74ICZLTd3G6D9A1LUAPH34PEdKDbw0LhF1dEjd3yeEEKIFaGwMbLBdzVu5ciUjRoxg+/btdtsvvvhitmzZQlpaGpGRkS7bjoqKwmQyNdrG/v37WbZsGa+++qrdjWSu2nFXv379MJvNfPPNN1x22WVA7bCEH3/8kVtvvdXt5xGNC6lqqry8nMOHD3P48GHMZjNnz57l8OHD5ObmolKpyMzM5LnnnuPDDz/kxx9/ZMmSJcTGxnLTTTcFLGaVSkV6e/s/XUREDbB7vPWsnis/LuK4pgYhhBBC1K9nz57Mnz+fF1980W77bbfdhk6nY8GCBRw4cICcnBx27tzJvffea50StFu3bvz0009kZ2dTUlJCTY3z925hYSELFixg0aJFDB8+nMLCQgoLC63TkDm2c/r0aad2XOnVqxdTp07ld7/7HV999RVHjx5l8eLFtGvXjhkzZvjwJyRCqrg9dOgQ48aNY9y4cVRVVbF69WrGjRvHX//6VwDuvfdelixZwn333ceECRMoKCjgvffeo127dgGNu1t8N7vHf7j4PB3b2P/of9YZufLjIv5zpsqfoQkhhBAh5/777yciwv6Pz6mpqWzdupWwsDBuvPFGxo8fz/Lly4mKirIOT5g3bx59+vRhwoQJ9OrVi7179zo994kTJyguLuaFF16gb9++1n8TJkxw2c7IkSOd2qnPP//5T4YOHcott9zCxIkTqaqq4t1335WZEnwspIYljB07Fo2m/j+fqFQqHnjgAR544AE/RtU4x+I2RpXHjmkdmftFCd8W1/3WeL7Gwq3bS/nj4HbcP1jG4QohhBBr16512pacnMzZs2edtvfq1Yv169cDrodEdOjQgS1btjTY3tixYykoKGhwOIVtO66sWbPG5flqtdrpirPwvZC6chuqHIvbM7ozdIkN55Ork7m1d1un4x//7jyzvyhFZzD7K0QhhBBCiBZBils/cCxuc8/nAhAToeIfY9Q8OSKBcIeLtP85U82kj4v4WSvjcIUQQggh3CXFrR+kxdvPz3ZGd8b6f5VKxeL+cXxwVQeSHGZLOK41csXHRTz7/Xmm7Y9hV77e47Z35eu9PlcIIYQQItSE1JjbUOV05VaX67S4xJiUaHZel0zG9lIOl9ZdrdUZLDx6UAeEMeOzYlYMjWdQkntTjxwuqeGxgzr05jBmfV7MpkkdZLlfIYQQQrRoUtz6QYc2HWgT0YYqY+1MCOcN59HoNbSPsV/TOi0ugq3XJHPvV2W8c9J51gS9Gf58QOdVDFUmmPl5Me9IgSuEEEKIFkyGJfiBSqVyunqbo8txeWybCBUvjW3Pon6xLvc3RbUJZn1eIkMUhBBCCNFiSXFL7YTNRqMRg8FAUVERULv+dnl5OQAFBQWYTCb0er11EmeNRkNFRQUA+fn5mM1mqqurKSkpAaCsrIzKykqgdq1px+L2x19/pLq6GrPZTH5+PgAVFRVoNBpUKhX/zalollyrTBbuyirzKCeFY04AlZWVlJWVAVBSUuKUk/K8ULsUsl6vx2QyUVBQANQuzKHVagEoKirCYDBgNBopLCy0nq/T1V6t9kc/KTkpXOWk9FNDOSlc5aTT6RrMyfY5vMnJNgd3+8mdnBrqJyWfpvSTwpN+UnICmpQT4HE/+eK1p/C2nwCP+8m2r/z1fnLMSTnf035S4mxKPwFe56Tw5v1k274n/aTkZJu/p/0E2OVkNBqtq3QZDAag9nWktGM0GjGbzVgsFpf7a2pqrPuVRRDq268wmUzWNmtqarBYLJjNZuv5tjEp+5X/u4pZOd82ZseclO2+zsl2v6c51bffNifb2D3tJ9ucvclJOcbXOTXUT43lZDQaXX5GNESl0WjqX+xY+MyyL5bx2uHXrI8fG/cYdw+9u97jd+XrmfV5CVUm5+4JAy5KjKx3uV6N3swPpTW4mkhMBbwzKZFJXd2fMDo7O5v09HS3j/fVuYFsO1TjDmTboRp3INuWuFtP28ESt1arJSEhwaPzA7X8blOX7m2NbYdq3A3x5jUrY279xNVNZQ0ZlxrNpklJTgVum3AVmyYlNTputr7i2AJ8VWDwqLgVQgghhAgVMizBT9La1T8dWH2UArfN/ybBdbewdXWurb//UM6PZTJ/rhBCCOGJrKws1Gq13TAwEXykuPULine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x504 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"show_approval()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -165,19 +192,12 @@
|
||||
"- **+**: President's current approval in state.\n",
|
||||
"- **-**: President's current disapproval in state.\n",
|
||||
"- **?**: Undecideds in state.\n",
|
||||
"- **𝝈**: Standard deviation in net approval over the past 12 months in state.\n",
|
||||
"\n",
|
||||
"The table shows that:\n",
|
||||
"- If Trump wins the states he is leading or tied in, he gets **176** electoral votes (the **ΣEV** in the TEXAS row).\n",
|
||||
"- If he also wins all the swing states, he gets **235** electoral votes (**ΣEV** in the ARIZONA row). \n",
|
||||
"- To get to **270**, he would also need to win Ohio and Pennsylvania. \n",
|
||||
"- He is currently down by **5%** in Pennsylvania, so that's the margin.\n",
|
||||
"- Some traditional swing states currently seem out of reach for Trump: he's at **-15%** in Michigan and **-9%** in Wisconsin.\n"
|
||||
"- **𝝈**: Standard deviation in net approval over the past 12 months in state.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -185,57 +205,57 @@
|
||||
"text/markdown": [
|
||||
"|State|Net|Move|EV|ΣEV|+|−|?|𝝈|\n",
|
||||
"|-|-|-|-|-|-|-|-|-|\n",
|
||||
"|Wyoming|+28%|±11%|3|3|62%|34%|4%|±5.0%\n",
|
||||
"|Alabama|+22%|±6%|9|12|59%|37%|4%|±2.4%\n",
|
||||
"|West Virginia|+21%|±5%|5|17|59%|38%|3%|±2.1%\n",
|
||||
"|Idaho|+16%|±5%|4|21|56%|40%|4%|±2.2%\n",
|
||||
"|Tennessee|+15%|±5%|11|32|56%|41%|3%|±2.2%\n",
|
||||
"|Kentucky|+14%|±4%|8|40|55%|41%|4%|±1.5%\n",
|
||||
"|Mississippi|+14%|±7%|6|46|55%|41%|4%|±3.0%\n",
|
||||
"|Arkansas|+10%|±5%|6|52|53%|43%|4%|±1.9%\n",
|
||||
"|Louisiana|+9%|±7%|8|60|53%|44%|3%|±3.3%\n",
|
||||
"|Oklahoma|+8%|±6%|7|67|52%|44%|4%|±2.5%\n",
|
||||
"|Kansas|+7%|±5%|6|73|52%|45%|3%|±2.3%\n",
|
||||
"|**UTAH**|**+7%**|**±8%**|6|79|52%|45%|3%|±3.6%\n",
|
||||
"|**MISSOURI**|**+6%**|**±6%**|10|89|51%|45%|4%|±2.7%\n",
|
||||
"|**NORTH DAKOTA**|**+5%**|**±5%**|3|92|51%|46%|3%|±2.4%\n",
|
||||
"|South Carolina|+5%|±5%|9|101|51%|46%|3%|±2.1%\n",
|
||||
"|**SOUTH DAKOTA**|**+5%**|**±7%**|3|104|51%|46%|3%|±3.2%\n",
|
||||
"|Indiana|+3%|±3%|11|115|50%|47%|3%|±1.2%\n",
|
||||
"|**MONTANA**|**+3%**|**±7%**|3|118|50%|47%|3%|±3.0%\n",
|
||||
"|**NEBRASKA**|**+1%**|**±7%**|5|123|49%|48%|3%|±3.4%\n",
|
||||
"|**NORTH CAROLINA**|**+0%**|**±4%**|15|138|48%|48%|4%|±1.6%\n",
|
||||
"|**TEXAS**|**+0%**|**±4%**|38|176|48%|48%|4%|±1.7%\n",
|
||||
"|**FLORIDA**|**-1%**|**±3%**|29|205|48%|49%|3%|±1.4%\n",
|
||||
"|**ALASKA**|**-2%**|**±7%**|3|208|47%|49%|4%|±3.2%\n",
|
||||
"|**GEORGIA**|**-2%**|**±6%**|16|224|47%|49%|4%|±2.5%\n",
|
||||
"|**ARIZONA**|**-3%**|**±4%**|11|235|47%|50%|3%|±1.8%\n",
|
||||
"|Ohio|-4%|±2%|18|253|46%|50%|4%|±0.8%\n",
|
||||
"|Pennsylvania|-5%|±3%|20|273|46%|51%|3%|±1.4%\n",
|
||||
"|Virginia|-5%|±4%|13|286|46%|51%|3%|±1.8%\n",
|
||||
"|Maine|-6%|±5%|4|290|46%|52%|2%|±2.4%\n",
|
||||
"|Iowa|-9%|±4%|6|296|44%|53%|3%|±1.9%\n",
|
||||
"|Wisconsin|-9%|±5%|10|306|44%|53%|3%|±2.1%\n",
|
||||
"|New Mexico|-10%|±7%|5|311|43%|53%|4%|±3.2%\n",
|
||||
"|Minnesota|-11%|±5%|10|321|43%|54%|3%|±2.3%\n",
|
||||
"|Nevada|-12%|±5%|6|327|42%|54%|4%|±2.3%\n",
|
||||
"|Delaware|-15%|±8%|3|330|41%|56%|3%|±3.5%\n",
|
||||
"|Michigan|-15%|±5%|16|346|40%|55%|5%|±1.9%\n",
|
||||
"|New Jersey|-15%|±4%|14|360|41%|56%|3%|±1.5%\n",
|
||||
"|Colorado|-18%|±6%|9|369|39%|57%|4%|±2.5%\n",
|
||||
"|New Hampshire|-19%|±6%|4|373|39%|58%|3%|±2.7%\n",
|
||||
"|Oregon|-20%|±5%|7|380|38%|58%|4%|±2.2%\n",
|
||||
"|Connecticut|-21%|±3%|7|387|38%|59%|3%|±1.1%\n",
|
||||
"|Illinois|-22%|±4%|20|407|37%|59%|4%|±1.6%\n",
|
||||
"|Rhode Island|-23%|±4%|4|411|37%|60%|3%|±1.8%\n",
|
||||
"|Maryland|-24%|±5%|10|421|36%|60%|4%|±2.1%\n",
|
||||
"|New York|-25%|±3%|29|450|36%|61%|3%|±1.3%\n",
|
||||
"|Washington|-25%|±4%|12|462|36%|61%|3%|±1.6%\n",
|
||||
"|California|-28%|±3%|55|517|34%|62%|4%|±1.3%\n",
|
||||
"|Hawaii|-28%|±9%|4|521|34%|62%|4%|±4.2%\n",
|
||||
"|Massachusetts|-31%|±4%|11|532|33%|64%|3%|±1.8%\n",
|
||||
"|Vermont|-35%|±8%|3|535|31%|66%|3%|±3.6%\n",
|
||||
"|District of Columbia|-58%|±6%|3|538|19%|77%|4%|±2.6%"
|
||||
"|Alabama|+28%|±5%|9|9|62%|34%|4%|±2.3%\n",
|
||||
"|Wyoming|+27%|±10%|3|12|62%|35%|3%|±4.8%\n",
|
||||
"|West Virginia|+24%|±5%|5|17|61%|37%|2%|±2.1%\n",
|
||||
"|Louisiana|+21%|±8%|8|25|59%|38%|3%|±3.7%\n",
|
||||
"|Idaho|+19%|±6%|4|29|58%|39%|3%|±2.7%\n",
|
||||
"|Kentucky|+17%|±4%|8|37|57%|40%|3%|±1.5%\n",
|
||||
"|Tennessee|+17%|±4%|11|48|57%|40%|3%|±1.8%\n",
|
||||
"|Mississippi|+14%|±7%|6|54|55%|41%|4%|±3.1%\n",
|
||||
"|Oklahoma|+14%|±6%|7|61|56%|42%|2%|±2.8%\n",
|
||||
"|South Carolina|+13%|±6%|9|70|55%|42%|3%|±2.5%\n",
|
||||
"|Arkansas|+11%|±5%|6|76|54%|43%|3%|±2.4%\n",
|
||||
"|Utah|+11%|±9%|6|82|54%|43%|3%|±4.2%\n",
|
||||
"|South Dakota|+10%|±7%|3|85|54%|44%|2%|±3.4%\n",
|
||||
"|Indiana|+9%|±6%|11|96|53%|44%|3%|±2.8%\n",
|
||||
"|North Dakota|+9%|±6%|3|99|53%|44%|3%|±2.8%\n",
|
||||
"|Missouri|+8%|±6%|10|109|52%|44%|4%|±2.4%\n",
|
||||
"|Texas|+7%|±5%|38|147|52%|45%|3%|±2.0%\n",
|
||||
"|**MONTANA**|**+6%**|**±7%**|3|150|52%|46%|2%|±3.2%\n",
|
||||
"|**NEBRASKA**|**+6%**|**±8%**|5|155|52%|46%|2%|±3.6%\n",
|
||||
"|**ALASKA**|**+5%**|**±7%**|3|158|51%|46%|3%|±3.3%\n",
|
||||
"|**NORTH CAROLINA**|**+5%**|**±5%**|15|173|51%|46%|3%|±2.4%\n",
|
||||
"|**KANSAS**|**+4%**|**±5%**|6|179|51%|47%|2%|±2.2%\n",
|
||||
"|**FLORIDA**|**+3%**|**±4%**|29|208|50%|47%|3%|±1.7%\n",
|
||||
"|**GEORGIA**|**+2%**|**±6%**|16|224|49%|47%|4%|±2.4%\n",
|
||||
"|**ARIZONA**|**+1%**|**±6%**|11|235|49%|48%|3%|±2.6%\n",
|
||||
"|**OHIO**|**-1%**|**±4%**|18|253|48%|49%|3%|±1.6%\n",
|
||||
"|**PENNSYLVANIA**|**-1%**|**±6%**|20|273|48%|49%|3%|±2.7%\n",
|
||||
"|**IOWA**|**-5%**|**±6%**|6|279|46%|51%|3%|±2.5%\n",
|
||||
"|**MINNESOTA**|**-5%**|**±7%**|10|289|46%|51%|3%|±3.4%\n",
|
||||
"|Virginia|-5%|±3%|13|302|46%|51%|3%|±1.4%\n",
|
||||
"|**MAINE**|**-6%**|**±7%**|4|306|46%|52%|2%|±3.1%\n",
|
||||
"|Delaware|-10%|±8%|3|309|43%|53%|4%|±3.8%\n",
|
||||
"|Michigan|-10%|±4%|16|325|43%|53%|4%|±1.8%\n",
|
||||
"|Nevada|-11%|±6%|6|331|43%|54%|3%|±2.6%\n",
|
||||
"|New Mexico|-11%|±7%|5|336|43%|54%|3%|±3.0%\n",
|
||||
"|Wisconsin|-11%|±5%|10|346|43%|54%|3%|±2.2%\n",
|
||||
"|New Jersey|-12%|±5%|14|360|42%|54%|4%|±2.0%\n",
|
||||
"|Colorado|-13%|±6%|9|369|42%|55%|3%|±2.6%\n",
|
||||
"|Connecticut|-17%|±5%|7|376|40%|57%|3%|±2.2%\n",
|
||||
"|Illinois|-18%|±4%|20|396|39%|57%|4%|±1.8%\n",
|
||||
"|New Hampshire|-18%|±7%|4|400|40%|58%|2%|±3.2%\n",
|
||||
"|Rhode Island|-18%|±4%|4|404|39%|57%|4%|±1.8%\n",
|
||||
"|New York|-20%|±4%|29|433|38%|58%|4%|±1.7%\n",
|
||||
"|Hawaii|-21%|±10%|4|437|38%|59%|3%|±4.7%\n",
|
||||
"|Oregon|-21%|±6%|7|444|38%|59%|3%|±2.7%\n",
|
||||
"|Maryland|-25%|±5%|10|454|36%|61%|3%|±2.1%\n",
|
||||
"|Massachusetts|-26%|±5%|11|465|36%|62%|2%|±2.1%\n",
|
||||
"|Washington|-27%|±4%|12|477|35%|62%|3%|±1.7%\n",
|
||||
"|California|-28%|±3%|55|532|34%|62%|4%|±1.3%\n",
|
||||
"|Vermont|-39%|±8%|3|535|29%|68%|3%|±3.9%\n",
|
||||
"|District of Columbia|-57%|±6%|3|538|19%|76%|5%|±2.5%"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.Markdown object>"
|
||||
@@ -249,35 +269,6 @@
|
||||
"show_states()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Margin and country-wide net approval by month\n",
|
||||
"\n",
|
||||
"The next plot gives the swing margin needed to reach 270 for each month, along with the country-wide net approval. Trump has been in negative territory on all metrics since his fourth month in office. He's been net -10% or worse country-wide every month since his third in office. We see that the state-by-state margin roughly correlates with the country-wide net approval, but not exactly."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x504 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"show_approval()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -286,70 +277,72 @@
|
||||
"\n",
|
||||
"Fivethirtyeight is a combination sports/politics site, and it has a lot of statistics about sports players and how much better they are than the average replacement player. Given that, they [decided](https://fivethirtyeight.com/features/the-states-where-trump-is-more-and-less-popular-than-he-should-be/) to rate the president's approval versus each state's overall approval of the president's party (in recent elections), which is a way of rating the president's performance versus an average replacement candidate from the same party. I'll duplicate that work and keep it up to date. We define the PARP for a state as the president's net approval minus the average party-member's net approval in that state (known as the \"partisan lean\"). \n",
|
||||
"\n",
|
||||
"In the table below, states are ordered by PARP. In each row we have the state name followed by the partisan lean of the state (positive numbers lean towards the president's party), the electoral votes, and then a pair of statistics (PARP, and net approval (in parentheses)) for four time periods (today, followed by January of 2019, 2018, and 2017). Trump was more popular than an average Republican at his inauguration in January 2017, with positive PARP in 42 states. But by 2018 he had positive PARP in only 6 states, and today only 2, Hawaii and Rhode Island, where he is deeply unpopular, but not quite as unpopular as other Republicans."
|
||||
"In the table below, states are ordered by PARP. In each row we have the state name followed by the partisan lean of the state (positive numbers lean towards the president's party), the electoral votes, and then a pair of statistics (PARP, and net approval (in parentheses)) for four time periods (today, followed by January of 2019, 2018, and 2017). "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/markdown": [
|
||||
"|State|Lean|EV|PARP|(Net)|PARP'19|(Net)|PARP'18|(Net)|PARP'17|(Net)|\n",
|
||||
"|-|-|-|-|-|-|-|-|-|-|-|\n",
|
||||
"|Hawaii|-36|4|+8|(-28)|+7|(-29)|+0|(-36)|+23|(-13)|\n",
|
||||
"|Rhode Island|-26|4|+3|(-23)|+7|(-19)|+4|(-22)|+22|(-4)|\n",
|
||||
"|Delaware|-14|3|-1|(-15)|-1|(-15)|+0|(-14)|+22|(+8)|\n",
|
||||
"|Maine|-5|4|-1|(-6)|-6|(-11)|-11|(-16)|+13|(+8)|\n",
|
||||
"|Maryland|-23|10|-1|(-24)|-7|(-30)|+0|(-23)|+10|(-13)|\n",
|
||||
"|Hawaii|-36|4|+15|(-21)|+7|(-29)|+0|(-36)|+23|(-13)|\n",
|
||||
"|Rhode Island|-26|4|+8|(-18)|+7|(-19)|+4|(-22)|+22|(-4)|\n",
|
||||
"|Delaware|-14|3|+4|(-10)|-1|(-15)|+0|(-14)|+22|(+8)|\n",
|
||||
"|Louisiana|+17|8|+4|(+21)|-2|(+15)|+2|(+19)|+14|(+31)|\n",
|
||||
"|Massachusetts|-29|11|+3|(-26)|-2|(-31)|-3|(-32)|+25|(-4)|\n",
|
||||
"|New York|-22|29|+2|(-20)|-2|(-24)|+4|(-18)|+30|(+8)|\n",
|
||||
"|Alabama|+27|9|+1|(+28)|-7|(+20)|+3|(+30)|+9|(+36)|\n",
|
||||
"|New Jersey|-13|14|+1|(-12)|-6|(-19)|-3|(-16)|+15|(+2)|\n",
|
||||
"|**NORTH CAROLINA**|+5|15|+0|(+5)|-9|(-4)|-6|(-1)|+13|(+18)|\n",
|
||||
"|**MAINE**|-5|4|-1|(-6)|-6|(-11)|-11|(-16)|+13|(+8)|\n",
|
||||
"|Mississippi|+15|6|-1|(+14)|-2|(+13)|+2|(+17)|+19|(+34)|\n",
|
||||
"|Massachusetts|-29|11|-2|(-31)|-2|(-31)|-3|(-32)|+25|(-4)|\n",
|
||||
"|New Jersey|-13|14|-2|(-15)|-6|(-19)|-3|(-16)|+15|(+2)|\n",
|
||||
"|New Mexico|-7|5|-3|(-10)|-11|(-18)|-13|(-20)|+24|(+17)|\n",
|
||||
"|New York|-22|29|-3|(-25)|-2|(-24)|+4|(-18)|+30|(+8)|\n",
|
||||
"|**FLORIDA**|+5|29|-2|(+3)|-9|(-4)|+0|(+5)|+17|(+22)|\n",
|
||||
"|Maryland|-23|10|-2|(-25)|-7|(-30)|+0|(-23)|+10|(-13)|\n",
|
||||
"|**PENNSYLVANIA**|+1|20|-2|(-1)|-11|(-10)|-4|(-3)|+9|(+10)|\n",
|
||||
"|**MINNESOTA**|-2|10|-3|(-5)|-16|(-18)|-12|(-14)|+5|(+3)|\n",
|
||||
"|California|-24|55|-4|(-28)|-6|(-30)|+1|(-23)|+18|(-6)|\n",
|
||||
"|Alabama|+27|9|-5|(+22)|-7|(+20)|+3|(+30)|+9|(+36)|\n",
|
||||
"|**NORTH CAROLINA**|+5|15|-5|(+0)|-9|(-4)|-6|(-1)|+13|(+18)|\n",
|
||||
"|New Mexico|-7|5|-4|(-11)|-11|(-18)|-13|(-20)|+24|(+17)|\n",
|
||||
"|South Carolina|+17|9|-4|(+13)|-9|(+8)|-10|(+7)|+8|(+25)|\n",
|
||||
"|Illinois|-13|20|-5|(-18)|-10|(-23)|-8|(-21)|+22|(+9)|\n",
|
||||
"|Virginia|+0|13|-5|(-5)|-10|(-10)|-4|(-4)|+8|(+8)|\n",
|
||||
"|**FLORIDA**|+5|29|-6|(-1)|-9|(-4)|+0|(+5)|+17|(+22)|\n",
|
||||
"|Pennsylvania|+1|20|-6|(-5)|-11|(-10)|-4|(-3)|+9|(+10)|\n",
|
||||
"|Louisiana|+17|8|-8|(+9)|-2|(+15)|+2|(+19)|+14|(+31)|\n",
|
||||
"|Illinois|-13|20|-9|(-22)|-10|(-23)|-8|(-21)|+22|(+9)|\n",
|
||||
"|Kentucky|+23|8|-9|(+14)|-9|(+14)|-8|(+15)|+11|(+34)|\n",
|
||||
"|Minnesota|-2|10|-9|(-11)|-16|(-18)|-12|(-14)|+5|(+3)|\n",
|
||||
"|West Virginia|+30|5|-9|(+21)|-6|(+24)|-8|(+22)|+7|(+37)|\n",
|
||||
"|Connecticut|-11|7|-10|(-21)|-13|(-24)|-8|(-19)|+16|(+5)|\n",
|
||||
"|Wisconsin|+1|10|-10|(-9)|-17|(-16)|-13|(-12)|+5|(+6)|\n",
|
||||
"|Ohio|+7|18|-11|(-4)|-13|(-6)|-11|(-4)|+7|(+14)|\n",
|
||||
"|Oregon|-9|7|-11|(-20)|-13|(-22)|-11|(-20)|+11|(+2)|\n",
|
||||
"|Vermont|-24|3|-11|(-35)|-11|(-35)|-12|(-36)|+22|(-2)|\n",
|
||||
"|**ARIZONA**|+9|11|-12|(-3)|-17|(-8)|-12|(-3)|+11|(+20)|\n",
|
||||
"|South Carolina|+17|9|-12|(+5)|-9|(+8)|-10|(+7)|+8|(+25)|\n",
|
||||
"|**MISSOURI**|+19|10|-13|(+6)|-21|(-2)|-17|(+2)|+0|(+19)|\n",
|
||||
"|Nevada|+1|6|-13|(-12)|-14|(-13)|-2|(-1)|+9|(+10)|\n",
|
||||
"|Tennessee|+28|11|-13|(+15)|-16|(+12)|-11|(+17)|+5|(+33)|\n",
|
||||
"|Washington|-12|12|-13|(-25)|-14|(-26)|-11|(-23)|+13|(+1)|\n",
|
||||
"|Arkansas|+24|6|-14|(+10)|-14|(+10)|-11|(+13)|+6|(+30)|\n",
|
||||
"|**GEORGIA**|+12|16|-14|(-2)|-14|(-2)|-5|(+7)|+6|(+18)|\n",
|
||||
"|Michigan|-1|16|-14|(-15)|-14|(-15)|-9|(-10)|+9|(+8)|\n",
|
||||
"|District of Columbia|-43|3|-15|(-58)|-22|(-65)|-21|(-64)|+12|(-31)|\n",
|
||||
"|Indiana|+18|11|-15|(+3)|-14|(+4)|-17|(+1)|+4|(+22)|\n",
|
||||
"|Iowa|+6|6|-15|(-9)|-20|(-14)|-16|(-10)|+3|(+9)|\n",
|
||||
"|**MONTANA**|+18|3|-15|(+3)|-17|(+1)|-18|(+0)|+6|(+24)|\n",
|
||||
"|Kansas|+23|6|-16|(+7)|-22|(+1)|-18|(+5)|+1|(+24)|\n",
|
||||
"|**ALASKA**|+15|3|-17|(-2)|-14|(+1)|-14|(+1)|+9|(+24)|\n",
|
||||
"|Colorado|-1|9|-17|(-18)|-17|(-18)|-13|(-14)|+2|(+1)|\n",
|
||||
"|**TEXAS**|+17|38|-17|(+0)|-17|(+0)|-10|(+7)|+3|(+20)|\n",
|
||||
"|Idaho|+35|4|-19|(+16)|-20|(+15)|-24|(+11)|-6|(+29)|\n",
|
||||
"|Wyoming|+47|3|-19|(+28)|-17|(+30)|-22|(+25)|-7|(+40)|\n",
|
||||
"|New Hampshire|+2|4|-21|(-19)|-21|(-19)|-12|(-10)|-1|(+1)|\n",
|
||||
"|**NEBRASKA**|+24|5|-23|(+1)|-24|(+0)|-18|(+6)|-1|(+23)|\n",
|
||||
"|**UTAH**|+31|6|-24|(+7)|-37|(-6)|-34|(-3)|-4|(+27)|\n",
|
||||
"|Oklahoma|+34|7|-26|(+8)|-24|(+10)|-19|(+15)|+0|(+34)|\n",
|
||||
"|**SOUTH DAKOTA**|+31|3|-26|(+5)|-25|(+6)|-21|(+10)|-10|(+21)|\n",
|
||||
"|**NORTH DAKOTA**|+33|3|-28|(+5)|-29|(+4)|-22|(+11)|-10|(+23)|"
|
||||
"|Connecticut|-11|7|-6|(-17)|-13|(-24)|-8|(-19)|+16|(+5)|\n",
|
||||
"|Kentucky|+23|8|-6|(+17)|-9|(+14)|-8|(+15)|+11|(+34)|\n",
|
||||
"|West Virginia|+30|5|-6|(+24)|-6|(+24)|-8|(+22)|+7|(+37)|\n",
|
||||
"|**ARIZONA**|+9|11|-8|(+1)|-17|(-8)|-12|(-3)|+11|(+20)|\n",
|
||||
"|**OHIO**|+7|18|-8|(-1)|-13|(-6)|-11|(-4)|+7|(+14)|\n",
|
||||
"|Indiana|+18|11|-9|(+9)|-14|(+4)|-17|(+1)|+4|(+22)|\n",
|
||||
"|Michigan|-1|16|-9|(-10)|-14|(-15)|-9|(-10)|+9|(+8)|\n",
|
||||
"|**ALASKA**|+15|3|-10|(+5)|-14|(+1)|-14|(+1)|+9|(+24)|\n",
|
||||
"|**GEORGIA**|+12|16|-10|(+2)|-14|(-2)|-5|(+7)|+6|(+18)|\n",
|
||||
"|Texas|+17|38|-10|(+7)|-17|(+0)|-10|(+7)|+3|(+20)|\n",
|
||||
"|**IOWA**|+6|6|-11|(-5)|-20|(-14)|-16|(-10)|+3|(+9)|\n",
|
||||
"|Missouri|+19|10|-11|(+8)|-21|(-2)|-17|(+2)|+0|(+19)|\n",
|
||||
"|Tennessee|+28|11|-11|(+17)|-16|(+12)|-11|(+17)|+5|(+33)|\n",
|
||||
"|Colorado|-1|9|-12|(-13)|-17|(-18)|-13|(-14)|+2|(+1)|\n",
|
||||
"|**MONTANA**|+18|3|-12|(+6)|-17|(+1)|-18|(+0)|+6|(+24)|\n",
|
||||
"|Nevada|+1|6|-12|(-11)|-14|(-13)|-2|(-1)|+9|(+10)|\n",
|
||||
"|Oregon|-9|7|-12|(-21)|-13|(-22)|-11|(-20)|+11|(+2)|\n",
|
||||
"|Wisconsin|+1|10|-12|(-11)|-17|(-16)|-13|(-12)|+5|(+6)|\n",
|
||||
"|Arkansas|+24|6|-13|(+11)|-14|(+10)|-11|(+13)|+6|(+30)|\n",
|
||||
"|District of Columbia|-43|3|-14|(-57)|-22|(-65)|-21|(-64)|+12|(-31)|\n",
|
||||
"|Vermont|-24|3|-15|(-39)|-11|(-35)|-12|(-36)|+22|(-2)|\n",
|
||||
"|Washington|-12|12|-15|(-27)|-14|(-26)|-11|(-23)|+13|(+1)|\n",
|
||||
"|Idaho|+35|4|-16|(+19)|-20|(+15)|-24|(+11)|-6|(+29)|\n",
|
||||
"|**NEBRASKA**|+24|5|-18|(+6)|-24|(+0)|-18|(+6)|-1|(+23)|\n",
|
||||
"|**KANSAS**|+23|6|-19|(+4)|-22|(+1)|-18|(+5)|+1|(+24)|\n",
|
||||
"|New Hampshire|+2|4|-20|(-18)|-21|(-19)|-12|(-10)|-1|(+1)|\n",
|
||||
"|Oklahoma|+34|7|-20|(+14)|-24|(+10)|-19|(+15)|+0|(+34)|\n",
|
||||
"|Utah|+31|6|-20|(+11)|-37|(-6)|-34|(-3)|-4|(+27)|\n",
|
||||
"|Wyoming|+47|3|-20|(+27)|-17|(+30)|-22|(+25)|-7|(+40)|\n",
|
||||
"|South Dakota|+31|3|-21|(+10)|-25|(+6)|-21|(+10)|-10|(+21)|\n",
|
||||
"|North Dakota|+33|3|-24|(+9)|-29|(+4)|-22|(+11)|-10|(+23)|"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.Markdown object>"
|
||||
@@ -362,6 +355,310 @@
|
||||
"source": [
|
||||
"show_parp()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Electoral Vote Totals\n",
|
||||
"\n",
|
||||
"Sites that simulate elections show electoral vote histograms that are spiky: some electoral vote totals are very common,others uncommon. I wanted to know if every total was possible. It turns out the answer is yes:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" 0 []\n",
|
||||
" 1 [Maine-1]\n",
|
||||
" 2 [Maine-1 + Maine-2]\n",
|
||||
" 3 [Alaska]\n",
|
||||
" 4 [Hawaii]\n",
|
||||
" 5 [Nebraska]\n",
|
||||
" 6 [Arkansas]\n",
|
||||
" 7 [Connecticut]\n",
|
||||
" 8 [Kentucky]\n",
|
||||
" 9 [Alabama]\n",
|
||||
" 10 [Maryland]\n",
|
||||
" 11 [Arizona]\n",
|
||||
" 12 [Washington]\n",
|
||||
" 13 [Virginia]\n",
|
||||
" 14 [New Jersey]\n",
|
||||
" 15 [North Carolina]\n",
|
||||
" 16 [Georgia]\n",
|
||||
" 17 [Kentucky + Alabama]\n",
|
||||
" 18 [Ohio]\n",
|
||||
" 19 [Alabama + Maryland]\n",
|
||||
" 20 [Illinois]\n",
|
||||
" 21 [Maryland + Arizona]\n",
|
||||
" 22 [Arizona + Indiana]\n",
|
||||
" 23 [Arizona + Washington]\n",
|
||||
" 24 [Arizona + Virginia]\n",
|
||||
" 25 [Washington + Virginia]\n",
|
||||
" 26 [Washington + New Jersey]\n",
|
||||
" 27 [Virginia + New Jersey]\n",
|
||||
" 28 [Virginia + North Carolina]\n",
|
||||
" 29 [Florida]\n",
|
||||
" 30 [New Jersey + Georgia]\n",
|
||||
" 31 [North Carolina + Georgia]\n",
|
||||
" 32 [Georgia + Michigan]\n",
|
||||
" 33 [North Carolina + Ohio]\n",
|
||||
" 34 [Georgia + Ohio]\n",
|
||||
" 35 [North Carolina + Illinois]\n",
|
||||
" 36 [Georgia + Illinois]\n",
|
||||
" 37 [Kentucky + Florida]\n",
|
||||
" 38 [Texas]\n",
|
||||
" 39 [Maryland + Florida]\n",
|
||||
" 40 [Illinois + Pennsylvania]\n",
|
||||
" 41 [Washington + Florida]\n",
|
||||
" 42 [Virginia + Florida]\n",
|
||||
" 43 [New Jersey + Florida]\n",
|
||||
" 44 [North Carolina + Florida]\n",
|
||||
" 45 [Georgia + Florida]\n",
|
||||
" 46 [Kentucky + Texas]\n",
|
||||
" 47 [Ohio + Florida]\n",
|
||||
" 48 [Maryland + Texas]\n",
|
||||
" 49 [Illinois + Florida]\n",
|
||||
" 50 [Washington + Texas]\n",
|
||||
" 51 [Virginia + Texas]\n",
|
||||
" 52 [New Jersey + Texas]\n",
|
||||
" 53 [North Carolina + Texas]\n",
|
||||
" 54 [Georgia + Texas]\n",
|
||||
" 55 [California]\n",
|
||||
" 56 [Ohio + Texas]\n",
|
||||
" 57 [Virginia + North Carolina + Florida]\n",
|
||||
" 58 [Florida + New York]\n",
|
||||
" 59 [Hawaii + California]\n",
|
||||
" 60 [Nebraska + California]\n",
|
||||
" 61 [Arkansas + California]\n",
|
||||
" 62 [Connecticut + California]\n",
|
||||
" 63 [Kentucky + California]\n",
|
||||
" 64 [Alabama + California]\n",
|
||||
" 65 [Maryland + California]\n",
|
||||
" 66 [Arizona + California]\n",
|
||||
" 67 [Florida + Texas]\n",
|
||||
" 68 [Virginia + California]\n",
|
||||
" 69 [New Jersey + California]\n",
|
||||
" 70 [North Carolina + California]\n",
|
||||
" 71 [Georgia + California]\n",
|
||||
" 72 [New Jersey + Florida + New York]\n",
|
||||
" 73 [Ohio + California]\n",
|
||||
" 74 [Georgia + Florida + New York]\n",
|
||||
" 75 [Illinois + California]\n",
|
||||
" 76 [Ohio + Florida + New York]\n",
|
||||
" 77 [Maryland + Florida + Texas]\n",
|
||||
" 78 [Illinois + Florida + New York]\n",
|
||||
" 79 [Washington + Florida + Texas]\n",
|
||||
" 80 [Virginia + Florida + Texas]\n",
|
||||
" 81 [New Jersey + Florida + Texas]\n",
|
||||
" 82 [North Carolina + Florida + Texas]\n",
|
||||
" 83 [Georgia + Florida + Texas]\n",
|
||||
" 84 [Florida + California]\n",
|
||||
" 85 [Ohio + Florida + Texas]\n",
|
||||
" 86 [North Carolina + Georgia + California]\n",
|
||||
" 87 [Illinois + Florida + Texas]\n",
|
||||
" 88 [North Carolina + Ohio + California]\n",
|
||||
" 89 [Georgia + Ohio + California]\n",
|
||||
" 90 [North Carolina + Illinois + California]\n",
|
||||
" 91 [Georgia + Illinois + California]\n",
|
||||
" 92 [Kentucky + Florida + California]\n",
|
||||
" 93 [Texas + California]\n",
|
||||
" 94 [Maryland + Florida + California]\n",
|
||||
" 95 [Illinois + Pennsylvania + California]\n",
|
||||
" 96 [Florida + New York + Texas]\n",
|
||||
" 97 [Virginia + Florida + California]\n",
|
||||
" 98 [New Jersey + Florida + California]\n",
|
||||
" 99 [North Carolina + Florida + California]\n",
|
||||
"100 [Georgia + Florida + California]\n",
|
||||
"101 [Kentucky + Texas + California]\n",
|
||||
"102 [Ohio + Florida + California]\n",
|
||||
"103 [Maryland + Texas + California]\n",
|
||||
"104 [Illinois + Florida + California]\n",
|
||||
"105 [Washington + Texas + California]\n",
|
||||
"106 [Virginia + Texas + California]\n",
|
||||
"107 [New Jersey + Texas + California]\n",
|
||||
"108 [North Carolina + Texas + California]\n",
|
||||
"109 [Georgia + Texas + California]\n",
|
||||
"110 [New Jersey + Florida + New York + Texas]\n",
|
||||
"111 [Ohio + Texas + California]\n",
|
||||
"112 [Georgia + Florida + New York + Texas]\n",
|
||||
"113 [Florida + New York + California]\n",
|
||||
"114 [Ohio + Florida + New York + Texas]\n",
|
||||
"115 [North Carolina + Georgia + Florida + California]\n",
|
||||
"116 [Illinois + Florida + New York + Texas]\n",
|
||||
"117 [North Carolina + Ohio + Florida + California]\n",
|
||||
"118 [Georgia + Ohio + Florida + California]\n",
|
||||
"119 [North Carolina + Illinois + Florida + California]\n",
|
||||
"120 [Georgia + Illinois + Florida + California]\n",
|
||||
"121 [Kentucky + Florida + New York + California]\n",
|
||||
"122 [Florida + Texas + California]\n",
|
||||
"123 [Maryland + Florida + New York + California]\n",
|
||||
"124 [Illinois + Pennsylvania + Florida + California]\n",
|
||||
"125 [Washington + Florida + New York + California]\n",
|
||||
"126 [Virginia + Florida + New York + California]\n",
|
||||
"127 [New Jersey + Florida + New York + California]\n",
|
||||
"128 [North Carolina + Florida + New York + California]\n",
|
||||
"129 [Georgia + Florida + New York + California]\n",
|
||||
"130 [Kentucky + Florida + Texas + California]\n",
|
||||
"131 [Ohio + Florida + New York + California]\n",
|
||||
"132 [Maryland + Florida + Texas + California]\n",
|
||||
"133 [Illinois + Florida + New York + California]\n",
|
||||
"134 [Washington + Florida + Texas + California]\n",
|
||||
"135 [Virginia + Florida + Texas + California]\n",
|
||||
"136 [New Jersey + Florida + Texas + California]\n",
|
||||
"137 [North Carolina + Florida + Texas + California]\n",
|
||||
"138 [Georgia + Florida + Texas + California]\n",
|
||||
"139 [North Carolina + Illinois + Pennsylvania + Florida + California]\n",
|
||||
"140 [Ohio + Florida + Texas + California]\n",
|
||||
"141 [Virginia + North Carolina + Florida + New York + California]\n",
|
||||
"142 [Illinois + Florida + Texas + California]\n",
|
||||
"143 [New Jersey + Georgia + Florida + New York + California]\n",
|
||||
"144 [North Carolina + Georgia + Florida + New York + California]\n",
|
||||
"145 [Georgia + Michigan + Florida + New York + California]\n",
|
||||
"146 [North Carolina + Ohio + Florida + New York + California]\n",
|
||||
"147 [Georgia + Ohio + Florida + New York + California]\n",
|
||||
"148 [North Carolina + Illinois + Florida + New York + California]\n",
|
||||
"149 [Georgia + Illinois + Florida + New York + California]\n",
|
||||
"150 [Virginia + North Carolina + Florida + Texas + California]\n",
|
||||
"151 [Florida + New York + Texas + California]\n",
|
||||
"152 [New Jersey + Georgia + Florida + Texas + California]\n",
|
||||
"153 [Illinois + Pennsylvania + Florida + New York + California]\n",
|
||||
"154 [Georgia + Michigan + Florida + Texas + California]\n",
|
||||
"155 [North Carolina + Ohio + Florida + Texas + California]\n",
|
||||
"156 [Georgia + Ohio + Florida + Texas + California]\n",
|
||||
"157 [North Carolina + Illinois + Florida + Texas + California]\n",
|
||||
"158 [Georgia + Illinois + Florida + Texas + California]\n",
|
||||
"159 [Kentucky + Florida + New York + Texas + California]\n",
|
||||
"160 [Ohio + Illinois + Florida + Texas + California]\n",
|
||||
"161 [Maryland + Florida + New York + Texas + California]\n",
|
||||
"162 [Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"163 [Washington + Florida + New York + Texas + California]\n",
|
||||
"164 [Virginia + Florida + New York + Texas + California]\n",
|
||||
"165 [New Jersey + Florida + New York + Texas + California]\n",
|
||||
"166 [North Carolina + Florida + New York + Texas + California]\n",
|
||||
"167 [Georgia + Florida + New York + Texas + California]\n",
|
||||
"168 [North Carolina + Illinois + Pennsylvania + Florida + New York + California]\n",
|
||||
"169 [Ohio + Florida + New York + Texas + California]\n",
|
||||
"170 [New Jersey + Georgia + Ohio + Florida + Texas + California]\n",
|
||||
"171 [Illinois + Florida + New York + Texas + California]\n",
|
||||
"172 [Georgia + Michigan + Ohio + Florida + Texas + California]\n",
|
||||
"173 [North Carolina + Georgia + Illinois + Florida + Texas + California]\n",
|
||||
"174 [Georgia + Michigan + Illinois + Florida + Texas + California]\n",
|
||||
"175 [North Carolina + Ohio + Illinois + Florida + Texas + California]\n",
|
||||
"176 [Georgia + Ohio + Illinois + Florida + Texas + California]\n",
|
||||
"177 [North Carolina + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"178 [Georgia + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"179 [Virginia + North Carolina + Florida + New York + Texas + California]\n",
|
||||
"180 [Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"181 [New Jersey + Georgia + Florida + New York + Texas + California]\n",
|
||||
"182 [North Carolina + Georgia + Florida + New York + Texas + California]\n",
|
||||
"183 [Georgia + Michigan + Florida + New York + Texas + California]\n",
|
||||
"184 [North Carolina + Ohio + Florida + New York + Texas + California]\n",
|
||||
"185 [Georgia + Ohio + Florida + New York + Texas + California]\n",
|
||||
"186 [North Carolina + Illinois + Florida + New York + Texas + California]\n",
|
||||
"187 [Georgia + Illinois + Florida + New York + Texas + California]\n",
|
||||
"188 [New Jersey + Georgia + Michigan + Illinois + Florida + Texas + California]\n",
|
||||
"189 [Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"190 [New Jersey + Georgia + Ohio + Illinois + Florida + Texas + California]\n",
|
||||
"191 [Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"192 [Georgia + Michigan + Ohio + Illinois + Florida + Texas + California]\n",
|
||||
"193 [North Carolina + Georgia + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"194 [Georgia + Michigan + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"195 [North Carolina + Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"196 [Georgia + Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"197 [New Jersey + Georgia + Michigan + Florida + New York + Texas + California]\n",
|
||||
"198 [North Carolina + Georgia + Michigan + Florida + New York + Texas + California]\n",
|
||||
"199 [New Jersey + Georgia + Ohio + Florida + New York + Texas + California]\n",
|
||||
"200 [North Carolina + Georgia + Ohio + Florida + New York + Texas + California]\n",
|
||||
"201 [Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"202 [North Carolina + Georgia + Illinois + Florida + New York + Texas + California]\n",
|
||||
"203 [Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"204 [North Carolina + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"205 [Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"206 [North Carolina + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"207 [Georgia + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"208 [New Jersey + Georgia + Michigan + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"209 [Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"210 [New Jersey + Georgia + Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"211 [North Carolina + Georgia + Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"212 [Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"213 [Virginia + North Carolina + Georgia + Ohio + Florida + New York + Texas + California]\n",
|
||||
"214 [New Jersey + North Carolina + Georgia + Ohio + Florida + New York + Texas + California]\n",
|
||||
"215 [New Jersey + Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"216 [North Carolina + Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"217 [New Jersey + Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"218 [North Carolina + Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"219 [New Jersey + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"220 [North Carolina + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"221 [Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"222 [North Carolina + Georgia + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"223 [Georgia + Michigan + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"224 [North Carolina + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"225 [Georgia + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"226 [New Jersey + Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"227 [North Carolina + Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + Texas + California]\n",
|
||||
"228 [Virginia + New Jersey + Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"229 [Virginia + North Carolina + Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"230 [New Jersey + North Carolina + Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"231 [Virginia + North Carolina + Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"232 [New Jersey + North Carolina + Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"233 [Virginia + North Carolina + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"234 [New Jersey + North Carolina + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"235 [New Jersey + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"236 [North Carolina + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"237 [New Jersey + Georgia + Michigan + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"238 [North Carolina + Georgia + Michigan + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"239 [New Jersey + Georgia + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"240 [North Carolina + Georgia + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"241 [Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"242 [Washington + New Jersey + North Carolina + Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"243 [Virginia + New Jersey + North Carolina + Georgia + Michigan + Ohio + Florida + New York + Texas + California]\n",
|
||||
"244 [Washington + New Jersey + North Carolina + Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"245 [Virginia + New Jersey + North Carolina + Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"246 [Washington + New Jersey + North Carolina + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"247 [Virginia + New Jersey + North Carolina + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"248 [Virginia + New Jersey + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"249 [Virginia + North Carolina + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"250 [New Jersey + North Carolina + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"251 [Virginia + North Carolina + Georgia + Michigan + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"252 [New Jersey + North Carolina + Georgia + Michigan + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"253 [Virginia + North Carolina + Georgia + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"254 [New Jersey + North Carolina + Georgia + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"255 [New Jersey + Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"256 [North Carolina + Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"257 [Washington + Virginia + New Jersey + North Carolina + Georgia + Michigan + Illinois + Florida + New York + Texas + California]\n",
|
||||
"258 [Arizona + Virginia + New Jersey + North Carolina + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"259 [Washington + Virginia + New Jersey + North Carolina + Georgia + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"260 [Washington + Virginia + New Jersey + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"261 [Washington + Virginia + North Carolina + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"262 [Washington + New Jersey + North Carolina + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"263 [Virginia + New Jersey + North Carolina + Georgia + Michigan + Ohio + Illinois + Florida + New York + Texas + California]\n",
|
||||
"264 [Washington + New Jersey + North Carolina + Georgia + Michigan + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"265 [Virginia + New Jersey + North Carolina + Georgia + Michigan + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"266 [Washington + New Jersey + North Carolina + Georgia + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"267 [Virginia + New Jersey + North Carolina + Georgia + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"268 [Virginia + New Jersey + Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n",
|
||||
"269 [Virginia + North Carolina + Georgia + Michigan + Ohio + Illinois + Pennsylvania + Florida + New York + Texas + California]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"show_totals()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"For total number of votes *v* where 270 ≤ *v* ≤ 538, the answer is \"all the states except the ones listed for (538 - *v*)\"."
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
@@ -380,7 +677,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.2"
|
||||
"version": "3.7.6"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div align=\"right\"><i>Peter Norvig<br>12 August 2019</i></div>\n",
|
||||
"<div align=\"right\"><i>Peter Norvig<br>12 August 2019<br>Update Oct 2020</i></div>\n",
|
||||
"\n",
|
||||
"# Data and Code for [Tracking Trump: Electoral Votes Edition](Electoral%20Votes.ipynb)\n",
|
||||
"\n",
|
||||
@@ -12,7 +12,7 @@
|
||||
" gives state-by-state, month-by-month presidential approval poll data. Within the web page there is some Javascript from which\n",
|
||||
" we can extract the data we need. It looks like this:\n",
|
||||
"\n",
|
||||
" var mc_state_trend = [[\"Demographic\",\"Jan-17\",\"\",\"Feb-17\",\"\", ...]\n",
|
||||
" var mc_state_trend = [[\"Demographic\",\"January '17\",\"\",\"February '17\",\"\", ...]\n",
|
||||
" [\"Alabama\",\"62\",\"26\",\"65\",\"29\", ...], \n",
|
||||
" ... ]\n",
|
||||
" \n",
|
||||
@@ -28,7 +28,7 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"! curl -s -o evs.html https://morningconsult.com/tracking-trump-2/"
|
||||
"! [ -e evs.html ] || curl -s -o evs.html https://morningconsult.com/tracking-trump-2/"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -94,8 +94,8 @@
|
||||
"net_usa = {\n",
|
||||
" 'Jan-17': 10, 'Jan-18': -18, 'Jan-19': -12, 'Jan-20': -11,\n",
|
||||
" 'Feb-17': 0, 'Feb-18': -15, 'Feb-19': -16, 'Feb-20': -10,\n",
|
||||
" 'Mar-17': -6, 'Mar-18': -14, 'Mar-19': -11, \n",
|
||||
" 'Apr-17': -13, 'Apr-18': -13, 'Apr-19': -11, \n",
|
||||
" 'Mar-17': -6, 'Mar-18': -14, 'Mar-19': -11, \n",
|
||||
" 'Apr-17': -13, 'Apr-18': -13, 'Apr-19': -11, \n",
|
||||
" 'May-17': -11, 'May-18': -12, 'May-19': -12, \n",
|
||||
" 'Jun-17': -16, 'Jun-18': -11, 'Jun-19': -12, \n",
|
||||
" 'Jul-17': -15, 'Jul-18': -10, 'Jul-19': -11, \n",
|
||||
@@ -128,13 +128,17 @@
|
||||
" \"Read data from the file and return tuple: (list of `State`s, list of dates).\"\n",
|
||||
" text = re.findall(r'\\[\\[.*?\\]\\]', open(filename).read())[0]\n",
|
||||
" header, *table = ast.literal_eval(text)\n",
|
||||
" dates = header[1::2]\n",
|
||||
" dates = [date32(d) for d in header[1::2]]\n",
|
||||
" states = [State(name, *state_data[name],\n",
|
||||
" approvals=dict(zip(dates, map(int, numbers[0::2]))),\n",
|
||||
" disapprovals=dict(zip(dates, map(int, numbers[1::2]))))\n",
|
||||
" for (name, *numbers) in table]\n",
|
||||
" return states, dates\n",
|
||||
"\n",
|
||||
"def date32(date) -> str: \n",
|
||||
" \"\"\"Convert a date to 3-2 format: date32(\"June '17\") => 'Jun-17'.\"\"\"\n",
|
||||
" return date[:3] + '-' + date[-2:]\n",
|
||||
"\n",
|
||||
"states, dates = parse_page('evs.html')\n",
|
||||
"now = dates[-1]\n",
|
||||
"\n",
|
||||
@@ -178,7 +182,7 @@
|
||||
"\n",
|
||||
"def grid(dates, xlab, ylab): \n",
|
||||
" plt.minorticks_on(); plt.grid(which='minor', axis='y', ls=':', alpha=0.7)\n",
|
||||
" plt.xticks(range(len(dates)), dates, rotation=90)\n",
|
||||
" plt.xticks(range(len(dates)), dates, rotation=90, fontfamily='monospace')\n",
|
||||
" plt.xlabel(xlab); plt.ylabel(ylab); plt.legend()"
|
||||
]
|
||||
},
|
||||
@@ -198,7 +202,7 @@
|
||||
" plt.plot(range(N), [270] * N, color='darkorange', label=\"270 EVs\", lw=2)\n",
|
||||
" plt.errorbar(range(N), [EV(states, date) for date in dates], fmt='D-',\n",
|
||||
" yerr=err, ecolor='grey', capsize=7, label='Trump EVs ±3% swing', lw=2)\n",
|
||||
" grid(dates, 'Date', 'Electoral Vptes')\n",
|
||||
" grid(dates, 'Date', 'Electoral Votes')\n",
|
||||
" #labels('Date', 'Electoral Votes')"
|
||||
]
|
||||
},
|
||||
@@ -271,6 +275,40 @@
|
||||
" yield f'|{swing_name(s)}|{s.lean:+d}|{s.ev}|{\"|\".join(fields)}|'"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Show how to make all Electoral Vote totals:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def all_totals(states) -> dict:\n",
|
||||
" \"\"\"Return a dict of {ev_total: [state, ...]}\"\"\"\n",
|
||||
" totals = {0: []}\n",
|
||||
" for s in sorted(states, key=lambda s: s.ev):\n",
|
||||
" new = {}\n",
|
||||
" for t in totals:\n",
|
||||
" new[t + s.ev] = shorter(totals.get(t + s.ev), totals[t] + [s.name])\n",
|
||||
" totals = {**totals, **new}\n",
|
||||
" return totals\n",
|
||||
" \n",
|
||||
"def shorter(A, B):\n",
|
||||
" \"\"\"Return the sequence that is shorter, but always return B if A is None.\"\"\"\n",
|
||||
" return B if A is None or len(A) > len(B) else A\n",
|
||||
"\n",
|
||||
"def show_totals():\n",
|
||||
" districts = [State('Maine-1', 1, 0, 0, 0), State('Maine-2', 1, 0, 0, 0)]\n",
|
||||
" totals = all_totals(states + districts)\n",
|
||||
" for i in range(270):\n",
|
||||
" print(f\"{i:3} [{' + '.join(totals[i])}]\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -280,7 +318,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -306,7 +344,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.2"
|
||||
"version": "3.7.6"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
Reference in new issue
Block a user