예제 #1
0
    def test_map_incarceration_combinations_two_stays_same_month_facility(
            self):
        person = StatePerson.new_with_defaults(
            state_code="CA",
            person_id=12345,
            birthdate=date(1984, 8, 31),
            gender=Gender.FEMALE,
        )

        race = StatePersonRace.new_with_defaults(state_code="CA",
                                                 race=Race.WHITE)

        person.races = [race]

        ethnicity = StatePersonEthnicity.new_with_defaults(
            state_code="CA", ethnicity=Ethnicity.NOT_HISPANIC)

        person.ethnicities = [ethnicity]

        incarceration_events = [
            IncarcerationStayEvent(
                state_code="CA",
                event_date=date(2010, 3, 31),
                facility="FACILITY 33",
                county_of_residence=_COUNTY_OF_RESIDENCE,
                most_serious_offense_ncic_code=_NCIC_CODE,
                most_serious_offense_statute=_STATUTE,
                admission_reason=AdmissionReason.PAROLE_REVOCATION,
                admission_reason_raw_text="PAROLE_REVOCATION",
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON,
            ),
            IncarcerationStayEvent(
                state_code="CA",
                event_date=date(2010, 3, 31),
                facility="FACILITY 18",
                county_of_residence=_COUNTY_OF_RESIDENCE,
                admission_reason=AdmissionReason.PAROLE_REVOCATION,
                admission_reason_raw_text="PAROLE_REVOCATION",
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON,
            ),
        ]

        incarceration_combinations = calculator.map_incarceration_combinations(
            person=person,
            incarceration_events=incarceration_events,
            metric_inclusions=ALL_METRICS_INCLUSIONS_DICT,
            calculation_end_month=None,
            calculation_month_count=-1,
            person_metadata=_DEFAULT_PERSON_METADATA,
        )

        expected_combinations_count = expected_metric_combos_count(
            incarceration_events)

        self.assertEqual(expected_combinations_count,
                         len(incarceration_combinations))
        assert all(value == 1
                   for _combination, value in incarceration_combinations)
예제 #2
0
    def test_map_incarceration_combinations_includes_statute_output(self):
        person = StatePerson.new_with_defaults(person_id=12345,
                                               birthdate=date(1984, 8, 31),
                                               gender=Gender.FEMALE)

        race = StatePersonRace.new_with_defaults(state_code='CA',
                                                 race=Race.WHITE)

        person.races = [race]

        ethnicity = StatePersonEthnicity.new_with_defaults(
            state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC)

        person.ethnicities = [ethnicity]

        incarceration_events = [
            IncarcerationStayEvent(state_code='CA',
                                   event_date=date(2010, 3, 31),
                                   facility='FACILITY 33',
                                   county_of_residence=_COUNTY_OF_RESIDENCE,
                                   most_serious_offense_ncic_code=_NCIC_CODE,
                                   most_serious_offense_statute=_STATUTE),
            IncarcerationStayEvent(state_code='CA',
                                   event_date=date(2010, 4, 30),
                                   facility='FACILITY 33',
                                   county_of_residence=_COUNTY_OF_RESIDENCE,
                                   most_serious_offense_ncic_code=_NCIC_CODE,
                                   most_serious_offense_statute=_STATUTE),
            IncarcerationStayEvent(state_code='CA',
                                   event_date=date(2010, 5, 31),
                                   facility='FACILITY 33',
                                   county_of_residence=_COUNTY_OF_RESIDENCE,
                                   most_serious_offense_ncic_code=_NCIC_CODE,
                                   most_serious_offense_statute=_STATUTE)
        ]

        incarceration_combinations = calculator.map_incarceration_combinations(
            person=person,
            incarceration_events=incarceration_events,
            inclusions=ALL_INCLUSIONS_DICT,
            calculation_month_limit=-1)

        expected_combinations_count = expected_metric_combos_count(
            person, incarceration_events, ALL_INCLUSIONS_DICT)

        self.assertEqual(expected_combinations_count,
                         len(incarceration_combinations))
        assert all(value == 1
                   for _combination, value in incarceration_combinations)
        assert all(
            combo.get('most_serious_offense_statute') is not None
            for combo, value in incarceration_combinations
            if combo.get('person_id') is not None)
예제 #3
0
    def test_map_incarceration_combinations_two_stays_same_month(self):
        person = StatePerson.new_with_defaults(person_id=12345,
                                               birthdate=date(1984, 8, 31),
                                               gender=Gender.FEMALE)

        race = StatePersonRace.new_with_defaults(state_code='CA',
                                                 race=Race.WHITE)

        person.races = [race]

        ethnicity = StatePersonEthnicity.new_with_defaults(
            state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC)

        person.ethnicities = [ethnicity]

        incarceration_events = [
            IncarcerationStayEvent(
                state_code='CA',
                event_date=date(2010, 3, 31),
                facility='FACILITY 33',
                county_of_residence=_COUNTY_OF_RESIDENCE,
                most_serious_offense_ncic_code=_NCIC_CODE,
                most_serious_offense_statute=_STATUTE,
                admission_reason=AdmissionReason.PAROLE_REVOCATION,
                admission_reason_raw_text='PAROLE_REVOCATION',
            ),
            IncarcerationStayEvent(
                state_code='CA',
                event_date=date(2010, 3, 31),
                facility='FACILITY 33',
                county_of_residence=_COUNTY_OF_RESIDENCE,
                most_serious_offense_ncic_code=_NCIC_CODE,
                most_serious_offense_statute=_STATUTE,
                admission_reason=AdmissionReason.PAROLE_REVOCATION,
                admission_reason_raw_text='PAROLE_REVOCATION',
            )
        ]

        incarceration_combinations = calculator.map_incarceration_combinations(
            person=person,
            incarceration_events=incarceration_events,
            inclusions=ALL_INCLUSIONS_DICT,
            calculation_month_limit=-1)

        expected_combinations_count = expected_metric_combos_count(
            person, incarceration_events, ALL_INCLUSIONS_DICT)

        self.assertEqual(expected_combinations_count,
                         len(incarceration_combinations))
        assert all(value == 1
                   for _combination, value in incarceration_combinations)
예제 #4
0
    def test_map_incarceration_combinations_all_types(self):
        person = StatePerson.new_with_defaults(person_id=12345,
                                               birthdate=date(1984, 8, 31),
                                               gender=Gender.FEMALE)

        race = StatePersonRace.new_with_defaults(state_code='CA',
                                                 race=Race.WHITE)

        person.races = [race]

        ethnicity = StatePersonEthnicity.new_with_defaults(
            state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC)

        person.ethnicities = [ethnicity]

        incarceration_events = [
            IncarcerationStayEvent(
                admission_reason=StateIncarcerationPeriodAdmissionReason.
                PAROLE_REVOCATION,
                admission_reason_raw_text='NEW_ADMISSION',
                supervision_type_at_admission=
                StateSupervisionPeriodSupervisionType.PAROLE,
                state_code='CA',
                event_date=date(2000, 3, 31),
                facility='SAN QUENTIN',
                county_of_residence=_COUNTY_OF_RESIDENCE,
                most_serious_offense_statute=_STATUTE,
            ),
            IncarcerationAdmissionEvent(
                state_code='CA',
                event_date=date(2000, 3, 12),
                facility='SAN QUENTIN',
                county_of_residence=_COUNTY_OF_RESIDENCE,
                admission_reason=AdmissionReason.PAROLE_REVOCATION,
                supervision_type_at_admission=
                StateSupervisionPeriodSupervisionType.PAROLE,
                admission_reason_raw_text='PAROLE_REVOCATION',
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON),
            IncarcerationReleaseEvent(
                state_code='CA',
                event_date=date(2003, 4, 12),
                facility='SAN QUENTIN',
                county_of_residence=_COUNTY_OF_RESIDENCE,
            )
        ]

        incarceration_combinations = calculator.map_incarceration_combinations(
            person=person,
            incarceration_events=incarceration_events,
            inclusions=ALL_INCLUSIONS_DICT,
            calculation_month_limit=-1)

        expected_combinations_count = expected_metric_combos_count(
            person, incarceration_events, ALL_INCLUSIONS_DICT)

        self.assertEqual(expected_combinations_count,
                         len(incarceration_combinations))
        assert all(value == 1
                   for _combination, value in incarceration_combinations)
예제 #5
0
    def test_map_incarceration_combinations_multiple_overlapping_stays(self):
        person = StatePerson.new_with_defaults(person_id=12345,
                                               birthdate=date(1984, 8, 31),
                                               gender=Gender.FEMALE)

        race = StatePersonRace.new_with_defaults(state_code='CA',
                                                 race=Race.WHITE)

        person.races = [race]

        ethnicity = StatePersonEthnicity.new_with_defaults(
            state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC)

        person.ethnicities = [ethnicity]

        incarceration_events = [
            IncarcerationStayEvent(state_code='US_ND',
                                   event_date=date(2019, 11, 30),
                                   facility='JRCC',
                                   county_of_residence=_COUNTY_OF_RESIDENCE),
            IncarcerationStayEvent(state_code='US_ND',
                                   event_date=date(2019, 11, 30),
                                   facility='JRCC',
                                   county_of_residence=_COUNTY_OF_RESIDENCE),
            IncarcerationStayEvent(state_code='US_ND',
                                   event_date=date(2019, 11, 30),
                                   facility='JRCC',
                                   county_of_residence=_COUNTY_OF_RESIDENCE)
        ]

        incarceration_combinations = calculator.map_incarceration_combinations(
            person=person,
            incarceration_events=incarceration_events,
            inclusions=ALL_INCLUSIONS_DICT,
            calculation_month_limit=-1)

        expected_combinations_count = expected_metric_combos_count(
            person, incarceration_events, ALL_INCLUSIONS_DICT)

        self.assertEqual(expected_combinations_count,
                         len(incarceration_combinations))
        assert all(value == 1
                   for _combination, value in incarceration_combinations)
예제 #6
0
def find_incarceration_stays(
        incarceration_sentences: List[StateIncarcerationSentence],
        supervision_sentences: List[StateSupervisionSentence],
        incarceration_period: StateIncarcerationPeriod,
        county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]:
    """Finds all days for which this person was incarcerated."""
    incarceration_stay_events: List[IncarcerationStayEvent] = []

    admission_date = incarceration_period.admission_date
    release_date = incarceration_period.release_date

    if release_date is None:
        if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY:
            # This should not happen after validation.
            raise ValueError(
                "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly"
                " setting missing dates.")

        # This person is in custody for this period. Set the release date for tomorrow.
        release_date = date.today() + relativedelta(days=1)

    if admission_date is None:
        return incarceration_stay_events

    supervision_type_at_admission = get_pre_incarceration_supervision_type(
        incarceration_sentences, supervision_sentences, incarceration_period)

    sentence_group = _get_sentence_group_for_incarceration_period(
        incarceration_period)

    stay_date = admission_date

    while stay_date < release_date:
        most_serious_charge = find_most_serious_prior_charge_in_sentence_group(
            sentence_group, stay_date)
        most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None
        most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None

        incarceration_stay_events.append(
            IncarcerationStayEvent(
                state_code=incarceration_period.state_code,
                event_date=stay_date,
                facility=incarceration_period.facility,
                county_of_residence=county_of_residence,
                most_serious_offense_ncic_code=most_serious_offense_ncic_code,
                most_serious_offense_statute=most_serious_offense_statute,
                admission_reason=incarceration_period.admission_reason,
                admission_reason_raw_text=incarceration_period.
                admission_reason_raw_text,
                supervision_type_at_admission=supervision_type_at_admission,
            ))

        stay_date = stay_date + relativedelta(days=1)

    return incarceration_stay_events
예제 #7
0
def find_end_of_month_state_prison_stays(
        incarceration_sentences: List[StateIncarcerationSentence],
        supervision_sentences: List[StateSupervisionSentence],
        incarceration_period: StateIncarcerationPeriod,
        county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]:
    """Finds months for which this person was incarcerated in a state prison on the last day of the month.
    """
    incarceration_stay_events: List[IncarcerationStayEvent] = []

    if incarceration_period.incarceration_type != StateIncarcerationType.STATE_PRISON:
        return incarceration_stay_events

    admission_date = incarceration_period.admission_date
    release_date = incarceration_period.release_date

    if release_date is None:
        release_date = date.today()

    if admission_date is None:
        return incarceration_stay_events

    supervision_type_at_admission = get_pre_incarceration_supervision_type(
        incarceration_sentences, supervision_sentences, incarceration_period)

    sentence_group = _get_sentence_group_for_incarceration_period(incarceration_period)

    end_of_month = last_day_of_month(admission_date)

    while end_of_month < release_date:
        most_serious_charge = find_most_serious_prior_charge_in_sentence_group(sentence_group, end_of_month)
        most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None
        most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None

        incarceration_stay_events.append(
            IncarcerationStayEvent(
                state_code=incarceration_period.state_code,
                event_date=end_of_month,
                facility=incarceration_period.facility,
                county_of_residence=county_of_residence,
                most_serious_offense_ncic_code=most_serious_offense_ncic_code,
                most_serious_offense_statute=most_serious_offense_statute,
                admission_reason=incarceration_period.admission_reason,
                admission_reason_raw_text=incarceration_period.admission_reason_raw_text,
                supervision_type_at_admission=supervision_type_at_admission,
            )
        )

        end_of_month = last_day_of_month(end_of_month + relativedelta(days=1))

    return incarceration_stay_events
예제 #8
0
def find_incarceration_stays(
        incarceration_sentences: List[StateIncarcerationSentence],
        supervision_sentences: List[StateSupervisionSentence],
        incarceration_period: StateIncarcerationPeriod,
        original_admission_reasons_by_period_id: Dict[int, Tuple[
            StateIncarcerationPeriodAdmissionReason, Optional[str]]],
        incarceration_period_to_judicial_district: Dict[int, Dict[Any, Any]],
        county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]:
    """Finds all days for which this person was incarcerated."""
    incarceration_stay_events: List[IncarcerationStayEvent] = []

    admission_date = incarceration_period.admission_date
    release_date = incarceration_period.release_date

    if release_date is None:
        if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY:
            # This should not happen after validation.
            raise ValueError(
                "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly"
                " setting missing dates.")

        # This person is in custody for this period. Set the release date for tomorrow.
        release_date = date.today() + relativedelta(days=1)

    if admission_date is None:
        return incarceration_stay_events

    supervision_type_at_admission = get_pre_incarceration_supervision_type(
        incarceration_sentences, supervision_sentences, incarceration_period)

    sentence_group = _get_sentence_group_for_incarceration_period(
        incarceration_period)
    judicial_district_code = _get_judicial_district_code(
        incarceration_period, incarceration_period_to_judicial_district)

    stay_date = admission_date

    incarceration_period_id = incarceration_period.incarceration_period_id

    if not incarceration_period_id:
        raise ValueError(
            "Unexpected incarceration period without an incarceration_period_id."
        )

    original_admission_reason, original_admission_reason_raw_text = \
        original_admission_reasons_by_period_id[incarceration_period_id]

    original_admission_reason = state_specific_admission_reason_override(
        incarceration_period.state_code, original_admission_reason,
        supervision_type_at_admission)

    while stay_date < release_date:
        most_serious_charge = find_most_serious_prior_charge_in_sentence_group(
            sentence_group, stay_date)
        most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None
        most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None

        incarceration_stay_events.append(
            IncarcerationStayEvent(
                state_code=incarceration_period.state_code,
                event_date=stay_date,
                facility=incarceration_period.facility,
                county_of_residence=county_of_residence,
                most_serious_offense_ncic_code=most_serious_offense_ncic_code,
                most_serious_offense_statute=most_serious_offense_statute,
                admission_reason=original_admission_reason,
                admission_reason_raw_text=original_admission_reason_raw_text,
                supervision_type_at_admission=supervision_type_at_admission,
                judicial_district_code=judicial_district_code,
                specialized_purpose_for_incarceration=incarceration_period.
                specialized_purpose_for_incarceration))

        stay_date = stay_date + relativedelta(days=1)

    return incarceration_stay_events
