Skip to content

Instantly share code, notes, and snippets.

@Samcfuchs
Last active February 8, 2020 22:32
Show Gist options
  • Save Samcfuchs/89a3970f8555d15f60dd752e0e008be2 to your computer and use it in GitHub Desktop.
Save Samcfuchs/89a3970f8555d15f60dd752e0e008be2 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{"cells":[{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","import numpy as np\n","import json,urllib.request\n","import seaborn as sns\n","\n","URL = \"https://int.nyt.com/applications/elections/2020/data/api/2020-02-03/precincts/IowaDemPrecinctsSFTP-latest.json\"\n",""]},{"cell_type":"markdown","metadata":{},"source":[" The New York Times hosts the raw JSON data that they scrape from the IDP\n"," website publicly, so we can pull that data directly with an HTTP request."]},{"cell_type":"code","execution_count":2,"metadata":{},"outputs":[],"source":["data = urllib.request.urlopen(URL).read()\n","output = json.loads(data)\n",""]},{"cell_type":"markdown","metadata":{},"source":[" Data cleaning here is easy, partially because the NYT probably does a fair\n"," amount of cross-checking of their own and partially because weird data\n"," discrepancies are what we're really looking for."]},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[{"data":{"text/html":"<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>precinct</th>\n <th>locality_name</th>\n <th>locality_type</th>\n <th>precinct_id</th>\n <th>results_align1</th>\n <th>results_alignfinal</th>\n <th>results</th>\n <th>votes</th>\n <th>votes_align1</th>\n <th>votes_alignfinal</th>\n <th>name</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>0</td>\n <td>FM5</td>\n <td>Lee</td>\n <td>county</td>\n <td>947310</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 24, 'b...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 25, 'b...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.42, ...</td>\n <td>1.6800</td>\n <td>91</td>\n <td>91</td>\n <td>Lee FM5</td>\n </tr>\n <tr>\n <td>1</td>\n <td>KE2A</td>\n <td>Lee</td>\n <td>county</td>\n <td>947312</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 2, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>0.7000</td>\n <td>22</td>\n <td>22</td>\n <td>Lee KE2A</td>\n </tr>\n <tr>\n <td>2</td>\n <td>8</td>\n <td>Sac</td>\n <td>county</td>\n <td>947848</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.0667...</td>\n <td>0.2001</td>\n <td>16</td>\n <td>16</td>\n <td>Sac 8</td>\n </tr>\n <tr>\n <td>3</td>\n <td>5</td>\n <td>Sac</td>\n <td>county</td>\n <td>947845</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 2, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>0.2001</td>\n <td>11</td>\n <td>11</td>\n <td>Sac 5</td>\n </tr>\n <tr>\n <td>4</td>\n <td>2</td>\n <td>Sac</td>\n <td>county</td>\n <td>947842</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>0.1334</td>\n <td>5</td>\n <td>5</td>\n <td>Sac 2</td>\n </tr>\n </tbody>\n</table>\n</div>","text/plain":" precinct locality_name locality_type precinct_id \\\n0 FM5 Lee county 947310 \n1 KE2A Lee county 947312 \n2 8 Sac county 947848 \n3 5 Sac county 947845 \n4 2 Sac county 947842 \n\n results_align1 \\\n0 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 24, 'b... \n1 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 2, 'bl... \n2 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl... \n3 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 2, 'bl... \n4 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... \n\n results_alignfinal \\\n0 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 25, 'b... \n1 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... \n2 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl... \n3 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... \n4 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... \n\n results votes votes_align1 \\\n0 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.42, ... 1.6800 91 \n1 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... 0.7000 22 \n2 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.0667... 0.2001 16 \n3 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... 0.2001 11 \n4 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... 0.1334 5 \n\n votes_alignfinal name \n0 91 Lee FM5 \n1 22 Lee KE2A \n2 16 Sac 8 \n3 11 Sac 5 \n4 5 Sac 2 "},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["precincts = pd.DataFrame(output['precincts'])\n","\n","# Clean dataframe\n","drop_cols = [\"geo_id\",\"locality_fips\",\"is_complete\"]\n","\n","precincts['name'] = precincts.apply(lambda r: f\"{r.locality_name} {r.precinct}\", axis=1)\n","precincts = precincts.loc[precincts.is_complete,:]\n","precincts.drop(drop_cols, inplace=True, axis=1)\n","precincts.head()\n",""]},{"cell_type":"markdown","metadata":{},"source":[" We also have data about how state delegates are apportioned to each precinct.\n"," Let's merge that data in as well."]},{"cell_type":"code","execution_count":4,"metadata":{},"outputs":[{"data":{"text/html":"<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>locality_name</th>\n <th>precinct</th>\n <th>county_delegates</th>\n <th>sde</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>0</td>\n <td>Lee</td>\n <td>FM4B</td>\n <td>0</td>\n <td>0.000</td>\n </tr>\n <tr>\n <td>1</td>\n <td>Lee</td>\n <td>KE2B</td>\n <td>0</td>\n <td>0.000</td>\n </tr>\n <tr>\n <td>2</td>\n <td>Lee</td>\n <td>HR</td>\n <td>0</td>\n <td>0.000</td>\n </tr>\n <tr>\n <td>3</td>\n <td>Appanoose</td>\n <td>CW</td>\n <td>2</td>\n <td>0.160</td>\n </tr>\n <tr>\n <td>4</td>\n <td>Black Hawk</td>\n <td>S000</td>\n <td>2</td>\n <td>0.404</td>\n </tr>\n </tbody>\n</table>\n</div>","text/plain":" locality_name precinct county_delegates sde\n0 Lee FM4B 0 0.000\n1 Lee KE2B 0 0.000\n2 Lee HR 0 0.000\n3 Appanoose CW 2 0.160\n4 Black Hawk S000 2 0.404"},"execution_count":4,"metadata":{},"output_type":"execute_result"}],"source":["delegates = pd.read_csv(\"delegates.csv\")\n","\n","cols_ren = {\n"," \"County\": \"locality_name\",\n"," \"Precinct Short Name\": \"precinct\", \n"," \"Delegates to County Convention\": \"county_delegates\",\n"," \"State Delegate Equivalents\": \"sde\"\n","}\n","delegates.rename(cols_ren, axis=1, inplace=True)\n","delegates.head()\n",""]},{"cell_type":"code","execution_count":5,"metadata":{},"outputs":[{"data":{"text/html":"<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>locality_type</th>\n <th>precinct_id</th>\n <th>results_align1</th>\n <th>results_alignfinal</th>\n <th>results</th>\n <th>votes</th>\n <th>votes_align1</th>\n <th>votes_alignfinal</th>\n <th>name</th>\n <th>county_delegates</th>\n <th>sde</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>0</td>\n <td>county</td>\n <td>947310</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 24, 'b...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 25, 'b...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.42, ...</td>\n <td>1.6800</td>\n <td>91</td>\n <td>91</td>\n <td>Lee FM5</td>\n <td>12</td>\n <td>1.680000</td>\n </tr>\n <tr>\n <td>1</td>\n <td>county</td>\n <td>947312</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 2, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>0.7000</td>\n <td>22</td>\n <td>22</td>\n <td>Lee KE2A</td>\n <td>5</td>\n <td>0.700000</td>\n </tr>\n <tr>\n <td>2</td>\n <td>county</td>\n <td>946816</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 18, 'b...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 19, 'b...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.2824...</td>\n <td>1.2237</td>\n <td>71</td>\n <td>71</td>\n <td>Clay SP5</td>\n <td>13</td>\n <td>1.223529</td>\n </tr>\n <tr>\n <td>3</td>\n <td>county</td>\n <td>946809</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 1, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl...</td>\n <td>0.3764</td>\n <td>17</td>\n <td>15</td>\n <td>Clay LNCL</td>\n <td>4</td>\n <td>0.376471</td>\n </tr>\n <tr>\n <td>4</td>\n <td>county</td>\n <td>946805</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl...</td>\n <td>{'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.0941...</td>\n <td>0.2823</td>\n <td>19</td>\n <td>19</td>\n <td>Clay DGPE</td>\n <td>3</td>\n <td>0.282353</td>\n </tr>\n </tbody>\n</table>\n</div>","text/plain":" locality_type precinct_id \\\n0 county 947310 \n1 county 947312 \n2 county 946816 \n3 county 946809 \n4 county 946805 \n\n results_align1 \\\n0 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 24, 'b... \n1 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 2, 'bl... \n2 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 18, 'b... \n3 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 1, 'bl... \n4 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl... \n\n results_alignfinal \\\n0 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 25, 'b... \n1 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... \n2 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 19, 'b... \n3 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... \n4 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 4, 'bl... \n\n results votes votes_align1 \\\n0 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.42, ... 1.6800 91 \n1 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... 0.7000 22 \n2 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.2824... 1.2237 71 \n3 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0, 'bl... 0.3764 17 \n4 {'delaneyj': 0, 'bennetm': 0, 'bidenj': 0.0941... 0.2823 19 \n\n votes_alignfinal name county_delegates sde \n0 91 Lee FM5 12 1.680000 \n1 22 Lee KE2A 5 0.700000 \n2 71 Clay SP5 13 1.223529 \n3 15 Clay LNCL 4 0.376471 \n4 19 Clay DGPE 3 0.282353 "},"execution_count":5,"metadata":{},"output_type":"execute_result"}],"source":["precincts = precincts.merge(delegates, on=['locality_name','precinct'])\n","precincts.drop(['locality_name','precinct'], inplace=True, axis=1)\n","precincts.head()\n",""]},{"cell_type":"markdown","metadata":{},"source":[" The rules of the caucus state that if a candidate meets viability, the voters\n"," for that candidate cannot leave their \"corner.\" However, we see many instances\n"," where Sanders meets the 15% threshold for viability but has fewer votes in the\n"," final expression than in the initial. Many precinct chairs failed to record\n"," final alignments, but still allocated SDEs correctly. We exclude instances of\n"," that error as we have no reason to assume that the SDE count was mistaken."]},{"cell_type":"code","execution_count":6,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"38\n"},{"data":{"text/html":"<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>votes_align1</th>\n <th>threshold</th>\n <th>results_align1</th>\n <th>results_alignfinal</th>\n <th>lost_voters</th>\n <th>results_SDE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>0</td>\n <td>Clinton CL21</td>\n <td>90</td>\n <td>13.50</td>\n <td>26</td>\n <td>20</td>\n <td>6</td>\n <td>0.4429</td>\n </tr>\n <tr>\n <td>1</td>\n <td>Linn TFAY</td>\n <td>54</td>\n <td>8.10</td>\n <td>11</td>\n <td>0</td>\n <td>11</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>2</td>\n <td>Linn TMAR</td>\n <td>96</td>\n <td>14.40</td>\n <td>18</td>\n <td>0</td>\n <td>18</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>3</td>\n <td>Linn HIA03</td>\n <td>92</td>\n <td>13.80</td>\n <td>14</td>\n <td>0</td>\n <td>14</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>4</td>\n <td>Lyon P2</td>\n <td>11</td>\n <td>1.65</td>\n <td>2</td>\n <td>0</td>\n <td>2</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>5</td>\n <td>Polk CLAY 1</td>\n <td>72</td>\n <td>10.80</td>\n <td>12</td>\n <td>0</td>\n <td>12</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>6</td>\n <td>Polk WDM-313</td>\n <td>148</td>\n <td>22.20</td>\n <td>23</td>\n <td>0</td>\n <td>23</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>7</td>\n <td>Tama YK</td>\n <td>16</td>\n <td>2.40</td>\n <td>3</td>\n <td>0</td>\n <td>3</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>8</td>\n <td>Mills EM</td>\n <td>15</td>\n <td>2.25</td>\n <td>4</td>\n <td>0</td>\n <td>4</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>9</td>\n <td>Scott MC</td>\n <td>42</td>\n <td>6.30</td>\n <td>9</td>\n <td>0</td>\n <td>9</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>10</td>\n <td>Keokuk AD</td>\n <td>14</td>\n <td>2.10</td>\n <td>3</td>\n <td>0</td>\n <td>3</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>11</td>\n <td>Keokuk SG1</td>\n <td>20</td>\n <td>3.00</td>\n <td>4</td>\n <td>0</td>\n <td>4</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>12</td>\n <td>Warren PM</td>\n <td>33</td>\n <td>4.95</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>13</td>\n <td>Calhoun UNION</td>\n <td>14</td>\n <td>2.10</td>\n <td>3</td>\n <td>0</td>\n <td>3</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>14</td>\n <td>Clinton SHLN</td>\n <td>21</td>\n <td>3.15</td>\n <td>4</td>\n <td>0</td>\n <td>4</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>15</td>\n <td>Fayette JF</td>\n <td>26</td>\n <td>3.90</td>\n <td>4</td>\n <td>0</td>\n <td>4</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>16</td>\n <td>Fayette UN</td>\n <td>16</td>\n <td>2.40</td>\n <td>4</td>\n <td>0</td>\n <td>4</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>17</td>\n <td>Johnson HD</td>\n <td>55</td>\n <td>8.25</td>\n <td>10</td>\n <td>0</td>\n <td>10</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>18</td>\n <td>Johnson GR</td>\n <td>54</td>\n <td>8.10</td>\n <td>9</td>\n <td>0</td>\n <td>9</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>19</td>\n <td>Mahaska ED</td>\n <td>11</td>\n <td>1.65</td>\n <td>2</td>\n <td>0</td>\n <td>2</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>20</td>\n <td>Mahaska AD</td>\n <td>11</td>\n <td>1.65</td>\n <td>2</td>\n <td>0</td>\n <td>2</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>21</td>\n <td>Osceola HA</td>\n <td>5</td>\n <td>0.75</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>22</td>\n <td>Crawford CO</td>\n <td>24</td>\n <td>3.60</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>23</td>\n <td>Crawford SRK</td>\n <td>20</td>\n <td>3.00</td>\n <td>3</td>\n <td>0</td>\n <td>3</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>24</td>\n <td>Humboldt NL-EV</td>\n <td>3</td>\n <td>0.45</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>25</td>\n <td>Appanoose CW</td>\n <td>13</td>\n <td>1.95</td>\n <td>2</td>\n <td>0</td>\n <td>2</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>26</td>\n <td>Muscatine OR</td>\n <td>14</td>\n <td>2.10</td>\n <td>4</td>\n <td>1</td>\n <td>3</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>27</td>\n <td>Muscatine PI</td>\n <td>23</td>\n <td>3.45</td>\n <td>7</td>\n <td>0</td>\n <td>7</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>28</td>\n <td>Van Buren ML</td>\n <td>8</td>\n <td>1.20</td>\n <td>2</td>\n <td>0</td>\n <td>2</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>29</td>\n <td>Van Buren SP</td>\n <td>6</td>\n <td>0.90</td>\n <td>2</td>\n <td>0</td>\n <td>2</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>30</td>\n <td>Winnebago FC 4</td>\n <td>43</td>\n <td>6.45</td>\n <td>7</td>\n <td>0</td>\n <td>7</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>31</td>\n <td>Washington WC</td>\n <td>34</td>\n <td>5.10</td>\n <td>6</td>\n <td>0</td>\n <td>6</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>32</td>\n <td>Buena Vista TRWG</td>\n <td>21</td>\n <td>3.15</td>\n <td>5</td>\n <td>3</td>\n <td>2</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>33</td>\n <td>Cerro Gordo MV</td>\n <td>15</td>\n <td>2.25</td>\n <td>3</td>\n <td>0</td>\n <td>3</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>34</td>\n <td>Cerro Gordo LCN</td>\n <td>29</td>\n <td>4.35</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>35</td>\n <td>Cerro Gordo LK</td>\n <td>22</td>\n <td>3.30</td>\n <td>4</td>\n <td>1</td>\n <td>3</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>36</td>\n <td>Cerro Gordo POD</td>\n <td>31</td>\n <td>4.65</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>0.0000</td>\n </tr>\n <tr>\n <td>37</td>\n <td>Pottawattamie MACEDON</td>\n <td>9</td>\n <td>1.35</td>\n <td>3</td>\n <td>2</td>\n <td>1</td>\n <td>0.0000</td>\n </tr>\n </tbody>\n</table>\n</div>","text/plain":" name votes_align1 threshold results_align1 \\\n0 Clinton CL21 90 13.50 26 \n1 Linn TFAY 54 8.10 11 \n2 Linn TMAR 96 14.40 18 \n3 Linn HIA03 92 13.80 14 \n4 Lyon P2 11 1.65 2 \n5 Polk CLAY 1 72 10.80 12 \n6 Polk WDM-313 148 22.20 23 \n7 Tama YK 16 2.40 3 \n8 Mills EM 15 2.25 4 \n9 Scott MC 42 6.30 9 \n10 Keokuk AD 14 2.10 3 \n11 Keokuk SG1 20 3.00 4 \n12 Warren PM 33 4.95 5 \n13 Calhoun UNION 14 2.10 3 \n14 Clinton SHLN 21 3.15 4 \n15 Fayette JF 26 3.90 4 \n16 Fayette UN 16 2.40 4 \n17 Johnson HD 55 8.25 10 \n18 Johnson GR 54 8.10 9 \n19 Mahaska ED 11 1.65 2 \n20 Mahaska AD 11 1.65 2 \n21 Osceola HA 5 0.75 1 \n22 Crawford CO 24 3.60 5 \n23 Crawford SRK 20 3.00 3 \n24 Humboldt NL-EV 3 0.45 1 \n25 Appanoose CW 13 1.95 2 \n26 Muscatine OR 14 2.10 4 \n27 Muscatine PI 23 3.45 7 \n28 Van Buren ML 8 1.20 2 \n29 Van Buren SP 6 0.90 2 \n30 Winnebago FC 4 43 6.45 7 \n31 Washington WC 34 5.10 6 \n32 Buena Vista TRWG 21 3.15 5 \n33 Cerro Gordo MV 15 2.25 3 \n34 Cerro Gordo LCN 29 4.35 5 \n35 Cerro Gordo LK 22 3.30 4 \n36 Cerro Gordo POD 31 4.65 5 \n37 Pottawattamie MACEDON 9 1.35 3 \n\n results_alignfinal lost_voters results_SDE \n0 20 6 0.4429 \n1 0 11 0.0000 \n2 0 18 0.0000 \n3 0 14 0.0000 \n4 0 2 0.0000 \n5 0 12 0.0000 \n6 0 23 0.0000 \n7 0 3 0.0000 \n8 0 4 0.0000 \n9 0 9 0.0000 \n10 0 3 0.0000 \n11 0 4 0.0000 \n12 0 5 0.0000 \n13 0 3 0.0000 \n14 0 4 0.0000 \n15 0 4 0.0000 \n16 0 4 0.0000 \n17 0 10 0.0000 \n18 0 9 0.0000 \n19 0 2 0.0000 \n20 0 2 0.0000 \n21 0 1 0.0000 \n22 0 5 0.0000 \n23 0 3 0.0000 \n24 0 1 0.0000 \n25 0 2 0.0000 \n26 1 3 0.0000 \n27 0 7 0.0000 \n28 0 2 0.0000 \n29 0 2 0.0000 \n30 0 7 0.0000 \n31 0 6 0.0000 \n32 3 2 0.0000 \n33 0 3 0.0000 \n34 0 5 0.0000 \n35 1 3 0.0000 \n36 0 5 0.0000 \n37 2 1 0.0000 "},"execution_count":6,"metadata":{},"output_type":"execute_result"}],"source":["def f(row):\n"," is_viable = row['results_align1']['sandersb'] >= 0.15 * row['votes_align1']\n"," lost_voters = row['results_align1']['sandersb'] > row['results_alignfinal']['sandersb']\n"," bad_report = row['results_alignfinal']['sandersb'] == 0 and row['results']['sandersb'] != 0\n"," \n"," info = {\n"," 'name': row['name'],\n"," 'votes_align1': row['votes_align1'],\n"," 'threshold': row['votes_align1'] * 0.15,\n"," 'results_align1': row['results_align1']['sandersb'],\n"," 'results_alignfinal': row['results_alignfinal']['sandersb'],\n"," 'lost_voters': row['results_align1']['sandersb'] - row['results_alignfinal']['sandersb'],\n"," 'results_SDE': row['results']['sandersb']\n"," }\n","\n"," if is_viable and lost_voters and not bad_report:\n"," return info\n","\n"," #return is_viable and lost_voters\n","\n","data = list(precincts.apply(f, result_type='expand', axis=1))\n","data = [d for d in data if d != None]\n","stolen = pd.DataFrame(data)\n","print(len(stolen))\n","stolen\n",""]},{"cell_type":"markdown","metadata":{},"source":[" This gives us 45 precincts where Sanders voters are excluded from the final\n"," expression. In almost all of these precincts, he receives no votes in the\n"," final alignment, and is awarded no SDEs."]},{"cell_type":"markdown","metadata":{},"source":[" Errors can also be made in the assignment of SDEs.\n","\n"," Looking for problem precincts with these properties:\n"," * Sanders has final alignment equal to or greater than his initial alignment\n"," * Gets no delegates\n"," * And is viable (15%)"]},{"cell_type":"code","execution_count":7,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"46\n"}],"source":["def check(row):\n"," total_votes = max(row.votes_align1, row.votes_alignfinal)\n","\n"," alignment = row['results_alignfinal']['sandersb'] >= row['results_align1']['sandersb']\n"," no_SDE = row['results']['sandersb'] == 0\n"," viable = row['results_alignfinal']['sandersb'] > row['votes_alignfinal'] * .15\n"," \n"," return alignment and no_SDE and viable\n","\n","problems = precincts.apply(check, axis=1)\n","problems_df = precincts.loc[problems,:]\n","print(len(problems_df))\n",""]}],"nbformat":4,"nbformat_minor":2,"metadata":{"language_info":{"name":"python","codemirror_mode":{"name":"ipython","version":3}},"orig_nbformat":2,"file_extension":".py","mimetype":"text/x-python","name":"python","npconvert_exporter":"python","pygments_lexer":"ipython3","version":3}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment