├── .gitignore ├── 113_frame.csv ├── Blank_US_Map.svg ├── LICENSE.txt ├── NOTICE.txt ├── README.md ├── __init__.py ├── complete_frame.csv ├── config ├── __init__.py └── settings.py ├── crawler ├── crawler │ ├── __init__.py │ ├── items.py │ ├── pipelines.py │ ├── settings.py │ └── spiders │ │ ├── __init__.py │ │ └── scrape.py └── scrapy.cfg ├── formatters └── __init__.py ├── inputs ├── __init__.py └── inputs.py ├── make_matrix.py ├── manage.py ├── most_radical.png ├── most_radical.svg ├── polarization.eps ├── polarization.png ├── polarization.svg ├── requirements.txt ├── senate.eps ├── senate.png ├── senate.svg ├── senate_analyzer.R ├── tasks └── __init__.py ├── tests ├── __init__.py └── test_runner.py └── workflows └── __init__.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | 3 | # C extensions 4 | *.so 5 | 6 | # Packages 7 | *.egg 8 | *.egg-info 9 | dist 10 | build 11 | eggs 12 | parts 13 | bin 14 | !percept/bin 15 | var 16 | sdist 17 | develop-eggs 18 | .installed.cfg 19 | lib 20 | lib64 21 | 22 | # Installer logs 23 | pip-log.txt 24 | 25 | # Unit test / coverage reports 26 | .coverage 27 | .tox 28 | nosetests.xml 29 | 30 | # Translations 31 | *.mo 32 | 33 | # Mr Developer 34 | .mr.developer.cfg 35 | .project 36 | .pydevproject 37 | 38 | #pycharm 39 | .idea 40 | 41 | #percept 42 | percept.log 43 | stored_data 44 | data 45 | percept/docs/_build 46 | 47 | # R 48 | .Rhistory 49 | .Rapp.history 50 | 51 | .DS_Store 52 | 53 | -------------------------------------------------------------------------------- /113_frame.csv: -------------------------------------------------------------------------------- 1 | "","X.113.1.1.","X.113.1.2.","X.113.1.3.","X.113.1.4.","X.113.1.5.","X.113.1.6.","X.113.1.7.","X.113.1.8.","X.113.1.9.","X.113.1.10.","X.113.1.11.","X.113.1.12.","X.113.1.13.","X.113.1.14.","X.113.1.15.","X.113.1.16.","X.113.1.17.","X.113.1.18.","X.113.1.21.","X.113.1.22.","X.113.1.23.","X.113.1.24.","X.113.1.25.","X.113.1.28.","X.113.1.29.","X.113.1.30.","X.113.1.31.","X.113.1.32.","X.113.1.33.","X.113.1.34.","X.113.1.35.","X.113.1.36.","X.113.1.37.","X.113.1.38.","X.113.1.39.","X.113.1.40.","X.113.1.41.","X.113.1.42.","X.113.1.43.","X.113.1.44.","X.113.1.45.","X.113.1.46.","X.113.1.47.","X.113.1.48.","X.113.1.49.","X.113.1.50.","X.113.1.51.","X.113.1.52.","X.113.1.53.","X.113.1.54.","X.113.1.55.","X.113.1.56.","X.113.1.57.","X.113.1.58.","X.113.1.59.","X.113.1.60.","X.113.1.61.","X.113.1.62.","X.113.1.63.","X.113.1.64.","X.113.1.65.","X.113.1.66.","X.113.1.67.","X.113.1.68.","X.113.1.69.","X.113.1.70.","X.113.1.71.","X.113.1.72.","X.113.1.73.","X.113.1.74.","X.113.1.75.","X.113.1.76.","X.113.1.77.","X.113.1.78.","X.113.1.79.","X.113.1.80.","X.113.1.81.","X.113.1.82.","X.113.1.83.","X.113.1.84.","X.113.1.85.","X.113.1.86.","X.113.1.87.","X.113.1.88.","X.113.1.89.","X.113.1.90.","X.113.1.91.","X.113.1.92.","X.113.1.93.","X.113.1.94.","X.113.1.95.","X.113.1.96.","X.113.1.97.","X.113.1.98.","X.113.1.99.","X.113.1.100.","X.113.1.101.","X.113.1.102.","X.113.1.103.","X.113.1.104.","X.113.1.105.","X.113.1.106.","X.113.1.107.","X.113.1.108.","X.113.1.109.","X.113.1.110.","X.113.1.111.","X.113.1.112.","X.113.1.113.","X.113.1.114.","X.113.1.115.","X.113.1.116.","X.113.1.117.","X.113.1.118.","X.113.1.119.","X.113.1.120.","X.113.1.121.","X.113.1.122.","X.113.1.123.","X.113.1.124.","X.113.1.125.","X.113.1.126.","X.113.1.127.","X.113.1.128.","X.113.1.129.","X.113.1.130.","X.113.1.131.","X.113.1.132.","X.113.1.133.","X.113.1.134.","X.113.1.135.","X.113.1.136.","X.113.1.137.","X.113.1.138.","X.113.1.139.","X.113.1.140.","X.113.1.141.","X.113.1.142.","X.113.1.143.","X.113.1.144.","X.113.1.145.","X.113.1.146.","X.113.1.147.","X.113.1.148.","X.113.1.150.","X.113.1.151.","X.113.1.152.","X.113.1.153.","X.113.1.154.","X.113.1.155.","X.113.1.156.","X.113.1.157.","X.113.1.158.","X.113.1.159.","X.113.1.160.","X.113.1.161.","X.113.1.162.","X.113.1.163.","X.113.1.164.","X.113.1.169.","X.113.1.170.","X.113.1.172.","X.113.1.176.","X.113.1.180.","X.113.1.181.","X.113.1.182.","X.113.1.183.","X.113.1.184.","X.113.1.185.","X.113.1.186.","X.113.1.187.","X.113.1.188.","name","party","state" 2 | "Coons (D-DE)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Coons","D","DE" 3 | "McCain (R-AZ)",1,1,0,0,1,0,0,0,1,0,1,1,1,1,2,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,2,0,1,0,2,2,2,2,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,0,0,1,1,0,1,"McCain","R","AZ" 4 | "Chambliss (R-GA)",2,2,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,0,1,0,1,1,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,1,1,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,2,1,1,1,0,1,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,1,"Chambliss","R","GA" 5 | "Franken (D-MN)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Franken","D","MN" 6 | "Inhofe (R-OK)",1,1,0,0,0,0,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,0,1,1,1,2,2,2,1,1,1,0,1,0,2,2,1,0,1,0,0,0,0,0,0,2,2,2,2,0,0,1,1,1,0,0,1,0,0,0,2,0,0,0,0,1,1,0,0,1,1,0,1,"Inhofe","R","OK" 7 | "Johnson (D-SD)",0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,2,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Johnson","D","SD" 8 | "Tester (D-MT)",1,1,0,1,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Tester","D","MT" 9 | "Carper (D-DE)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,"Carper","D","DE" 10 | "Schumer (D-NY)",0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Schumer","D","NY" 11 | "Gillibrand (D-NY)",2,2,0,1,1,1,1,1,1,1,1,1,0,0,2,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Gillibrand","D","NY" 12 | "Fischer (R-NE)",0,1,1,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,1,1,0,0,1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,1,0,1,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,1,"Fischer","R","NE" 13 | "Bennet (D-CO)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Bennet","D","CO" 14 | "Barrasso (R-WY)",1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,0,0,0,0,1,0,1,2,1,0,1,0,0,1,0,1,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,1,"Barrasso","R","WY" 15 | "Shaheen (D-NH)",0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,0,1,1,1,1,2,1,1,0,0,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,"Shaheen","D","NH" 16 | "Boozman (R-AR)",1,1,1,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,0,1,0,0,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,0,1,0,1,1,0,0,1,1,0,1,"Boozman","R","AR" 17 | "Kirk (R-IL)",1,1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,0,0,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,1,0,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,0,1,"Kirk","R","IL" 18 | "Nelson (D-FL)",0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,2,2,2,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Nelson","D","FL" 19 | "Cornyn (R-TX)",0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,0,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,2,2,2,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,0,0,1,0,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,1,"Cornyn","R","TX" 20 | "Klobuchar (D-MN)",2,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,2,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Klobuchar","D","MN" 21 | "Flake (R-AZ)",1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,2,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,2,0,0,0,1,0,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,2,2,2,2,2,0,0,1,0,0,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,2,2,1,0,1,1,1,0,0,1,1,0,1,"Flake","R","AZ" 22 | "Johanns (R-NE)",1,1,1,0,1,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,2,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,1,"Johanns","R","NE" 23 | "Moran (R-KS)",1,1,1,0,1,0,0,0,0,0,0,2,0,2,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,2,1,1,1,1,1,2,2,0,1,0,1,1,1,0,1,1,0,1,0,1,2,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,0,1,0,2,1,0,0,1,2,2,1,"Moran","R","KS" 24 | "Grassley (R-IA)",1,1,1,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,0,0,1,0,1,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,1,0,1,"Grassley","R","IA" 25 | "Markey (D-MA)",3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,0,1,1,1,"Markey","D","MA" 26 | "Schatz (D-HI)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Schatz","D","HI" 27 | "Risch (R-ID)",1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,0,0,1,0,1,1,1,0,1,2,0,1,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,2,2,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,1,"Risch","R","ID" 28 | "Casey (D-PA)",2,2,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,0,1,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,2,2,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Casey","D","PA" 29 | "Enzi (R-WY)",1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,2,1,1,1,0,1,1,0,1,0,2,1,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,1,"Enzi","R","WY" 30 | "Wicker (R-MS)",1,1,0,1,1,0,0,0,1,0,1,1,1,2,1,1,1,1,0,1,0,0,0,1,0,0,0,0,2,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,2,1,1,0,1,1,1,1,1,1,0,0,0,1,0,1,1,2,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,0,2,2,2,2,0,0,1,1,1,0,1,1,0,1,0,1,0,1,1,2,1,1,0,0,1,1,0,1,"Wicker","R","MS" 31 | "King (I-ME)",1,1,2,2,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,1,0,1,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,0,0,1,1,1,1,"King","I","ME" 32 | "Baldwin (D-WI)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Baldwin","D","WI" 33 | "Wyden (D-OR)",3,3,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,3,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,1,1,1,1,1,0,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,3,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,"Wyden","D","OR" 34 | "Begich (D-AK)",1,1,0,1,1,1,1,1,1,1,1,2,0,0,1,1,0,0,1,1,1,1,2,2,2,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,0,1,1,1,1,0,1,2,2,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,"Begich","D","AK" 35 | "Roberts (R-KS)",1,1,1,0,1,0,0,0,0,0,0,0,1,2,1,1,1,1,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,"Roberts","R","KS" 36 | "Burr (R-NC)",1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,1,2,1,1,1,1,0,2,1,0,1,0,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,"Burr","R","NC" 37 | "Heinrich (D-NM)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,2,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Heinrich","D","NM" 38 | "Hirono (D-HI)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,2,1,"Hirono","D","HI" 39 | "Pryor (D-AR)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,1,1,1,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,2,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,"Pryor","D","AR" 40 | "Leahy (D-VT)",0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Leahy","D","VT" 41 | "Ayotte (R-NH)",1,1,0,0,1,0,0,0,1,0,1,1,0,1,1,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,2,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,1,0,0,1,1,0,1,"Ayotte","R","NH" 42 | "Stabenow (D-MI)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Stabenow","D","MI" 43 | "Mikulski (D-MD)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,2,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Mikulski","D","MD" 44 | "Heller (R-NV)",1,1,1,1,1,0,0,0,0,0,1,1,1,2,1,1,1,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,2,1,1,0,1,1,0,0,0,1,1,1,1,1,0,1,1,1,0,1,1,2,2,0,0,1,0,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,1,0,0,1,1,0,1,"Heller","R","NV" 45 | "Hagan (D-NC)",1,1,0,1,1,1,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Hagan","D","NC" 46 | "Durbin (D-IL)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Durbin","D","IL" 47 | "Merkley (D-OR)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,2,1,1,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,"Merkley","D","OR" 48 | "Udall (D-CO)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,2,2,1,2,2,2,2,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,1,1,0,1,2,2,1,1,1,1,0,0,1,1,1,0,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Udall","D","CO" 49 | "Manchin (D-WV)",1,1,0,1,1,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,2,0,1,0,1,1,0,0,1,1,1,1,0,1,1,0,0,0,1,0,0,1,0,1,0,1,0,1,1,0,1,1,1,1,0,0,1,0,1,1,1,0,1,0,1,0,1,0,0,1,0,0,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,0,0,2,2,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,"Manchin","D","WV" 50 | "Hoeven (R-ND)",1,1,1,1,2,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,0,0,1,1,2,0,1,0,1,0,1,0,1,1,1,1,2,1,1,0,1,1,0,1,0,1,1,1,0,1,1,0,1,0,1,1,2,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,0,1,"Hoeven","R","ND" 51 | "Blunt (R-MO)",1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,1,0,1,0,1,2,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,1,2,2,2,1,0,0,1,0,1,1,0,0,1,1,0,1,"Blunt","R","MO" 52 | "Collins (R-ME)",1,1,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,1,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,"Collins","R","ME" 53 | "Toomey (R-PA)",1,1,1,0,1,0,0,0,1,0,0,2,1,1,1,1,1,1,0,1,0,0,1,1,1,0,1,0,2,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,0,0,0,0,0,0,1,1,0,2,1,1,1,0,0,1,1,1,0,0,1,0,0,0,2,0,0,0,0,1,1,0,0,1,1,0,1,"Toomey","R","PA" 54 | "Alexander (R-TN)",3,3,1,1,1,0,0,0,1,0,0,1,1,2,1,1,2,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,3,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,1,0,1,1,2,1,1,0,1,3,1,0,1,0,1,2,1,1,1,0,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,1,0,0,1,1,0,1,"Alexander","R","TN" 55 | "Whitehouse (D-RI)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,2,2,2,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Whitehouse","D","RI" 56 | "Cantwell (D-WA)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,"Cantwell","D","WA" 57 | "Scott (R-SC)",0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,1,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,1,1,2,1,1,0,1,1,1,0,1,0,1,1,0,1,1,0,2,0,0,0,0,1,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,"Scott","R","SC" 58 | "Cochran (R-MS)",1,1,0,1,1,0,0,0,1,0,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,1,0,0,2,2,2,2,0,0,1,1,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,0,1,1,1,1,"Cochran","R","MS" 59 | "Coats (R-IN)",2,2,1,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,1,2,1,0,1,1,1,1,0,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,2,2,2,0,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,1,0,0,0,2,2,1,1,0,0,1,0,0,1,1,0,1,"Coats","R","IN" 60 | "Cruz (R-TX)",1,1,1,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,0,1,0,0,0,1,1,0,1,0,1,1,0,0,1,0,1,1,1,0,0,0,0,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,2,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,1,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,1,0,1,0,0,1,0,0,0,2,0,0,0,0,0,1,0,0,1,1,0,1,"Cruz","R","TX" 61 | "Warren (D-MA)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,1,0,1,0,1,0,1,2,2,2,1,2,2,2,1,1,1,1,0,1,1,1,0,1,0,0,2,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Warren","D","MA" 62 | "Thune (R-SD)",0,1,1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,0,1,0,1,1,0,0,1,1,0,1,"Thune","R","SD" 63 | "Shelby (R-AL)",1,1,0,1,1,0,0,0,0,0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,2,2,2,2,0,0,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,1,"Shelby","R","AL" 64 | "Coburn (R-OK)",1,1,1,0,1,0,0,0,1,0,0,1,2,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,2,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,1,2,1,2,2,2,1,1,1,0,1,0,1,1,0,0,1,0,0,0,2,1,0,2,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,"Coburn","R","OK" 65 | "Hatch (R-UT)",1,1,0,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,NA,1,1,0,1,1,0,2,1,1,1,1,0,0,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,1,0,0,1,1,0,0,1,1,0,1,"Hatch","R","UT" 66 | "Portman (R-OH)",1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,2,1,1,0,1,0,1,1,1,0,1,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,0,1,1,0,1,"Portman","R","OH" 67 | "Lee (R-UT)",1,1,1,0,1,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,0,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,2,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,1,0,2,2,2,2,2,1,0,0,0,0,0,1,0,0,0,1,0,1,"Lee","R","UT" 68 | "Johnson (R-WI)",1,1,1,0,1,0,0,0,1,0,0,1,1,2,0,1,1,1,0,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,2,1,1,1,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,2,0,1,0,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,1,"Johnson","R","WI" 69 | "Blumenthal (D-CT)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,2,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Blumenthal","D","CT" 70 | "Cardin (D-MD)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,2,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Cardin","D","MD" 71 | "Reid (D-NV)",0,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,0,2,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Reid","D","NV" 72 | "Baucus (D-MT)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Baucus","D","MT" 73 | "Landrieu (D-LA)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,2,0,1,1,0,1,0,0,0,1,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,2,1,0,0,0,2,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Landrieu","D","LA" 74 | "Reed (D-RI)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,2,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Reed","D","RI" 75 | "Murphy (D-CT)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,2,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Murphy","D","CT" 76 | "Udall (D-NM)",0,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Udall","D","NM" 77 | "Menendez (D-NJ)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,"Menendez","D","NJ" 78 | "Corker (R-TN)",1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,1,0,1,2,1,1,1,1,1,0,0,1,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,0,1,"Corker","R","TN" 79 | "Brown (D-OH)",2,2,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,2,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,2,1,1,1,1,1,0,0,1,1,1,0,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Brown","D","OH" 80 | "Feinstein (D-CA)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,2,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Feinstein","D","CA" 81 | "Sessions (R-AL)",1,1,1,0,1,0,0,0,0,0,0,2,1,1,0,1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,2,0,1,0,0,0,0,0,0,1,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,"Sessions","R","AL" 82 | "Heitkamp (D-ND)",0,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,1,0,1,1,1,2,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,2,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,0,1,1,1,2,"Heitkamp","D","ND" 83 | "Vitter (R-LA)",1,1,1,1,1,0,0,0,0,0,0,2,1,2,1,1,1,1,2,1,0,0,0,2,1,2,2,2,2,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,1,1,2,2,1,0,1,1,0,0,1,0,1,2,2,1,1,0,2,1,0,0,0,2,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,"Vitter","R","LA" 84 | "Donnelly (D-IN)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,"Donnelly","D","IN" 85 | "Isakson (R-GA)",1,1,1,0,1,0,0,0,1,0,0,2,1,1,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,1,0,1,0,1,1,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,0,0,1,0,1,1,0,0,1,1,0,1,"Isakson","R","GA" 86 | "McCaskill (D-MO)",1,1,0,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,2,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,1,2,2,2,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,"McCaskill","D","MO" 87 | "Warner (D-VA)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0,0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1,0,1,2,2,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Warner","D","VA" 88 | "Harkin (D-IA)",0,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,2,1,1,1,1,0,1,1,1,2,0,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,2,2,2,2,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,"Harkin","D","IA" 89 | "Graham (R-SC)",1,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,1,0,0,1,2,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,2,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,1,1,0,0,1,0,1,1,1,1,1,0,2,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,2,2,1,1,0,0,1,0,0,1,1,0,1,"Graham","R","SC" 90 | "Rubio (R-FL)",0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,1,0,0,1,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,1,1,1,1,2,0,2,0,0,0,1,0,0,1,1,0,2,"Rubio","R","FL" 91 | "Kaine (D-VA)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,2,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,"Kaine","D","VA" 92 | "Boxer (D-CA)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,2,2,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,2,2,1,1,1,2,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,2,2,2,2,2,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Boxer","D","CA" 93 | "Murray (D-WA)",1,1,2,2,2,2,2,2,2,2,2,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,2,2,2,2,2,2,1,1,1,1,1,0,1,2,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,"Murray","D","WA" 94 | "Crapo (R-ID)",0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,1,1,1,0,2,0,0,0,1,1,2,0,0,1,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,2,1,0,1,0,0,1,0,1,1,1,0,1,1,0,1,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,"Crapo","R","ID" 95 | "Rockefeller (D-WV)",0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,2,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,2,1,1,1,1,1,1,2,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,2,1,1,1,1,1,1,1,1,2,1,1,0,1,1,1,1,1,1,"Rockefeller","D","WV" 96 | "Murkowski (R-AK)",1,1,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,1,2,1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,1,0,0,1,0,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,2,1,1,0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,0,2,0,1,0,1,1,1,1,1,2,1,1,0,2,2,2,1,1,2,0,0,1,1,1,0,1,1,0,1,1,1,1,1,2,0,1,1,0,1,1,0,0,1,1,1,2,"Murkowski","R","AK" 97 | "Sanders (I-VT)",1,1,2,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,0,1,1,0,1,2,1,1,1,1,1,0,0,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,"Sanders","I","VT" 98 | "Paul (R-KY)",1,1,1,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,2,0,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,1,2,0,1,0,1,1,1,0,1,0,1,1,0,0,0,0,2,2,1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,0,"Paul","R","KY" 99 | "Chiesa (R-NJ)",3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,1,1,1,0,1,1,1,1,2,2,2,2,2,0,1,1,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,2,"Chiesa","R","NJ" 100 | "McConnell (R-KY)",1,1,1,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,0,0,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,1,0,1,"McConnell","R","KY" 101 | "Levin (D-MI)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,0,0,1,2,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,"Levin","D","MI" 102 | "Kerry (D-MA)",1,1,0,1,NA,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,"Kerry","D","MA" 103 | "Lautenberg (D-NJ)",1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,1,0,1,0,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,0,1,2,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,"Lautenberg","D","NJ" 104 | "Cowan (D-MA)",3,3,3,3,3,3,3,3,3,3,3,3,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,2,2,2,1,2,2,2,1,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,"Cowan","D","MA" 105 | -------------------------------------------------------------------------------- /Blank_US_Map.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS -------------------------------------------------------------------------------- /NOTICE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2013 Vik Paruchuri 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Political Positions 2 | ==================== 3 | 4 | Overview 5 | --------------------- 6 | This repository is used for analysis of senate and other vote data. 7 | 8 | This is licensed under the APACHE license, please see LICENSE.txt for details. 9 | 10 | Installation 11 | --------------------- 12 | You will need to have python 2.7 installed, and ideally a virtualenv installed. 13 | 14 | Then, you can do the following: 15 | 16 | ``` 17 | git clone git@github.com:VikParuchuri/political-positions 18 | cd political-positions 19 | Activate virtualenv if you are using one 20 | pip install -r requirements.txt 21 | ``` 22 | 23 | Usage 24 | --------------------------- 25 | 26 | After installing the requirements, you can do: 27 | 28 | ``` 29 | cd political-positions/crawler 30 | scrapy crawl senate -o ../data/senate.json -t json 31 | ``` 32 | 33 | This will crawl the senate website and download voting data on senators. 34 | 35 | Open and run the code in the `make_matrix.py` file to generate a csv from the json file. 36 | 37 | Then, you can open the `senate_analyzer.R` script and run it to produce charts. 38 | 39 | How to Contribute 40 | ----------------- 41 | Contributions are very welcome. The easiest way is to fork this repo, and then 42 | make a pull request from your fork. 43 | 44 | Please contact vik dot paruchuri at gmail with any questions or issues. 45 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | __import__("pkg_resources").declare_namespace(__name__) -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /config/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Settings for political-positions 3 | """ 4 | 5 | from path import path 6 | import os 7 | import sys 8 | 9 | #Various paths 10 | PROJECT_PATH = path(__file__).dirname().dirname() 11 | 12 | #Where to cache values during the run 13 | CACHE = "percept.fields.caches.MemoryCache" 14 | #Do we use json to serialize the values in in the cache? 15 | SERIALIZE_CACHE_VALUES = False 16 | 17 | #How to run the workflows 18 | RUNNER = "percept.workflows.runners.SingleThreadedRunner" 19 | 20 | #What to use as a datastore 21 | DATASTORE = "percept.workflows.datastores.FileStore" 22 | 23 | #Namespace to give the modules in the registry 24 | NAMESPACE = "political-positions" 25 | 26 | #What severity of error to log to file and console. One of "DEBUG", "WARN", "INFO", "ERROR" 27 | LOG_LEVEL = "DEBUG" 28 | 29 | #Used to save and retrieve workflows and other data 30 | DATA_PATH = os.path.abspath(os.path.join(PROJECT_PATH, "stored_data")) 31 | if not os.path.exists(DATA_PATH): 32 | os.makedirs(DATA_PATH) 33 | 34 | #Commands are discovered here, and tasks/inputs/formats are imported using only these modules 35 | INSTALLED_APPS = [ 36 | 'political-positions.inputs', 37 | 'political-positions.formatters', 38 | 'political-positions.tasks', 39 | 'political-positions.workflows' 40 | ] -------------------------------------------------------------------------------- /crawler/crawler/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/crawler/crawler/__init__.py -------------------------------------------------------------------------------- /crawler/crawler/items.py: -------------------------------------------------------------------------------- 1 | # Define here the models for your scraped items 2 | # 3 | # See documentation in: 4 | # http://doc.scrapy.org/topics/items.html 5 | 6 | from scrapy.item import Item, Field 7 | 8 | class CrawlerItem(Item): 9 | # define the fields for your item here like: 10 | # name = Field() 11 | pass 12 | -------------------------------------------------------------------------------- /crawler/crawler/pipelines.py: -------------------------------------------------------------------------------- 1 | # Define your item pipelines here 2 | # 3 | # Don't forget to add your pipeline to the ITEM_PIPELINES setting 4 | # See: http://doc.scrapy.org/topics/item-pipeline.html 5 | 6 | class CrawlerPipeline(object): 7 | def process_item(self, item, spider): 8 | return item 9 | -------------------------------------------------------------------------------- /crawler/crawler/settings.py: -------------------------------------------------------------------------------- 1 | # Scrapy settings for crawler project 2 | # 3 | # For simplicity, this file contains only the most important settings by 4 | # default. All the other settings are documented here: 5 | # 6 | # http://doc.scrapy.org/topics/settings.html 7 | # 8 | 9 | BOT_NAME = 'crawler' 10 | 11 | SPIDER_MODULES = ['crawler.spiders'] 12 | NEWSPIDER_MODULE = 'crawler.spiders' 13 | 14 | # Crawl responsibly by identifying yourself (and your website) on the user-agent 15 | #USER_AGENT = 'crawler (+http://www.yourdomain.com)' 16 | -------------------------------------------------------------------------------- /crawler/crawler/spiders/__init__.py: -------------------------------------------------------------------------------- 1 | # This package will contain the spiders of your Scrapy project 2 | # 3 | # Please refer to the documentation for information on how to create and manage 4 | # your spiders. 5 | -------------------------------------------------------------------------------- /crawler/crawler/spiders/scrape.py: -------------------------------------------------------------------------------- 1 | from scrapy.contrib.spiders import CrawlSpider, Rule 2 | from scrapy.spider import BaseSpider 3 | from scrapy.selector import HtmlXPathSelector 4 | from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 5 | from scrapy.selector import HtmlXPathSelector 6 | from scrapy.item import Item, Field 7 | from scrapy.http import Request 8 | import re 9 | import os 10 | import requests 11 | import logging 12 | log = logging.getLogger(__name__) 13 | 14 | class Vote(Item): 15 | url = Field() 16 | congress = Field() 17 | name = Field() 18 | number = Field() 19 | time = Field() 20 | description = Field() 21 | yes_count = Field() 22 | no_count = Field() 23 | abstain_count = Field() 24 | session = Field() 25 | data = Field() 26 | 27 | class SenateSpider(CrawlSpider): 28 | name = "senate" 29 | allowed_domains = ['www.senate.gov', 'senate.gov'] 30 | start_urls = ["http://www.senate.gov/pagelayout/legislative/a_three_sections_with_teasers/votes.htm"] 31 | rules = [ 32 | Rule(SgmlLinkExtractor(allow=["/legislative/LIS/roll_call_lists/vote_menu_\d+_\d+.htm"])), 33 | Rule(SgmlLinkExtractor(allow=["/legislative/LIS/roll_call_lists/roll_call_vote_cfm.cfm\?congress=\d+\&session=\d+\&vote=\d+"]), 'parse_senate') 34 | ] 35 | 36 | def parse_links(self, response): 37 | x = HtmlXPathSelector(response) 38 | urls = x.select('//td[@class="contenttext"]/a/@href').extract() 39 | requests = [] 40 | for url in urls: 41 | requests.append(Request(url="http://www.senate.gov" + url)) 42 | return requests 43 | 44 | def parse_senate(self, response): 45 | url = response.url 46 | x = HtmlXPathSelector(response) 47 | content = x.select('//tr/td[@class="contenttext"]/text()').extract() 48 | congress = re.findall("\d+",url)[0] 49 | session = re.findall("\d+",url)[1] 50 | name = content[3] 51 | number = re.findall("\d+",url)[2] 52 | time = content[5] 53 | description = content[9] 54 | yes_count = content[11] 55 | no_count = content[13] 56 | abstain_count = content[15] 57 | 58 | yes_nof = x.select('//tr/td[@class="contenttext"]/b/text()').extract() 59 | yes_no = [] 60 | for i in xrange(8,len(yes_nof)): 61 | if yes_nof[i]=="YEAs ---": 62 | break 63 | yes_no.append(yes_nof[i]) 64 | sens = [] 65 | for i in xrange(16,len(content)): 66 | if content[i]=="\n ": 67 | sens.append(content[i-1]) 68 | 69 | syn = {sens[i] : yes_no[i] for i in xrange(0,len(yes_no))} 70 | 71 | vote = Vote() 72 | vote['congress'] = congress 73 | vote['name'] = name 74 | vote['number'] = number 75 | vote['time'] = time 76 | vote['description'] = description 77 | vote['yes_count'] = yes_count 78 | vote['no_count'] = no_count 79 | vote['abstain_count'] = abstain_count 80 | vote['data'] = syn 81 | vote['session'] = session 82 | 83 | return vote -------------------------------------------------------------------------------- /crawler/scrapy.cfg: -------------------------------------------------------------------------------- 1 | # Automatically created by: scrapy startproject 2 | # 3 | # For more information about the [deploy] section see: 4 | # http://doc.scrapy.org/topics/scrapyd.html 5 | 6 | [settings] 7 | default = crawler.settings 8 | 9 | [deploy] 10 | #url = http://localhost:6800/ 11 | project = crawler 12 | -------------------------------------------------------------------------------- /formatters/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/formatters/__init__.py -------------------------------------------------------------------------------- /inputs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/inputs/__init__.py -------------------------------------------------------------------------------- /inputs/inputs.py: -------------------------------------------------------------------------------- 1 | from __future__ import division 2 | import csv 3 | from percept.conf.base import settings 4 | from percept.utils.input import DataFormats 5 | from percept.tests.framework import CSVInputTester 6 | from percept.datahandlers.inputs import BaseInput 7 | from percept.utils.models import get_namespace 8 | import os 9 | from itertools import chain 10 | import logging 11 | import json 12 | import re 13 | import pandas as pd 14 | import subprocess 15 | from pandas.io import sql 16 | import sqlite3 17 | import json 18 | import requests 19 | import subprocess 20 | 21 | log = logging.getLogger(__name__) 22 | 23 | def join_path(p1,p2): 24 | return os.path.abspath(os.path.join(p1,p2)) 25 | 26 | class SenateFormats(DataFormats): 27 | sjson = "sjson" 28 | 29 | class SenateInput(BaseInput): 30 | """ 31 | Extends baseinput to read simpsons scripts 32 | """ 33 | input_format = SenateFormats.mjson 34 | help_text = "Read in music links data." 35 | namespace = get_namespace(__module__) 36 | 37 | def read_input(self, mfile, has_header=True): 38 | """ 39 | directory is a path to a directory with multiple csv files 40 | """ 41 | 42 | mjson= json.load(open(mfile)) 43 | for m in mjson: 44 | m['ltype'] = m['ltype'].split("?")[0] 45 | ltypes = list(set([m['ltype'] for m in mjson])) 46 | for l in ltypes: 47 | jp = join_path(settings.MUSIC_PATH,l) 48 | if not os.path.isdir(jp): 49 | os.mkdir(jp) 50 | 51 | fpaths = [] 52 | for m in mjson: 53 | fname = m['link'].split("/")[-1] 54 | fpath = join_path(join_path(settings.MUSIC_PATH,m['ltype']),fname) 55 | try: 56 | if not os.path.isfile(fpath): 57 | r = requests.get(m['link']) 58 | f = open(fpath, 'wb') 59 | f.write(r.content) 60 | f.close() 61 | fpaths.append({'type' : m['ltype'], 'path' : fpath}) 62 | except Exception: 63 | log.exception("Could not get music file.") 64 | 65 | for p in fpaths: 66 | newfile = p['path'][:-4] + ".ogg" 67 | if not os.path.isfile(newfile): 68 | frommp3 = subprocess.Popen(['mpg123', '-w', '-', p['path']], stdout=subprocess.PIPE) 69 | toogg = subprocess.Popen(['oggenc', '-'], stdin=frommp3.stdout, stdout=subprocess.PIPE) 70 | with open(newfile, 'wb') as outfile: 71 | while True: 72 | data = toogg.stdout.read(1024 * 100) 73 | if not data: 74 | break 75 | outfile.write(data) 76 | p['newpath'] = newfile 77 | 78 | self.data = fpaths -------------------------------------------------------------------------------- /make_matrix.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | CONGRESS_NUM = "114" 4 | with open("data/senate.json") as f: 5 | senate = json.load(f) 6 | 7 | votes = [v for v in senate if v["congress"] == CONGRESS_NUM] 8 | 9 | senators = {} 10 | bills = [] 11 | senator_names = [] 12 | for v in votes: 13 | number = v["number"] 14 | for k, v in v["data"].items(): 15 | if k not in senators: 16 | senators[k] = {} 17 | senators[k][number] = v 18 | bills.append(number) 19 | senator_names.append(k) 20 | 21 | bills = sorted(list(set(bills))) 22 | senator_names = sorted(list(set(senator_names))) 23 | 24 | vote_matrix = [["Name", "Party", "State"] + bills] 25 | for s in senator_names: 26 | data = s.replace(", ", "") 27 | name, info = data.split(" ") 28 | info = info.replace("(", "") 29 | info = info.replace(")", "") 30 | party, state = info.split("-") 31 | row = [name, party, state] 32 | for b in bills: 33 | vote = senators[s][b] 34 | code = "2" 35 | if vote == "Yea": 36 | code = "1" 37 | elif vote == "Nay": 38 | code = "0" 39 | row.append(code) 40 | vote_matrix.append(row) 41 | 42 | rows = [",".join(v) for v in vote_matrix] 43 | write_data = "\n".join(rows) 44 | with open("data/{0}_data.csv".format(CONGRESS_NUM), "w+") as f: 45 | f.write(write_data) 46 | 47 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from percept.management.base import execute_from_command_line 3 | 4 | if __name__ == "__main__": 5 | execute_from_command_line() -------------------------------------------------------------------------------- /most_radical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/most_radical.png -------------------------------------------------------------------------------- /most_radical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 41 | 43 | 44 | 46 | image/svg+xml 47 | 49 | 50 | 51 | 52 | 53 | 57 | 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Kerry (MA) Markey (MA) Chiesa (NJ) Lautenberg (NJ) Cowan (MA) Cruz (TX) Scott (SC) Roberts (KS) Inhofe (OK) Barrasso (WY) Johnson (WI) Lee (UT) 385 | 391 | 397 | 403 | 419 | 426 | 432 | 438 | 444 | 450 | 456 | 462 | The Most Extreme Senators in the 113th Congress Extremity measured by difference between the "typical" vote and the vote of the given senator.Originally on vikparuchuri.com 493 | 494 | -------------------------------------------------------------------------------- /polarization.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%DocumentNeededResources: font Helvetica 3 | %%+ font Helvetica-Bold 4 | %%+ font Helvetica-Oblique 5 | %%+ font Helvetica-BoldOblique 6 | %%+ font Symbol 7 | %%Title: R Graphics Output 8 | %%Creator: R Software 9 | %%Pages: (atend) 10 | %%BoundingBox: 0 0 750 884 11 | %%EndComments 12 | %%BeginProlog 13 | /bp { gs sRGB gs } def 14 | % begin .ps.prolog 15 | /gs { gsave } bind def 16 | /gr { grestore } bind def 17 | /ep { showpage gr gr } bind def 18 | /m { moveto } bind def 19 | /l { rlineto } bind def 20 | /np { newpath } bind def 21 | /cp { closepath } bind def 22 | /f { fill } bind def 23 | /o { stroke } bind def 24 | /c { newpath 0 360 arc } bind def 25 | /r { 4 2 roll moveto 1 copy 3 -1 roll exch 0 exch rlineto 0 rlineto -1 mul 0 exch rlineto closepath } bind def 26 | /p1 { stroke } bind def 27 | /p2 { gsave bg fill grestore newpath } bind def 28 | /p3 { gsave bg fill grestore stroke } bind def 29 | /p6 { gsave bg eofill grestore newpath } bind def 30 | /p7 { gsave bg eofill grestore stroke } bind def 31 | /t { 5 -2 roll moveto gsave rotate 32 | 1 index stringwidth pop 33 | mul neg 0 rmoveto show grestore } bind def 34 | /ta { 4 -2 roll moveto gsave rotate show } bind def 35 | /tb { 2 -1 roll 0 rmoveto show } bind def 36 | /cl { grestore gsave newpath 3 index 3 index moveto 1 index 37 | 4 -1 roll lineto exch 1 index lineto lineto 38 | closepath clip newpath } bind def 39 | /rgb { setrgbcolor } bind def 40 | /s { scalefont setfont } bind def 41 | % end .ps.prolog 42 | /sRGB { [ /CIEBasedABC 43 | << /DecodeLMN 44 | [ { dup 0.03928 le 45 | {12.92321 div} 46 | {0.055 add 1.055 div 2.4 exp } 47 | ifelse 48 | } bind dup dup 49 | ] 50 | /MatrixLMN [0.412457 0.212673 0.019334 51 | 0.357576 0.715152 0.119192 52 | 0.180437 0.072175 0.950301] 53 | /WhitePoint [0.9505 1.0 1.0890] 54 | >> 55 | ] setcolorspace } bind def 56 | /srgb { setcolor } bind def 57 | %%IncludeResource: font Helvetica 58 | /Helvetica findfont 59 | dup length dict begin 60 | {1 index /FID ne {def} {pop pop} ifelse} forall 61 | /Encoding ISOLatin1Encoding def 62 | currentdict 63 | end 64 | /Font1 exch definefont pop 65 | %%IncludeResource: font Helvetica-Bold 66 | /Helvetica-Bold findfont 67 | dup length dict begin 68 | {1 index /FID ne {def} {pop pop} ifelse} forall 69 | /Encoding ISOLatin1Encoding def 70 | currentdict 71 | end 72 | /Font2 exch definefont pop 73 | %%IncludeResource: font Helvetica-Oblique 74 | /Helvetica-Oblique findfont 75 | dup length dict begin 76 | {1 index /FID ne {def} {pop pop} ifelse} forall 77 | /Encoding ISOLatin1Encoding def 78 | currentdict 79 | end 80 | /Font3 exch definefont pop 81 | %%IncludeResource: font Helvetica-BoldOblique 82 | /Helvetica-BoldOblique findfont 83 | dup length dict begin 84 | {1 index /FID ne {def} {pop pop} ifelse} forall 85 | /Encoding ISOLatin1Encoding def 86 | currentdict 87 | end 88 | /Font4 exch definefont pop 89 | %%IncludeResource: font Symbol 90 | /Symbol findfont 91 | dup length dict begin 92 | {1 index /FID ne {def} {pop pop} ifelse} forall 93 | currentdict 94 | end 95 | /Font5 exch definefont pop 96 | %%EndProlog 97 | %%Page: 1 1 98 | bp 99 | 0.00 0.00 750.00 884.25 cl 100 | 0.00 0.00 750.00 884.25 cl 101 | /bg { 1 1 1 srgb } def 102 | 1 1 1 srgb 103 | 1.06 setlinewidth 104 | [] 0 setdash 105 | 1 setlinecap 106 | 1 setlinejoin 107 | 10.00 setmiterlimit 108 | 0.00 0.00 750.00 884.25 r p3 109 | 0.00 0.00 750.00 884.25 cl 110 | 0.00 0.00 750.00 884.25 cl 111 | 0.00 0.00 750.00 884.25 cl 112 | 40.95 28.67 671.03 869.85 cl 113 | /bg { 0.8980 0.8980 0.8980 srgb } def 114 | 40.95 28.67 630.08 841.18 r p2 115 | 0.9725 0.4627 0.4275 srgb 116 | 1.06 setlinewidth 117 | [] 0 setdash 118 | 0 setlinecap 119 | 1 setlinejoin 120 | 1.00 setmiterlimit 121 | np 122 | 69.59 340.78 m 123 | 47.73 26.86 l 124 | 47.73 -216.15 l 125 | 47.74 371.10 l 126 | 47.73 309.02 l 127 | 47.73 -351.16 l 128 | 47.74 -324.68 l 129 | 47.73 597.30 l 130 | 47.73 -21.66 l 131 | 47.74 -425.04 l 132 | 47.73 124.44 l 133 | 47.74 -219.07 l 134 | 47.73 153.88 l 135 | o 136 | 0 0.7490 0.7686 srgb 137 | np 138 | 69.59 369.55 m 139 | 47.73 198.29 l 140 | 47.73 3.42 l 141 | 47.74 -266.88 l 142 | 47.73 223.50 l 143 | 47.73 -255.43 l 144 | 47.74 63.40 l 145 | 47.73 -176.70 l 146 | 47.73 -92.25 l 147 | 47.74 668.44 l 148 | 47.73 -46.05 l 149 | 47.74 -157.99 l 150 | 47.73 -59.28 l 151 | o 152 | 0.00 0.00 750.00 884.25 cl 153 | 0.00 0.00 750.00 884.25 cl 154 | 0.00 0.00 750.00 884.25 cl 155 | /Font1 findfont 10 s 156 | 0.4980 0.4980 0.4980 srgb 157 | 33.86 105.17 (0.12) 1 0 t 158 | 33.86 380.79 (0.14) 1 0 t 159 | 33.86 656.41 (0.16) 1 0 t 160 | 0.00 0.00 750.00 884.25 cl 161 | 0.00 0.00 750.00 884.25 cl 162 | 0.4980 0.4980 0.4980 srgb 163 | 1.06 setlinewidth 164 | [] 0 setdash 165 | 0 setlinecap 166 | 1 setlinejoin 167 | 10.00 setmiterlimit 168 | np 169 | 36.69 108.76 m 170 | 4.26 0 l 171 | o 172 | np 173 | 36.69 384.38 m 174 | 4.26 0 l 175 | o 176 | np 177 | 36.69 660.00 m 178 | 4.26 0 l 179 | o 180 | 0.00 0.00 750.00 884.25 cl 181 | 0.00 0.00 750.00 884.25 cl 182 | 0.00 0.00 750.00 884.25 cl 183 | 0.00 0.00 750.00 884.25 cl 184 | 0.00 0.00 750.00 884.25 cl 185 | 0.00 0.00 750.00 884.25 cl 186 | 0.4980 0.4980 0.4980 srgb 187 | 1.06 setlinewidth 188 | [] 0 setdash 189 | 0 setlinecap 190 | 1 setlinejoin 191 | 10.00 setmiterlimit 192 | np 193 | 69.59 24.41 m 194 | 0 4.26 l 195 | o 196 | np 197 | 117.32 24.41 m 198 | 0 4.26 l 199 | o 200 | np 201 | 165.05 24.41 m 202 | 0 4.26 l 203 | o 204 | np 205 | 212.79 24.41 m 206 | 0 4.26 l 207 | o 208 | np 209 | 260.52 24.41 m 210 | 0 4.26 l 211 | o 212 | np 213 | 308.25 24.41 m 214 | 0 4.26 l 215 | o 216 | np 217 | 355.99 24.41 m 218 | 0 4.26 l 219 | o 220 | np 221 | 403.72 24.41 m 222 | 0 4.26 l 223 | o 224 | np 225 | 451.45 24.41 m 226 | 0 4.26 l 227 | o 228 | np 229 | 499.19 24.41 m 230 | 0 4.26 l 231 | o 232 | np 233 | 546.92 24.41 m 234 | 0 4.26 l 235 | o 236 | np 237 | 594.66 24.41 m 238 | 0 4.26 l 239 | o 240 | np 241 | 642.39 24.41 m 242 | 0 4.26 l 243 | o 244 | 0.00 0.00 750.00 884.25 cl 245 | 0.00 0.00 750.00 884.25 cl 246 | /Font1 findfont 10 s 247 | 0.4980 0.4980 0.4980 srgb 248 | 69.59 14.40 (101) .5 0 t 249 | 117.32 14.40 (102) .5 0 t 250 | 165.05 14.40 (103) .5 0 t 251 | 212.79 14.40 (104) .5 0 t 252 | 260.52 14.40 (105) .5 0 t 253 | 308.25 14.40 (106) .5 0 t 254 | 355.99 14.40 (107) .5 0 t 255 | 403.72 14.40 (108) .5 0 t 256 | 451.45 14.40 (109) .5 0 t 257 | 499.19 14.40 (110) .5 0 t 258 | 546.92 14.40 (111) .5 0 t 259 | 594.66 14.40 (112) .5 0 t 260 | 642.39 14.40 (113) .5 0 t 261 | 0.00 0.00 750.00 884.25 cl 262 | 0.00 0.00 750.00 884.25 cl 263 | 0.00 0.00 750.00 884.25 cl 264 | 0.00 0.00 750.00 884.25 cl 265 | 0.00 0.00 750.00 884.25 cl 266 | 0.00 0.00 750.00 884.25 cl 267 | 0.00 0.00 750.00 884.25 cl 268 | 0.00 0.00 750.00 884.25 cl 269 | 0.00 0.00 750.00 884.25 cl 270 | 0.00 0.00 750.00 884.25 cl 271 | 0.00 0.00 750.00 884.25 cl 272 | 0.00 0.00 750.00 884.25 cl 273 | 0.00 0.00 750.00 884.25 cl 274 | /bg { 1 1 1 srgb } def 275 | 681.06 415.58 44.50 67.34 r p2 276 | 0.00 0.00 750.00 884.25 cl 277 | 0.00 0.00 750.00 884.25 cl 278 | /Font2 findfont 10 s 279 | 0 0 0 srgb 280 | 685.32 471.59 (v) 0 ta 281 | -0.200 (ariab) tb 282 | -0.100 (le) tb gr 283 | 0.00 0.00 750.00 884.25 cl 284 | 0.00 0.00 750.00 884.25 cl 285 | /bg { 0.9490 0.9490 0.9490 srgb } def 286 | 1 1 1 srgb 287 | 1.06 setlinewidth 288 | [] 0 setdash 289 | 1 setlinecap 290 | 1 setlinejoin 291 | 10.00 setmiterlimit 292 | 685.32 442.88 23.04 23.04 r p3 293 | 0.00 0.00 750.00 884.25 cl 294 | 0.00 0.00 750.00 884.25 cl 295 | 0.9725 0.4627 0.4275 srgb 296 | 1.06 setlinewidth 297 | [] 0 setdash 298 | 0 setlinecap 299 | 1 setlinejoin 300 | 10.00 setmiterlimit 301 | np 302 | 687.62 454.40 m 303 | 18.43 0 l 304 | o 305 | 0.00 0.00 750.00 884.25 cl 306 | 0.00 0.00 750.00 884.25 cl 307 | /bg { 0.9490 0.9490 0.9490 srgb } def 308 | 1 1 1 srgb 309 | 1.06 setlinewidth 310 | [] 0 setdash 311 | 1 setlinecap 312 | 1 setlinejoin 313 | 10.00 setmiterlimit 314 | 685.32 419.84 23.04 23.04 r p3 315 | 0.00 0.00 750.00 884.25 cl 316 | 0.00 0.00 750.00 884.25 cl 317 | 0 0.7490 0.7686 srgb 318 | 1.06 setlinewidth 319 | [] 0 setdash 320 | 0 setlinecap 321 | 1 setlinejoin 322 | 10.00 setmiterlimit 323 | np 324 | 687.62 431.36 m 325 | 18.43 0 l 326 | o 327 | 0.00 0.00 750.00 884.25 cl 328 | 0.00 0.00 750.00 884.25 cl 329 | /Font1 findfont 10 s 330 | 0 0 0 srgb 331 | 711.24 450.81 (D) 0 0 t 332 | 0.00 0.00 750.00 884.25 cl 333 | 0.00 0.00 750.00 884.25 cl 334 | /Font1 findfont 10 s 335 | 0 0 0 srgb 336 | 711.24 427.77 (R) 0 0 t 337 | 0.00 0.00 750.00 884.25 cl 338 | 0.00 0.00 750.00 884.25 cl 339 | 0.00 0.00 750.00 884.25 cl 340 | 0.00 0.00 750.00 884.25 cl 341 | 0.00 0.00 750.00 884.25 cl 342 | 0.00 0.00 750.00 884.25 cl 343 | 0.00 0.00 750.00 884.25 cl 344 | 0.00 0.00 750.00 884.25 cl 345 | 0.00 0.00 750.00 884.25 cl 346 | 0.00 0.00 750.00 884.25 cl 347 | 0.00 0.00 750.00 884.25 cl 348 | 0.00 0.00 750.00 884.25 cl 349 | ep 350 | %%Trailer 351 | %%Pages: 1 352 | %%EOF 353 | -------------------------------------------------------------------------------- /polarization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/polarization.png -------------------------------------------------------------------------------- /polarization.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xml0.120.140.16 84 | 101102103104105106107108109110111112113 159 | Polarization 183 | Congress 196 | Democratic Majority 224 | Republican Majority 240 | Republican Majority 256 | Democratic Majority 272 | Polarization in the Senate over TimeA higher Polarization value means that the party made decisions at odds with the average decision. Originally on vikparuchuri.com. -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | scrapy 2 | requests 3 | -------------------------------------------------------------------------------- /senate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/senate.png -------------------------------------------------------------------------------- /senate_analyzer.R: -------------------------------------------------------------------------------- 1 | setwd("~/vikparuchuri/political-positions") 2 | 3 | is_installed <- function(mypkg) is.element(mypkg, installed.packages()[,1]) 4 | 5 | load_or_install<-function(package_names) 6 | { 7 | for(package_name in package_names) 8 | { 9 | if(!is_installed(package_name)) 10 | { 11 | install.packages(package_name,repos="http://lib.stat.cmu.edu/R/CRAN") 12 | } 13 | options(java.parameters = "-Xmx8g") 14 | library(package_name,character.only=TRUE,quietly=TRUE,verbose=FALSE) 15 | } 16 | } 17 | 18 | sorted_vec <- function(dat){ 19 | dat$vote[dat$vote=="Yea"] = 1 20 | dat$vote[dat$vote=="Nay"] = 0 21 | dat$vote[dat$vote=="Not Voting"] = 2 22 | unique_senators = unique(dat$sen) 23 | unique_cong = sort(unique(dat$congress)) 24 | cols = list() 25 | for(c in unique_cong){ 26 | subc = dat[dat$congress==c,] 27 | unique_session = sort(unique(subc$session)) 28 | for(s in unique_session){ 29 | subs = subc[subc$session==s,] 30 | unique_number = sort(unique(subs$number)) 31 | for(n in unique_number){ 32 | subn = subs[subs$number==n,] 33 | votes = lapply(unique_senators,function(x){ 34 | ret <- 3 35 | if(x%in% subn$sen){ 36 | ret = subn[subn$sen==x,'vote'] 37 | } 38 | ret 39 | }) 40 | ret = data.frame(as.numeric(votes),stringsAsFactors=FALSE) 41 | colnames(ret) = paste("(",c,"|",s,"|",n,")",sep="") 42 | cols[[length(cols)+1]] = ret 43 | } 44 | } 45 | } 46 | ret = data.frame(do.call(cbind,cols),stringsAsFactors=FALSE) 47 | rownames(ret) = unique_senators 48 | ret 49 | } 50 | 51 | load_or_install(c("RJSONIO","ggplot2","stringr","foreach","wordcloud","lsa","MASS","openNLP","tm","fastmatch","reshape","openNLPmodels.en",'e1071','gridExtra')) 52 | 53 | senate = fromJSON("data/senate.json") 54 | 55 | frames = lapply(senate,function(x){ 56 | data.frame(sen=gsub(", ","",as.character(names(x$data))),vote=as.character(x$data),congress=as.numeric(x$congress),number=as.numeric(x$number),session=as.numeric(x$session),stringsAsFactors=FALSE) 57 | }) 58 | frame = do.call(rbind,frames) 59 | 60 | frame2013 = sorted_vec(frame[frame$congress==113,]) 61 | 62 | frame2013$name = gsub(" ","",as.character(lapply(strsplit(rownames(frame2013),"\\("),function(x) x[1]))) 63 | frame2013$party = as.character(lapply(strsplit(rownames(frame2013),"\\("),function(x) strsplit(x[2],"-")[[1]][1])) 64 | frame2013$state = gsub("\\)","",as.character(lapply(strsplit(rownames(frame2013),"\\("),function(x) strsplit(x[2],"-")[[1]][2]))) 65 | 66 | non_predictors = c("name","party","state") 67 | 68 | features = frame2013 69 | 70 | feature_names = names(features)[!names(features) %in% c(non_predictors)] 71 | 72 | for(f in feature_names){ 73 | features[,f] = as.numeric(features[,f]) 74 | } 75 | 76 | features = features[apply(features[,feature_names],1,function(x) length(x[x==3])<10),] 77 | 78 | scaled_data = scale(features[,feature_names]) 79 | scaled_data = apply(scaled_data,2,function(x) { 80 | x[is.na(x)] = 2 81 | x 82 | }) 83 | svd_train<-svd(scaled_data,2)$u 84 | 85 | newtrain<-data.frame(x=svd_train[,1],y=svd_train[,2],label_code=as.numeric(as.factor(features$party)),label=features$party,state=features$state,name=features$name,full_name=rownames(features),stringsAsFactors=FALSE) 86 | distances = rowMeans(as.matrix(dist(newtrain[,c("x","y")],method="euclidean"))) 87 | newtrain = data.frame(newtrain,distances=distances,stringsAsFactors=FALSE) 88 | interesting_senators = c("Chiesa (R-NJ)","Markey (D-MA)","Kerry (D-MA)","Cowan (D-MA)", "Lautenberg (D-NJ)","McCain (R-AZ)", "Rubio (R-FL)","Cruz (R-TX)","Scott (R-SC)","Roberts (R-KS)", "Inhofe (R-OK)","Barrasso (R-WY)", "Johnson (R-WI)", "Reid (D-NV)", "Durbin (D-IL)", "Schumer (D-NY)", "McConnell (R-KY)", "Cornyn (R-TX)", "Thune (R-SD)", "Murkowski (R-AK)", "Collins (R-ME)", "Manchin (D-WV)", "Pryor (D-AR)", "King (I-ME)", "Sanders (I-VT)") 89 | 90 | #model = svm(score ~ x + y, data = newtrain) 91 | #plot(model,newtrain) 92 | 93 | collapse_frame = do.call(rbind,by(features[,feature_names],features$label_code,function(x) apply(x,2,mean))) 94 | line_count = tapply(tf$result_label,tf$result_label,length) 95 | scaled_data = scale(collapse_frame) 96 | scaled_data = apply(scaled_data,2,function(x) { 97 | x[is.na(x)] = -1 98 | x 99 | }) 100 | 101 | 102 | svd_train<-data.frame(svd(scaled_data,2)$u,line_count=line_count,label=rownames(line_count)) 103 | svd_train <- svd_train[svd_train$X1mean(svd_train$X1)-1.4*sd(svd_train$X1),] 104 | svd_train <- svd_train[svd_train$X2mean(svd_train$X2)-1.4*sd(svd_train$X2),] 105 | 106 | p <- ggplot(newtrain, aes(x, y)) 107 | p = p + geom_point(aes(colour =label_code-1, size=10)) + scale_colour_gradient(low = "darkblue", high="red") + scale_size_area(max_size=7) + geom_text(data = newtrain[newtrain$full_name %in% interesting_senators,], aes(x+.2,y, label = full_name), hjust = 2) 108 | p = p + theme(axis.line = element_blank(), 109 | panel.grid.major = element_blank(), 110 | panel.grid.minor = element_blank(), 111 | panel.border = element_blank(), 112 | axis.title.x = element_blank(), 113 | axis.title.y = element_blank(), 114 | axis.ticks=element_blank(), 115 | axis.text.x = element_blank(), 116 | axis.text.y = element_blank()) 117 | p = p +labs(colour="Type of Music") 118 | p 119 | 120 | 121 | unique_congress = sort(unique(frame$congress)) 122 | polarization = list() 123 | for(c in unique_congress){ 124 | sframe = frame[frame$congress==c,] 125 | if(sum(is.na(sframe))==0){ 126 | 127 | frame2013 = sorted_vec(sframe) 128 | 129 | frame2013$name = gsub(" ","",as.character(lapply(strsplit(rownames(frame2013),"\\("),function(x) x[1]))) 130 | frame2013$party = as.character(lapply(strsplit(rownames(frame2013),"\\("),function(x) strsplit(x[2],"-")[[1]][1])) 131 | frame2013$state = gsub("\\)","",as.character(lapply(strsplit(rownames(frame2013),"\\("),function(x) strsplit(x[2],"-")[[1]][2]))) 132 | features = frame2013 133 | 134 | feature_names = names(features)[!names(features) %in% c(non_predictors)] 135 | 136 | for(f in feature_names){ 137 | features[,f] = as.numeric(features[,f]) 138 | } 139 | 140 | scaled_data = scale(features[,feature_names]) 141 | scaled_data = apply(scaled_data,2,function(x) { 142 | x[is.na(x)] = -1 143 | x 144 | }) 145 | svd_train<-svd(scaled_data,2)$u 146 | 147 | newtrain<-data.frame(x=svd_train[,1],y=svd_train[,2],label_code=as.numeric(as.factor(features$party)),label=features$party,state=features$state,name=features$name,full_name=rownames(features),stringsAsFactors=FALSE) 148 | dist_mat = as.matrix(dist(newtrain[,c("x","y")],method="euclidean")) 149 | dem_distances = apply(dist_mat,1,function(x) mean(x[features$party=="D"])) 150 | rep_distances = apply(dist_mat,1,function(x) mean(x[features$party=="R"])) 151 | distances = rowMeans(dist_mat) 152 | party_distances = tapply(distances,newtrain$label,mean) 153 | dem_distances = tapply(dem_distances,newtrain$label,mean) 154 | rep_distances = tapply(rep_distances,newtrain$label,mean) 155 | party_counts = tapply(newtrain$label,newtrain$label,length) 156 | dist_frame = data.frame(D=party_distances['D'],R=party_distances['R'],I=party_distances['I'],congress=c,DP=rep_distances['D'],RP=dem_distances['R'],DC=party_counts['D'],RC=party_counts['R'],IC=party_counts['I']) 157 | polarization[[length(polarization)+1]] = dist_frame 158 | } 159 | } 160 | 161 | dists = do.call(rbind,polarization) 162 | dfm <- melt(dists[,c("congress","D","R")], id.var = c("congress")) 163 | ddf = melt(dists[,c("congress","D","R","DC","RC")], id.var = c("congress")) 164 | ddf = data.frame(dists,variable=dists$congress) 165 | p <- ggplot(dfm, aes(congress, value, group = variable, colour = variable)) 166 | p = p + geom_line() + scale_x_continuous(labels = dists$congress,breaks = dists$congress) 167 | p = p + theme(axis.line = element_blank(), 168 | panel.grid.major = element_blank(), 169 | panel.grid.minor = element_blank(), 170 | panel.border = element_blank(), 171 | axis.title.x = element_blank(), 172 | axis.title.y = element_blank()) 173 | #p = p + geom_text(data = ddf, aes(congress,D, label = DC, hjust = 2)) 174 | #p = p + geom_text(data = dists, aes(congress,R, label = RC, hjust = 2)) 175 | p 176 | 177 | -------------------------------------------------------------------------------- /tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/tasks/__init__.py -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | __author__ = 'vik' 2 | -------------------------------------------------------------------------------- /tests/test_runner.py: -------------------------------------------------------------------------------- 1 | """ 2 | Runs tests 3 | """ 4 | 5 | from percept.utils.registry import registry 6 | import logging 7 | 8 | log = logging.getLogger(__name__) 9 | 10 | def run_all_tests(): 11 | """ 12 | Look through the registry, and run tests for any class that has a tester and test_cases 13 | """ 14 | for item in registry: 15 | item_cls = item.cls 16 | if hasattr(item_cls, 'tester') and hasattr(item_cls, 'test_cases'): 17 | tester = item_cls.tester() 18 | yield tester.run, item_cls, item_cls.test_cases 19 | 20 | -------------------------------------------------------------------------------- /workflows/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VikParuchuri/political-positions/7c92276995a8b28e2b0beb90b5eec8226c0db397/workflows/__init__.py --------------------------------------------------------------------------------