예제 #9
0
    def testClassifyIncarcerationEvents(self):
        """Tests the ClassifyIncarcerationEvents DoFn."""
        fake_person_id = 12345

        fake_person = StatePerson.new_with_defaults(
            state_code='US_XX',
            person_id=fake_person_id,
            gender=Gender.MALE,
            birthdate=date(1970, 1, 1),
            residency_status=ResidencyStatus.PERMANENT)

        incarceration_period = StateIncarcerationPeriod.new_with_defaults(
            incarceration_period_id=1111,
            incarceration_type=StateIncarcerationType.STATE_PRISON,
            status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY,
            state_code='TX',
            facility='PRISON XX',
            admission_date=date(2010, 11, 20),
            admission_reason=StateIncarcerationPeriodAdmissionReason.
            PROBATION_REVOCATION,
            release_date=date(2010, 11, 21),
            release_reason=StateIncarcerationPeriodReleaseReason.
            SENTENCE_SERVED,
            specialized_purpose_for_incarceration=
            StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD)

        incarceration_sentence = StateIncarcerationSentence.new_with_defaults(
            incarceration_sentence_id=123,
            incarceration_periods=[incarceration_period],
            start_date=date(2009, 2, 9),
            charges=[
                StateCharge.new_with_defaults(ncic_code='5699',
                                              statute='30A123',
                                              offense_date=date(2009, 1, 9))
            ])

        sentence_group = StateSentenceGroup.new_with_defaults(
            sentence_group_id=123,
            incarceration_sentences=[incarceration_sentence])

        incarceration_sentence.sentence_group = sentence_group

        incarceration_period.incarceration_sentences = [incarceration_sentence]

        fake_person_id_to_county_query_result = [{
            'person_id':
            fake_person_id,
            'county_of_residence':
            _COUNTY_OF_RESIDENCE
        }]

        fake_incarceration_period_judicial_district_association_result = \
            {'person_id': fake_person_id, 'incarceration_period_id': 123, 'judicial_district_code': 'NW'}

        incarceration_events = [
            IncarcerationStayEvent(
                admission_reason=incarceration_period.admission_reason,
                admission_reason_raw_text=incarceration_period.
                admission_reason_raw_text,
                supervision_type_at_admission=
                StateSupervisionPeriodSupervisionType.PROBATION,
                state_code=incarceration_period.state_code,
                event_date=incarceration_period.admission_date,
                facility=incarceration_period.facility,
                county_of_residence=_COUNTY_OF_RESIDENCE,
                most_serious_offense_ncic_code='5699',
                most_serious_offense_statute='30A123',
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD),
            IncarcerationAdmissionEvent(
                state_code=incarceration_period.state_code,
                event_date=incarceration_period.admission_date,
                facility=incarceration_period.facility,
                county_of_residence=_COUNTY_OF_RESIDENCE,
                admission_reason=incarceration_period.admission_reason,
                admission_reason_raw_text=incarceration_period.
                admission_reason_raw_text,
                supervision_type_at_admission=
                StateSupervisionPeriodSupervisionType.PROBATION,
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD),
            IncarcerationReleaseEvent(
                state_code=incarceration_period.state_code,
                event_date=incarceration_period.release_date,
                facility=incarceration_period.facility,
                county_of_residence=_COUNTY_OF_RESIDENCE,
                release_reason=incarceration_period.release_reason,
                admission_reason=incarceration_period.admission_reason,
                total_days_incarcerated=(
                    incarceration_period.release_date -
                    incarceration_period.admission_date).days,
                purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD)
        ]

        correct_output = [(fake_person_id, (fake_person, incarceration_events))
                          ]

        test_pipeline = TestPipeline()

        person_id_to_county_kv = (
            test_pipeline
            | "Read person id to county associations from BigQuery" >>
            beam.Create(fake_person_id_to_county_query_result)
            |
            "Convert to KV" >> beam.ParDo(ConvertDictToKVTuple(), 'person_id'))

        person_entities = {
            'person': [fake_person],
            'sentence_groups': [sentence_group],
            'incarceration_period_judicial_district_association':
            [fake_incarceration_period_judicial_district_association_result]
        }

        output = (test_pipeline
                  | beam.Create([(fake_person_id, person_entities)])
                  | 'Identify Incarceration Events' >> beam.ParDo(
                      pipeline.ClassifyIncarcerationEvents(),
                      AsDict(person_id_to_county_kv)))

        assert_that(output, equal_to(correct_output))

        test_pipeline.run()
