Skip to main content

Tools for processing and visualizing districting plans.

Project description

gerrytools

CircleCI codecov PyPI version docs website Code style: black Imports: isort

A companion to GerryChain, GerryTools is a robust suite of geometric and algorithmic tools to analyze districting plans and related data. GerryTools is actively developed and used by the MGGG Redistricting Lab and our collaborators to prepare accurate, precise, and clean information for our projects. It is distributed under a 3-Clause BSD License.

Installation

Using pip (recommended)

To install GerryTools from PyPi, run

$ pip install gerrytools

from the command line.

Usage

Contents

GerryTools is split up into multiple sub-packages, each designed to simplify and standardize redistricting workflows.

  • gerrytools.data deals with the retrieval and processing of data. Here, you can find tools for grabbing decennial Census ('10 and '20), ACS 5-year ('12-'20), ACS CVAP Special Tab ('12-'20), districtr portal, and 2020 decennial Census geometric data. You can also find tools for moving CVAP data to other levels of geometry (e.g. prorating 2019 CVAP on 2019 Census tracts to 2020 blocks).
  • gerrytools.geometry provides facilities for dealing with geometric and related data. There are tools for translating and evaluating GerryChain Partitions, performing fast geometric dissolutions, creating unit maps (e.g. 2020 blocks to 2020 VTDs), creating dual graphs for GerryChain, and optimization algorithms for renaming districts.
  • gerrytools.plotting contains methods for generating extremely high-quality Lab-standard data visualizations.
  • gerrytools.scoring provides a vast array of redistricting plan scores. These can be used standalone or as GerryChain updaters.
  • gerrychain.utilities has ease-of-use methods for renaming directories containing shapefiles (which comes in handy more often than you'd think) and making JSON objects out of Python objects (useful when trying to organize information for many districting plans in a standard format).

Example

GerryTools is easy to use and is designed to simplify data- and redistricting-related workflows. For example, let's say we want to analyze Alabama's citizen voting-age population data on 2020 Census tracts. First, we can download the geometric data for the state using gerrytools.data.geometry20():

from gerrytools.data import geometry20
from us import states

# Retrieves Lab-processed and -cleaned geometry data, and writes it to file.
geometry20(states.AL, "~/project/AL-tracts.zip", geometry="tract")

Next, we can download cleaned citizen voting-age population (CVAP) data from the 2020 ACS special tabulation release:

from gerrytools.data import cvap
from us import states

# A pandas DataFrame of 2020 CVAP data for the state of Alabama at the 2020 Census
# tract level.
data = cvap(states.AL, geometry="tract", year=2020)
data.to_csv("~/project/AL-cvap.csv")

Finally, we can merge the two datasets, attaching the CVAP demographic data to the geometric data:

import geopandas as gpd
import pandas as pd

# Import geometric and demographic data.
geometric = gpd.read_file("~/project/AL-tracts.zip")
demographic = pd.read_csv("~/project/AL-cvap.csv")

# Merge. Note that the DataFrames have different unique identifier columns --- this
# is intentional, and serves to differentiate datasets of varying geometric levels.
merged = geometric.merge(demographic, left_on="GEOID20", right_on="TRACT20")

And there we are — what once took hours of setup and parsing now takes less than a minute.

Contributing

GerryTools is an active project, and has multiple contributors. If you'd like to contribute, here are a few house rules:

  1. After cloning this repository, run sh setup.sh to download and install necessary git hooks and linting configurations.
  2. Follow the PEP8 style guide. After installing the above git hooks, linting is performed before every push. PEP8 errors can be automatically corrected by running autopep8 --in-place --aggressive -r gerrytools on the command line from the root directory.
  3. Write tests. All changes, major or minor, must be accompanied by testing code. Code and tests will be immediately reviewed by Lab maintainers.
  4. Test coverage must stay at least the same; this can be checked by running pytest --cov=evaltools after the tests are added to tests/.
  5. Write documentation. All changes should be documented via docstrings, and code should be repletely commented. It's much easier to decipher commented code! Docstring documentation is compiled on every commit via git hooks.

We look forward to your contributions!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gerrytools-1.1.1.tar.gz (79.0 kB view hashes)

Uploaded Source

Built Distribution

gerrytools-1.1.1-py3-none-any.whl (85.1 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page