from parsons.utilities import check_env
import requests
from parsons.etl import Table
URI = "https://www.googleapis.com/civicinfo/v2/"
[docs]class GoogleCivic(object):
"""
`Args:`
api_key : str
A valid Google api key. Not required if ``GOOGLE_CIVIC_API_KEY``
env variable set.
`Returns:`
class
"""
def __init__(self, api_key=None):
self.api_key = check_env.check("GOOGLE_CIVIC_API_KEY", api_key)
self.uri = URI
def request(self, url, args=None):
# Internal request method
if not args:
args = {}
args["key"] = self.api_key
r = requests.get(url, params=args)
return r.json()
[docs] def get_elections(self):
"""
Get a collection of information about elections and voter information.
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
"""
url = self.uri + "elections"
return Table((self.request(url))["elections"])
def _get_voter_info(self, election_id, address):
# Internal method to call voter info end point. Portions of this are
# parsed for other methods.
url = self.uri + "voterinfo"
args = {"address": address, "electionId": election_id}
return self.request(url, args=args)
[docs] def get_polling_location(self, election_id, address):
"""
Get polling location information for a given address.
`Args:`
election_id: int
A valid election id. Election ids can be found by running the
:meth:`get_elections` method.
address: str
A valid US address in a single string.
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
"""
r = self._get_voter_info(election_id, address)
return r["pollingLocations"]
[docs] def get_polling_locations(self, election_id, table, address_field="address"):
"""
Get polling location information for a table of addresses.
`Args:`
election_id: int
A valid election id. Election ids can be found by running the
:meth:`get_elections` method.
address: str
A valid US address in a single string.
address_field: str
The name of the column where the address is stored.
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
"""
polling_locations = []
# Iterate through the rows of the table
for row in table:
loc = self.get_polling_location(election_id, row[address_field])
# Insert original passed address
loc[0]["passed_address"] = row[address_field]
# Add to list of lists
polling_locations.append(loc[0])
# Unpack values
tbl = Table(polling_locations)
tbl.unpack_dict("address", prepend_value="polling")
tbl.unpack_list("sources", replace=True)
tbl.unpack_dict("sources_0", prepend_value="source")
tbl.rename_column("polling_line1", "polling_address")
# Resort columns
tbl.move_column("pollingHours", len(tbl.columns))
tbl.move_column("notes", len(tbl.columns))
tbl.move_column("polling_locationName", 1)
tbl.move_column("polling_address", 2)
return tbl