예제 #10
0
    def testClassifyIncarcerationEvents(self):
        """Tests the ClassifyIncarcerationEvents DoFn."""
        fake_person_id = 12345

        fake_person = StatePerson.new_with_defaults(
            state_code="US_XX",
            person_id=fake_person_id,
            gender=Gender.MALE,
            birthdate=date(1970, 1, 1),
            residency_status=ResidencyStatus.PERMANENT,
        )

        incarceration_period = StateIncarcerationPeriod.new_with_defaults(
            incarceration_period_id=1111,
            incarceration_type=StateIncarcerationType.STATE_PRISON,
            status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY,
            state_code="TX",
            facility="PRISON XX",
            admission_date=date(2010, 11, 20),
            admission_reason=StateIncarcerationPeriodAdmissionReason.
            PROBATION_REVOCATION,
            release_date=date(2010, 11, 21),
            release_reason=StateIncarcerationPeriodReleaseReason.
            SENTENCE_SERVED,
            specialized_purpose_for_incarceration=
            StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD,
        )

        incarceration_sentence = StateIncarcerationSentence.new_with_defaults(
            state_code="US_XX",
            incarceration_sentence_id=123,
            status=StateSentenceStatus.PRESENT_WITHOUT_INFO,
            incarceration_periods=[incarceration_period],
            start_date=date(2009, 2, 9),
            charges=[
                StateCharge.new_with_defaults(
                    state_code="US_XX",
                    status=ChargeStatus.PRESENT_WITHOUT_INFO,
                    ncic_code="5699",
                    statute="30A123",
                    offense_date=date(2009, 1, 9),
                )
            ],
        )

        sentence_group = StateSentenceGroup.new_with_defaults(
            state_code="US_XX",
            status=StateSentenceStatus.PRESENT_WITHOUT_INFO,
            sentence_group_id=123,
            incarceration_sentences=[incarceration_sentence],
        )

        incarceration_sentence.sentence_group = sentence_group

        incarceration_period.incarceration_sentences = [incarceration_sentence]

        fake_person_id_to_county_query_result = {
            "person_id": fake_person_id,
            "county_of_residence": _COUNTY_OF_RESIDENCE,
        }

        fake_incarceration_period_judicial_district_association_result = {
            "person_id": fake_person_id,
            "incarceration_period_id": 123,
            "judicial_district_code": "NW",
        }

        incarceration_events = [
            IncarcerationStayEvent(
                admission_reason=incarceration_period.admission_reason,
                admission_reason_raw_text=incarceration_period.
                admission_reason_raw_text,
                supervision_type_at_admission=
                StateSupervisionPeriodSupervisionType.PROBATION,
                state_code=incarceration_period.state_code,
                event_date=incarceration_period.admission_date,
                facility=incarceration_period.facility,
                county_of_residence=_COUNTY_OF_RESIDENCE,
                most_serious_offense_ncic_code="5699",
                most_serious_offense_statute="30A123",
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD,
            ),
            IncarcerationAdmissionEvent(
                state_code=incarceration_period.state_code,
                event_date=incarceration_period.admission_date,
                facility=incarceration_period.facility,
                county_of_residence=_COUNTY_OF_RESIDENCE,
                admission_reason=incarceration_period.admission_reason,
                admission_reason_raw_text=incarceration_period.
                admission_reason_raw_text,
                supervision_type_at_admission=
                StateSupervisionPeriodSupervisionType.PROBATION,
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD,
            ),
            IncarcerationReleaseEvent(
                state_code=incarceration_period.state_code,
                event_date=incarceration_period.release_date,
                facility=incarceration_period.facility,
                county_of_residence=_COUNTY_OF_RESIDENCE,
                release_reason=incarceration_period.release_reason,
                admission_reason=incarceration_period.admission_reason,
                total_days_incarcerated=(
                    incarceration_period.release_date -
                    incarceration_period.admission_date).days,
                purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD,
            ),
        ]

        correct_output = [(fake_person_id, (fake_person, incarceration_events))
                          ]

        test_pipeline = TestPipeline()

        person_entities = {
            "person": [fake_person],
            "sentence_groups": [sentence_group],
            "incarceration_period_judicial_district_association":
            [fake_incarceration_period_judicial_district_association_result],
            "persons_to_recent_county_of_residence":
            [fake_person_id_to_county_query_result],
        }

        output = (test_pipeline
                  | beam.Create([(fake_person_id, person_entities)])
                  | "Identify Incarceration Events" >> beam.ParDo(
                      pipeline.ClassifyIncarcerationEvents()))

        assert_that(output, equal_to(correct_output))

        test_pipeline.run()
