election/tools/tc-election-summary.py
Tony Breeds 544bcd41a3 [tools] Render historical stats for TC elections
Right now this script includes the data and needs to be updated after
each election.

We could factor out the data in the future

Change-Id: I60ba91efabb280e91b2481d20df0b16ec5471036
2016-10-09 23:56:34 +00:00

91 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env python
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import division
from __future__ import print_function
import prettytable
CIVS_BASE = 'http://civs.cs.cornell.edu/cgi-bin/results.pl'
data = [
{
'election': '10/2013',
'electorate': 1106,
'votes_cast': 342,
},
{
'election': '04/2014',
'electorate': 1510,
'votes_cast': 448,
},
{
'election': '10/2014',
'electorate': 1893,
'votes_cast': 506,
'results': '%s?id=%s' % (CIVS_BASE, 'E_c105db929e6c11f4')
},
{
'election': '04/2015',
'electorate': 2169,
'votes_cast': 548,
'results': '%s?id=%s' % (CIVS_BASE, 'E_ef1379fee7b94688')
},
{
'election': '10/2015',
'electorate': 2759,
'votes_cast': 619,
'results': '%s?id=%s' % (CIVS_BASE, 'E_4ef58718618691a0')
},
{
'election': '04/2016',
'electorate': 3284,
'votes_cast': 652,
'results': '%s?id=%s' % (CIVS_BASE, 'E_fef5cc22eb3dc27a')
},
{
'election': '10/2016',
'electorate': 3517,
'votes_cast': 801,
'results': '%s?id=%s' % (CIVS_BASE, 'E_356e6c1b16904010')
},
]
def change(data, idx, key):
if idx == 0:
return float('NaN')
return 100 * ((data[idx][key] / data[idx-1][key]) - 1)
pt = prettytable.PrettyTable(['Election',
'Electorate (delta %)',
'Voted (delta %)',
'Turnout % (delta %)'])
for idx, current in enumerate(data):
current['turnout'] = 100 * (current['votes_cast'] / current['electorate'])
current['electorate_change'] = change(data, idx, 'electorate')
current['voter_change'] = change(data, idx, 'votes_cast')
current['turnout_change'] = change(data, idx, 'turnout')
pt.add_row(['%(election)8s' % current,
'%(electorate)10d (%(electorate_change)7.2f)' % current,
'%(votes_cast)5d (%(voter_change)7.2f)' % current,
' %(turnout)7.2f (%(turnout_change)7.2f)' % current])
print(pt)
print("\nElection CIVS links")
for election in data:
if 'results' in election:
print("%(election)8s: %(results)s" % election)