def test_find_release_events_by_cohort_year_no_recid_cond_release(self): """Tests the find_release_events_by_cohort_year function when the person does not have any StateIncarcerationPeriods after their first, and they were released conditionally.""" only_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2000, 1, 9), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2003, 12, 8), release_reason=ReleaseReason.CONDITIONAL_RELEASE) release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( [only_incarceration_period], _COUNTY_OF_RESIDENCE) assert len(release_events_by_cohort) == 1 assert release_events_by_cohort[2003] == [ NonRecidivismReleaseEvent( state_code='TX', county_of_residence=_COUNTY_OF_RESIDENCE, original_admission_date=only_incarceration_period. admission_date, release_date=only_incarceration_period.release_date, release_facility=None) ]
def process(self, element): """Identifies instances of recidivism and non-recidivism. Sends the identifier the StateIncarcerationPeriods for a given StatePerson, which returns a list of ReleaseEvents for each year the individual was released from incarceration. Args: element: Tuple containing person_id and a dictionary with a StatePerson and a list of StateIncarcerationPeriods Yields: Tuple containing the StatePerson and a collection of ReleaseEvents. """ _, person_entities = element person, kwargs = person_and_kwargs_for_identifier(person_entities) release_events_by_cohort_year = identifier.find_release_events_by_cohort_year( **kwargs ) if not release_events_by_cohort_year: logging.info( "No valid release events identified for person with" "id: %d. Excluding them from the " "calculations.", person.person_id, ) else: yield person.person_id, (person, release_events_by_cohort_year)
def test_find_release_events_by_cohort_year_invalid_open_period(self): """Tests the find_release_events_by_cohort_year function where the person has an open IN_CUSTODY period that is invalid because the person was released elsewhere after the admission to the period.""" invalid_open_incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION) closed_incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2009, 3, 14), release_reason=ReleaseReason.SENTENCE_SERVED) release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( [invalid_open_incarceration_period, closed_incarceration_period], _COUNTY_OF_RESIDENCE) assert release_events_by_cohort[2009] == [ NonRecidivismReleaseEvent( state_code='TX', county_of_residence=_COUNTY_OF_RESIDENCE, original_admission_date=closed_incarceration_period.admission_date, release_date=closed_incarceration_period.release_date, release_facility=None)]
def test_find_release_events_by_cohort_year_no_incarcerations_at_all(self): """Tests the find_release_events_by_cohort_year function when the person has no StateIncarcerationPeriods.""" release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( [], _COUNTY_OF_RESIDENCE) assert not release_events_by_cohort
def testFindReleaseEventsByCohortYear_collapseTemporaryCustodyAndRevocation(self): """Tests the find_release_events_by_cohort_year function where a temporary custody incarceration period is followed by a revocation period. In this test case the person did recidivate. """ initial_incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, external_id='1', incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.SENTENCE_SERVED) temporary_custody_reincarceration = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, external_id='2', incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.TEMPORARY_CUSTODY, release_date=date(2014, 4, 14), release_reason=ReleaseReason.RELEASED_FROM_TEMPORARY_CUSTODY) revocation_incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=3333, external_id='3', incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.IN_CUSTODY, state_code='TX', admission_date=date(2014, 4, 14), admission_reason=AdmissionReason.PROBATION_REVOCATION) incarceration_periods = [ initial_incarceration_period, temporary_custody_reincarceration, revocation_incarceration_period] release_events_by_cohort = identifier.find_release_events_by_cohort_year( incarceration_periods, _COUNTY_OF_RESIDENCE) self.assertEqual(1, len(release_events_by_cohort)) self.assertCountEqual( [RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period.admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=temporary_custody_reincarceration.admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, from_supervision_type=StateSupervisionPeriodSupervisionType.PROBATION, return_type=ReincarcerationReturnType.REVOCATION)], release_events_by_cohort[2010])
def test_find_release_events_by_cohort_year_sentence_served_prob_rev(self): """Tests the find_release_events_by_cohort_year function path where the person served their first sentence, then later returned on a probation revocation.""" initial_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.SENTENCE_SERVED) first_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.PROBATION_REVOCATION, release_date=date(2014, 4, 14), release_reason=ReleaseReason.SENTENCE_SERVED) incarceration_periods = [initial_incarceration_period, first_reincarceration_period] release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods=incarceration_periods, county_of_residence=_COUNTY_OF_RESIDENCE) assert len(release_events_by_cohort) == 2 assert release_events_by_cohort[2010] == [RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period.admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=first_reincarceration_period.admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.REVOCATION, from_supervision_type=StateSupervisionPeriodSupervisionType. PROBATION)] assert release_events_by_cohort[2014] == [ NonRecidivismReleaseEvent( state_code='TX', original_admission_date=first_reincarceration_period. admission_date, release_date=first_reincarceration_period.release_date, county_of_residence=_COUNTY_OF_RESIDENCE, release_facility=None)]
def test_find_release_events_by_cohort_year_cond_release_new_admit(self): """Tests the find_release_events_by_cohort_year function path where the person was conditionally released on parole but returned as a new admission.""" initial_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.CONDITIONAL_RELEASE) first_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2014, 4, 14), release_reason=ReleaseReason.SENTENCE_SERVED) incarceration_periods = [initial_incarceration_period, first_reincarceration_period] release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods=incarceration_periods, county_of_residence=_COUNTY_OF_RESIDENCE) assert len(release_events_by_cohort) == 2 assert release_events_by_cohort[2010] == [RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period.admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=first_reincarceration_period.admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.NEW_ADMISSION)] assert release_events_by_cohort[2014] == [ NonRecidivismReleaseEvent( state_code='TX', original_admission_date=first_reincarceration_period. admission_date, release_date=first_reincarceration_period.release_date, county_of_residence=_COUNTY_OF_RESIDENCE, release_facility=None)]
def test_find_release_events_by_cohort_year_only_placeholder_periods(self): incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, state_code='US_XX') release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods=[incarceration_period], county_of_residence=_COUNTY_OF_RESIDENCE) assert len(release_events_by_cohort) == 0
def test_find_release_events_by_cohort_year_transfer_no_recidivism(self): """Tests the find_release_events_by_cohort_year function path where the person was transferred between two incarceration periods.""" initial_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.TRANSFER) first_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2010, 12, 4), admission_reason=AdmissionReason.TRANSFER, release_date=date(2014, 4, 14), release_reason=ReleaseReason.SENTENCE_SERVED) incarceration_periods = [ initial_incarceration_period, first_reincarceration_period ] release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods=incarceration_periods, county_of_residence=_COUNTY_OF_RESIDENCE) assert len(release_events_by_cohort) == 1 assert release_events_by_cohort[2014] == [ NonRecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period. admission_date, release_date=first_reincarceration_period.release_date, county_of_residence=_COUNTY_OF_RESIDENCE, release_facility=None) ]
def test_find_release_events_by_cohort_year_still_incarcerated(self): """Tests the find_release_events_by_cohort_year function where the person is still incarcerated on their very first StateIncarcerationPeriod.""" only_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION) release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( [only_incarceration_period], _COUNTY_OF_RESIDENCE) assert not release_events_by_cohort
def process(self, element, person_id_to_county): """Identifies instances of recidivism and non-recidivism. Sends the identifier the StateIncarcerationPeriods for a given StatePerson, which returns a list of ReleaseEvents for each year the individual was released from incarceration. Args: element: Tuple containing person_id and a dictionary with a StatePerson and a list of StateIncarcerationPeriods Yields: Tuple containing the StatePerson and a collection of ReleaseEvents. """ _, person_incarceration_periods = element # Get the StateIncarcerationPeriods as a list incarceration_periods = \ list(person_incarceration_periods['incarceration_periods']) # Get the StatePerson person = one(person_incarceration_periods['person']) # Get the person's county of residence, if present person_id_to_county_fields = person_id_to_county.get( person.person_id, None) county_of_residence = \ person_id_to_county_fields.get('county_of_residence', None) \ if person_id_to_county_fields else None release_events_by_cohort_year = \ identifier.find_release_events_by_cohort_year( incarceration_periods, county_of_residence) if not release_events_by_cohort_year: logging.info( "No valid release events identified for person with" "id: %d. Excluding them from the " "calculations.", person.person_id) else: yield (person, release_events_by_cohort_year)
def process(self, element, person_id_to_county): """Identifies instances of recidivism and non-recidivism. Sends the identifier the StateIncarcerationPeriods for a given StatePerson, which returns a list of ReleaseEvents for each year the individual was released from incarceration. Args: element: Tuple containing person_id and a dictionary with a StatePerson and a list of StateIncarcerationPeriods Yields: Tuple containing the StatePerson and a collection of ReleaseEvents. """ _, person_entities = element person, kwargs = person_and_kwargs_for_identifier(person_entities) # Get the person's county of residence, if present person_id_to_county_fields = person_id_to_county.get( person.person_id, None) county_of_residence = (person_id_to_county_fields.get( 'county_of_residence', None) if person_id_to_county_fields else None) # Add this arguments to the keyword args for the identifier kwargs['county_of_residence'] = county_of_residence release_events_by_cohort_year = \ identifier.find_release_events_by_cohort_year(**kwargs) if not release_events_by_cohort_year: logging.info( "No valid release events identified for person with" "id: %d. Excluding them from the " "calculations.", person.person_id) else: yield person, release_events_by_cohort_year
def test_find_release_events_by_cohort_year(self): """Tests the find_release_events_by_cohort_year function path where the person did recidivate.""" initial_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.SENTENCE_SERVED) first_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2014, 4, 14), release_reason=ReleaseReason.SENTENCE_SERVED) subsequent_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=3333, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.IN_CUSTODY, state_code='TX', admission_date=date(2017, 1, 4), admission_reason=AdmissionReason.NEW_ADMISSION) incarceration_periods = [ initial_incarceration_period, first_reincarceration_period, subsequent_reincarceration_period ] release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods, _COUNTY_OF_RESIDENCE) self.assertEqual(2, len(release_events_by_cohort)) self.assertCountEqual([ RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period. admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=first_reincarceration_period. admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.NEW_ADMISSION) ], release_events_by_cohort[2010]) self.assertCountEqual([ RecidivismReleaseEvent( state_code='TX', original_admission_date=first_reincarceration_period. admission_date, release_date=first_reincarceration_period.release_date, release_facility=None, reincarceration_date=subsequent_reincarceration_period. admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.NEW_ADMISSION) ], release_events_by_cohort[2014])