예제 #11
0
    def test_map_incarceration_combinations_multiple_overlapping_stays(self):
        person = StatePerson.new_with_defaults(
            state_code="US_ND",
            person_id=12345,
            birthdate=date(1984, 8, 31),
            gender=Gender.FEMALE,
        )

        race = StatePersonRace.new_with_defaults(state_code="US_ND",
                                                 race=Race.WHITE)

        person.races = [race]

        ethnicity = StatePersonEthnicity.new_with_defaults(
            state_code="US_ND", ethnicity=Ethnicity.NOT_HISPANIC)

        person.ethnicities = [ethnicity]

        incarceration_events = [
            IncarcerationStayEvent(
                state_code="US_ND",
                event_date=date(2019, 11, 30),
                facility="JRCC",
                county_of_residence=_COUNTY_OF_RESIDENCE,
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON,
            ),
            IncarcerationStayEvent(
                state_code="US_ND",
                event_date=date(2019, 11, 30),
                facility="JRCC",
                county_of_residence=_COUNTY_OF_RESIDENCE,
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON,
            ),
            IncarcerationStayEvent(
                state_code="US_ND",
                event_date=date(2019, 11, 30),
                facility="JRCC",
                county_of_residence=_COUNTY_OF_RESIDENCE,
                specialized_purpose_for_incarceration=
                StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON,
            ),
        ]

        incarceration_combinations = calculator.map_incarceration_combinations(
            person=person,
            incarceration_events=incarceration_events,
            metric_inclusions=ALL_METRICS_INCLUSIONS_DICT,
            calculation_end_month=None,
            calculation_month_count=-1,
            person_metadata=_DEFAULT_PERSON_METADATA,
        )

        expected_combinations_count = expected_metric_combos_count(
            incarceration_events)

        self.assertEqual(expected_combinations_count,
                         len(incarceration_combinations))
        assert all(value == 1
                   for _combination, value in incarceration_combinations)