Add files via upload

This commit is contained in:
Peter Norvig authored and GitHub committed 2020-02-02 12:47:49 -08:00
1 parent 15bf94b14b
commit 95aec859f7
3 files changed
+607 -546

No files matched your search

+166 -119
View File
@@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"<div align=\"right\"><i>Peter Norvig<br>16 December 2019</i></div>\n",
"<div align=\"right\"><i>Peter Norvig<br>Dec 2019</i></div>\n",
"\n",
"# Predicting Presidential Electoral Votes from Approval Polls\n",
"\n",
@@ -22,9 +22,14 @@
"predict electoral votes? ***Yes we can!***\n",
"\n",
"\n",
"# TL;DR: Trump is at 185 Electoral Votes\n",
"# TL;DR: In this model, Trump gets 104 to 235 Electoral Votes\n",
"\n",
"As of November, 2019, Trump would get **185** electoral votes under the assumption that he wins the electoral votes of states where he currently has positive net approval and loses the states where he has negative net approval. To win, he'd have to get to **270**, which would entail flipping 11 states (if you go in net approval order), the toughest of which would be Pennsylvania, where he is currently at **-9%** net approval."
"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 has net approval of zero in two big states, 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, the toughest being Pennsylvania, where he is 5% behind.\n"
]
},
{
@@ -44,7 +49,7 @@
{
"data": {
"text/plain": [
"185"
"149.5"
]
},
"execution_count": 1,
@@ -62,19 +67,62 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Details for policy wonks\n",
"The `.5` indicates a tie (net zero approval) in one or more states. \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."
"To get a better feel for the situation, 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. If we allowed larger swings in approval, we'd get a larger range. Here's how it goes:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"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"
]
}
],
"source": [
"show_swings()"
]
},
{
"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)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"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.\n",
"\n",
"The most recent month (month 35) is December 2019."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x504 with 1 Axes>"
]
@@ -101,9 +149,9 @@
"\n",
"- **Movement**: I define the **maximum expected movement** of approval 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 monthly net approval. \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 **13** such states now, all with net approval between **+3% and -5%**. The swing states are shown below in **BOLD CAPS**.\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 **12** such states now. The swing states are shown below in **BOLD CAPS**.\n",
"\n",
"- **Margin**: If you list states in order of net approval, the key turning-point state is Pennsylvania; Trump would need to win that and every state in which he is more popular to reach 270. He currently is **7% behind in Pennsylvania**, so we say that his **margin is 7%**.\n",
"- **Margin**: If you list states in order of net approval, the key turning-point state is Pennsylvania; Trump would need to win that and every state in which he is more popular to reach 270. He currently is **5% behind in Pennsylvania**, so we say that his margin is just over 5%.\n",
"\n",
"# State-by-state summary table\n",
"\n",
@@ -120,15 +168,16 @@
"- **𝝈**: 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 in, he gets **185** electoral votes (the **ΣEV** in the Florida row).\n",
"- If he also wins all the swing states, he gets **253** electoral votes (**ΣEV** in the Ohio row). \n",
"- To get to **270**, going in order of states with least bad net approval, he would also need to win Ohio, Nevada, and Pennsylvania. Or substitute Virginia for one of these; but he would need to win at least one state where he is currently down by **7%**, so that's the margin.\n",
"- Some traditional swing states currently seem out of reach for Trump: he's at **-14%** in Michigan and Wisconsin.\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"
]
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -136,57 +185,57 @@
"text/markdown": [
"|State|Net|Move|EV|ΣEV|+|−|?|𝝈|\n",
"|-|-|-|-|-|-|-|-|-|\n",
"|Wyoming|+35%|±11%|3|3|66%|31%|3%|±5.3%\n",
"|Alabama|+22%|±6%|9|12|59%|37%|4%|±2.5%\n",
"|Mississippi|+19%|±6%|6|18|57%|38%|5%|±2.7%\n",
"|West Virginia|+19%|±6%|5|23|58%|39%|3%|±2.7%\n",
"|Idaho|+18%|±6%|4|27|57%|39%|4%|±2.8%\n",
"|Tennessee|+16%|±5%|11|38|56%|40%|4%|±2.1%\n",
"|Kentucky|+14%|±4%|8|46|55%|41%|4%|±1.5%\n",
"|Alaska|+10%|±7%|3|49|53%|43%|4%|±3.1%\n",
"|Louisiana|+10%|±7%|8|57|53%|43%|4%|±2.9%\n",
"|Oklahoma|+9%|±6%|7|64|53%|44%|3%|±2.5%\n",
"|Arkansas|+8%|±5%|6|70|52%|44%|4%|±2.0%\n",
"|South Carolina|+8%|±4%|9|79|52%|44%|4%|±1.7%\n",
"|**KANSAS**|**+3%**|**±5%**|6|85|50%|47%|3%|±2.2%\n",
"|**MISSOURI**|**+3%**|**±6%**|10|95|50%|47%|3%|±2.7%\n",
"|**SOUTH DAKOTA**|**+3%**|**±9%**|3|98|50%|47%|3%|±4.1%\n",
"|**TEXAS**|**+3%**|**±4%**|38|136|49%|46%|5%|±1.5%\n",
"|**INDIANA**|**+2%**|**±4%**|11|147|49%|47%|4%|±1.8%\n",
"|**NORTH DAKOTA**|**+2%**|**±6%**|3|150|49%|47%|4%|±2.7%\n",
"|**UTAH**|**+2%**|**±7%**|6|156|49%|47%|4%|±3.1%\n",
"|**FLORIDA**|**+1%**|**±3%**|29|185|49%|48%|3%|±1.4%\n",
"|**MONTANA**|**-1%**|**±7%**|3|188|48%|49%|3%|±3.1%\n",
"|**NORTH CAROLINA**|**-2%**|**±4%**|15|203|47%|49%|4%|±1.5%\n",
"|**GEORGIA**|**-3%**|**±6%**|16|219|46%|49%|5%|±2.6%\n",
"|**ARIZONA**|**-4%**|**±4%**|11|230|46%|50%|4%|±1.7%\n",
"|**NEBRASKA**|**-5%**|**±9%**|5|235|46%|51%|3%|±4.1%\n",
"|Ohio|-5%|±3%|18|253|46%|51%|3%|±1.0%\n",
"|Nevada|-7%|±5%|6|259|45%|52%|3%|±2.3%\n",
"|Pennsylvania|-7%|±3%|20|279|45%|52%|3%|±1.2%\n",
"|Virginia|-7%|±4%|13|292|45%|52%|3%|±1.9%\n",
"|New Mexico|-9%|±7%|5|297|44%|53%|3%|±3.4%\n",
"|Iowa|-13%|±4%|6|303|42%|55%|3%|±1.8%\n",
"|Maine|-13%|±5%|4|307|42%|55%|3%|±2.4%\n",
"|Minnesota|-13%|±5%|10|317|42%|55%|3%|±2.1%\n",
"|Michigan|-14%|±4%|16|333|41%|55%|4%|±1.8%\n",
"|Wisconsin|-14%|±4%|10|343|41%|55%|4%|±1.7%\n",
"|Colorado|-15%|±5%|9|352|41%|56%|3%|±2.3%\n",
"|New Hampshire|-15%|±9%|4|356|41%|56%|3%|±4.1%\n",
"|New Jersey|-15%|±4%|14|370|41%|56%|3%|±1.5%\n",
"|Delaware|-18%|±8%|3|373|39%|57%|4%|±3.5%\n",
"|Illinois|-20%|±4%|20|393|38%|58%|4%|±1.6%\n",
"|Connecticut|-22%|±3%|7|400|37%|59%|4%|±1.3%\n",
"|Rhode Island|-22%|±4%|4|404|37%|59%|4%|±1.8%\n",
"|Oregon|-24%|±5%|7|411|36%|60%|4%|±2.1%\n",
"|New York|-25%|±3%|29|440|36%|61%|3%|±1.2%\n",
"|Maryland|-27%|±4%|10|450|35%|62%|3%|±1.8%\n",
"|California|-28%|±3%|55|505|34%|62%|4%|±1.2%\n",
"|Massachusetts|-29%|±4%|11|516|34%|63%|3%|±1.8%\n",
"|Washington|-29%|±5%|12|528|34%|63%|3%|±2.0%\n",
"|Hawaii|-35%|±9%|4|532|31%|66%|3%|±4.2%\n",
"|Vermont|-42%|±8%|3|535|28%|70%|2%|±3.6%\n",
"|District of Columbia|-62%|±6%|3|538|17%|79%|4%|±2.5%"
"|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%"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
@@ -206,17 +255,17 @@
"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. His margin has been 7% or worse for a year now. We see that the state-by-state margin roughly correlates with the country-wide net approval, but not exactly."
"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,
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x504 with 1 Axes>"
]
@@ -235,16 +284,14 @@
"source": [
"# Popularity Above Replacement President (PARP) \n",
"\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",
"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",
"Trump is much less popular than the average Republican. There are only three states where Trump is exceeding a replacement Republican (i.e., has a positive PARP): one deep-red southern state, Mississippi, and two deep-blue coastal states, Hawaii and Rhode Island (where he is deeply unpopular, but not as unpopular as other Republicans). Again, the swing states are **BOLD CAPITALIZED**. \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 3."
"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."
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 6,
"metadata": {},
"outputs": [
{
@@ -252,57 +299,57 @@
"text/markdown": [
"|State|Lean|EV|PARP|(Net)|PARP'19|(Net)|PARP'18|(Net)|PARP'17|(Net)|\n",
"|-|-|-|-|-|-|-|-|-|-|-|\n",
"|Mississippi|+15|6|+4|(+19)|-2|(+13)|+2|(+17)|+19|(+34)|\n",
"|Rhode Island|-26|4|+4|(-22)|+7|(-19)|+4|(-22)|+22|(-4)|\n",
"|Hawaii|-36|4|+1|(-35)|+7|(-29)|+0|(-36)|+23|(-13)|\n",
"|Massachusetts|-29|11|+0|(-29)|-2|(-31)|-3|(-32)|+25|(-4)|\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",
"|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|-2|(-9)|-11|(-18)|-13|(-20)|+24|(+17)|\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",
"|California|-24|55|-4|(-28)|-6|(-30)|+1|(-23)|+18|(-6)|\n",
"|Delaware|-14|3|-4|(-18)|-1|(-15)|+0|(-14)|+22|(+8)|\n",
"|**FLORIDA**|+5|29|-4|(+1)|-9|(-4)|+0|(+5)|+17|(+22)|\n",
"|Maryland|-23|10|-4|(-27)|-7|(-30)|+0|(-23)|+10|(-13)|\n",
"|Alabama|+27|9|-5|(+22)|-7|(+20)|+3|(+30)|+9|(+36)|\n",
"|Alaska|+15|3|-5|(+10)|-14|(+1)|-14|(+1)|+9|(+24)|\n",
"|Illinois|-13|20|-7|(-20)|-10|(-23)|-8|(-21)|+22|(+9)|\n",
"|Louisiana|+17|8|-7|(+10)|-2|(+15)|+2|(+19)|+14|(+31)|\n",
"|**NORTH CAROLINA**|+5|15|-7|(-2)|-9|(-4)|-6|(-1)|+13|(+18)|\n",
"|Virginia|+0|13|-7|(-7)|-10|(-10)|-4|(-4)|+8|(+8)|\n",
"|Maine|-5|4|-8|(-13)|-6|(-11)|-11|(-16)|+13|(+8)|\n",
"|Nevada|+1|6|-8|(-7)|-14|(-13)|-2|(-1)|+9|(+10)|\n",
"|Pennsylvania|+1|20|-8|(-7)|-11|(-10)|-4|(-3)|+9|(+10)|\n",
"|**NORTH CAROLINA**|+5|15|-5|(+0)|-9|(-4)|-6|(-1)|+13|(+18)|\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",
"|South Carolina|+17|9|-9|(+8)|-9|(+8)|-10|(+7)|+8|(+25)|\n",
"|Connecticut|-11|7|-11|(-22)|-13|(-24)|-8|(-19)|+16|(+5)|\n",
"|Minnesota|-2|10|-11|(-13)|-16|(-18)|-12|(-14)|+5|(+3)|\n",
"|West Virginia|+30|5|-11|(+19)|-6|(+24)|-8|(+22)|+7|(+37)|\n",
"|Ohio|+7|18|-12|(-5)|-13|(-6)|-11|(-4)|+7|(+14)|\n",
"|Tennessee|+28|11|-12|(+16)|-16|(+12)|-11|(+17)|+5|(+33)|\n",
"|Wyoming|+47|3|-12|(+35)|-17|(+30)|-22|(+25)|-7|(+40)|\n",
"|**ARIZONA**|+9|11|-13|(-4)|-17|(-8)|-12|(-3)|+11|(+20)|\n",
"|Michigan|-1|16|-13|(-14)|-14|(-15)|-9|(-10)|+9|(+8)|\n",
"|Colorado|-1|9|-14|(-15)|-17|(-18)|-13|(-14)|+2|(+1)|\n",
"|**TEXAS**|+17|38|-14|(+3)|-17|(+0)|-10|(+7)|+3|(+20)|\n",
"|**GEORGIA**|+12|16|-15|(-3)|-14|(-2)|-5|(+7)|+6|(+18)|\n",
"|Oregon|-9|7|-15|(-24)|-13|(-22)|-11|(-20)|+11|(+2)|\n",
"|Wisconsin|+1|10|-15|(-14)|-17|(-16)|-13|(-12)|+5|(+6)|\n",
"|Arkansas|+24|6|-16|(+8)|-14|(+10)|-11|(+13)|+6|(+30)|\n",
"|**INDIANA**|+18|11|-16|(+2)|-14|(+4)|-17|(+1)|+4|(+22)|\n",
"|**MISSOURI**|+19|10|-16|(+3)|-21|(-2)|-17|(+2)|+0|(+19)|\n",
"|Idaho|+35|4|-17|(+18)|-20|(+15)|-24|(+11)|-6|(+29)|\n",
"|New Hampshire|+2|4|-17|(-15)|-21|(-19)|-12|(-10)|-1|(+1)|\n",
"|Washington|-12|12|-17|(-29)|-14|(-26)|-11|(-23)|+13|(+1)|\n",
"|Vermont|-24|3|-18|(-42)|-11|(-35)|-12|(-36)|+22|(-2)|\n",
"|District of Columbia|-43|3|-19|(-62)|-22|(-65)|-21|(-64)|+12|(-31)|\n",
"|Iowa|+6|6|-19|(-13)|-20|(-14)|-16|(-10)|+3|(+9)|\n",
"|**MONTANA**|+18|3|-19|(-1)|-17|(+1)|-18|(+0)|+6|(+24)|\n",
"|**KANSAS**|+23|6|-20|(+3)|-22|(+1)|-18|(+5)|+1|(+24)|\n",
"|Oklahoma|+34|7|-25|(+9)|-24|(+10)|-19|(+15)|+0|(+34)|\n",
"|**SOUTH DAKOTA**|+31|3|-28|(+3)|-25|(+6)|-21|(+10)|-10|(+21)|\n",
"|**NEBRASKA**|+24|5|-29|(-5)|-24|(+0)|-18|(+6)|-1|(+23)|\n",
"|**UTAH**|+31|6|-29|(+2)|-37|(-6)|-34|(-3)|-4|(+27)|\n",
"|**NORTH DAKOTA**|+33|3|-31|(+2)|-29|(+4)|-22|(+11)|-10|(+23)|"
"|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)|"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
+34 -21
View File
@@ -12,12 +12,12 @@
" 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\",\"January 1, 2017\",\"February 1, 2017\", ...]\n",
" var mc_state_trend = [[\"Demographic\",\"Jan-17\",\"\",\"Feb-17\",\"\", ...]\n",
" [\"Alabama\",\"62\",\"26\",\"65\",\"29\", ...], \n",
" ... ]\n",
" \n",
"The first row is a header (each date is a day at which polls were aggregated).\n",
"The subsequent rows each start with the state name, followed by the approval and disapproval percentages for each date. That is, if there are 34 dates, there will by 68 numbers. The row shown above is saying that on January 1, 2017, 62% of Alabamans approved and 26% disapproved; then on February 1, 2017, 65% approved and 29% disapproved, and so on. Our job is to extract this data and find ways to visualize and understand it.\n",
"The first row is a header (each date is a month at which polls were aggregated).\n",
"The subsequent rows each start with the state name, followed by the approval and disapproval percentages for each date. That is, if there are 34 dates, there will by 68 numbers. The row shown above is saying that in January, 2017, 62% of Alabamans approved and 26% disapproved; then in February, 2017, 65% approved and 29% disapproved, and so on. Our job is to extract this data and find ways to visualize and understand it.\n",
"\n",
"First fetch the page and save it locally:"
]
@@ -90,18 +90,18 @@
"# From https://projects.fivethirtyeight.com/trump-approval-ratings/\n",
"# A dict of {'date': country-wide-net-approval}\n",
"net_usa = {\n",
" 'January 2017': 10, 'January 2018': -18, 'January 2019': -12, \n",
" 'February 2017': 0, 'February 2018': -15, 'February 2019': -16, \n",
" 'March 2017': -6, 'March 2018': -14, 'March 2019': -11, \n",
" 'April 2017': -13, 'April 2018': -13, 'April 2019': -11, \n",
" 'May 2017': -11, 'May 2018': -12, 'May 2019': -12, \n",
" 'June 2017': -16, 'June 2018': -11, 'June 2019': -12, \n",
" 'July 2017': -15, 'July 2018': -10, 'July 2019': -11, \n",
" 'August 2017': -19, 'August 2018': -12, 'August 2019': -10, \n",
" 'September 2017': -20, 'September 2018': -14, 'September 2019': -13, \n",
" 'October 2017': -17, 'October 2018': -11, 'October 2019': -13, \n",
" 'November 2017': -19, 'November 2018': -11, 'November 2019': -13,\n",
" 'December 2017': -18, 'December 2018': -10, 'December 2019': -12,\n",
" 'Jan-17': 10, 'Jan-18': -18, 'Jan-19': -12, \n",
" 'Feb-17': 0, 'Feb-18': -15, 'Feb-19': -16, \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",
" 'Aug-17': -19, 'Aug-18': -12, 'Aug-19': -10, \n",
" 'Sep-17': -20, 'Sep-18': -14, 'Sep-19': -13, \n",
" 'Oct-17': -17, 'Oct-18': -11, 'Oct-19': -13, \n",
" 'Nov-17': -19, 'Nov-18': -11, 'Nov-19': -13,\n",
" 'Dec-17': -18, 'Dec-18': -10, 'Dec-19': -12,\n",
" }"
]
},
@@ -146,7 +146,7 @@
"\n",
"def margin(states, date=now) -> int:\n",
" \"What's the least swing that would lead to a majority?\"\n",
" return min(swing for swing in range(-50, 50) if EV(states, date, swing) >= 270)\n",
" return min(swing for swing in range(-50, 50) if EV(states, date, swing+0.1) >= 270)\n",
"\n",
"def net(state, date=now) -> int: return state.approvals[date] - state.disapprovals[date]\n",
"def undecided(state, date=now) -> int: return 100 - state.approvals[date] - state.disapprovals[date]\n",
@@ -164,7 +164,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
@@ -181,7 +181,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
@@ -201,7 +201,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
@@ -217,6 +217,19 @@
" labels('Months into term', 'Net popularity')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def show_swings(swings=range(8)):\n",
" print('Swing EV Range')\n",
" for swing in swings:\n",
" s = swing + 0.5\n",
" print(f'±{s:3.1f}% {EV(states, swing=-s):3} to {EV(states, swing=s):3}')"
]
},
{
"cell_type": "code",
"execution_count": 9,
@@ -226,7 +239,7 @@
"outputs": [],
"source": [
"@markdown\n",
"def show_states(states=states, d=now, ref='January 2017'):\n",
"def show_states(states=states, d=now, ref='Jan-17'):\n",
" \"A table of states, sorted by net approval, with electoral votes.\"\n",
" total = 0\n",
" yield header(f'|State|Net|Move|EV|ΣEV|+|−|?|𝝈|')\n",
@@ -246,7 +259,7 @@
"outputs": [],
"source": [
"@markdown\n",
"def show_parp(states=states, dates=(now, 'January 2019', 'January 2018', 'January 2017')):\n",
"def show_parp(states=states, dates=(now, 'Jan-19', 'Jan-18', 'Jan-17')):\n",
" \"A table of states, sorted by Popularity Above Replacement President.\"\n",
" def year(date): return '' if date == now else \"'\" + date[-2:]\n",
" fields = [f\"PARP{year(date)}|(Net)\" for date in dates]\n",
+407 -406
View File
File diff suppressed because it is too large. Load diff