Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds NIBRS Endpoints for Regions #699

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions crime_data/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ def output_csv(data, code, headers=None):
api.add_resource(crime_data.resources.meta.StateLK,'/lookup/state')

api.add_resource(crime_data.resources.nibrs_counts.NIBRSCountNational, '/nibrs/<string:offense_name>/<string:queryType>/national/<string:variable>')
api.add_resource(crime_data.resources.nibrs_counts.NIBRSCountRegion, '/nibrs/<string:offense_name>/<string:queryType>/regions/<string:region_name>/<string:variable>')
api.add_resource(crime_data.resources.nibrs_counts.NIBRSCountState, '/nibrs/<string:offense_name>/<string:queryType>/states/<string:state_abbr>/<string:variable>')
api.add_resource(crime_data.resources.nibrs_counts.NIBRSCountAgency, '/nibrs/<string:offense_name>/<string:queryType>/agency/<string:ori>/<string:variable>')

Expand Down
392 changes: 390 additions & 2 deletions crime_data/common/cdemodels.py

Large diffs are not rendered by default.

64 changes: 64 additions & 0 deletions crime_data/common/marshmallow_schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -1274,6 +1274,70 @@ class NIBRSStateOffenseCountSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSStateOffenseCount
ordered = True
class NIBRSRegionVictimDenormCountSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionVictimDenormCount
ordered = True

class NIBRSRegionVictimDenormSexSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionVictimDenormSex
ordered = True

class NIBRSRegionVictimDenormRaceSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionVictimDenormRace
ordered = True

class NIBRSRegionVictimDenormEthnicitySchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionVictimDenormEthnicity
ordered = True

class NIBRSRegionVictimDenormAgeSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionVictimDenormAge
ordered = True

class NIBRSRegionDenormVictimOffenderRelationshipSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionDenormVictimOffenderRelationship
ordered = True

class NIBRSRegionVictimDenormLocationSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionVictimDenormLocation
ordered = True

class NIBRSRegionOffenderDenormCountSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionOffenderDenormCount
ordered = True

class NIBRSRegionOffenderDenormSexSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionOffenderDenormSex
ordered = True

class NIBRSRegionOffenderDenormRaceSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionOffenderDenormRace
ordered = True

class NIBRSRegionOffenderDenormAgeSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionOffenderDenormAge
ordered = True

class NIBRSRegionOffenderDenormEthnicitySchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionOffenderDenormEthnicity
ordered = True

class NIBRSRegionOffenseCountSchema(ma.ModelSchema):
class Meta:
model = cdemodels.NIBRSRegionOffenseCount
ordered = True

class PoliceEmploymentDataNationSchema(ma.ModelSchema):
class Meta:
Expand Down
62 changes: 62 additions & 0 deletions crime_data/resources/nibrs_counts.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,68 @@ def get(self, args, variable,queryType, offense_name=None):
ui = creator.munge_set()
return self.without_metadata(ui, args)

class NIBRSCountRegion(CdeResource):
@use_args(ArgumentsSchema)
@cache(max_age=DEFAULT_MAX_AGE, public=True)
def get(self, args, variable,queryType,region_name=None, offense_name=None):
self.verify_api_key(args)
if queryType == 'victim' and variable == 'count':
self.set_schema(marshmallow_schemas.NIBRSRegionVictimDenormCountSchema(many=True))
query = cdemodels.NIBRSRegionVictimDenormCount.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_count_victim','')
elif queryType == 'victim' and variable == 'sex':
self.set_schema(marshmallow_schemas.NIBRSRegionVictimDenormSexSchema(many=True))
query = cdemodels.NIBRSRegionVictimDenormSex.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_sex_victim','')
elif queryType =='victim' and variable == 'race':
self.set_schema(marshmallow_schemas.NIBRSRegionVictimDenormRaceSchema(many=True))
query = cdemodels.NIBRSRegionVictimDenormRace.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_race_victim','')
elif queryType == 'victim' and variable == 'ethnicity':
self.set_schema(marshmallow_schemas.NIBRSRegionVictimDenormEthnicitySchema(many=True))
query = cdemodels.NIBRSRegionVictimDenormEthnicity.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_ethnicity_victim','')
elif queryType == 'victim' and variable == 'age':
self.set_schema(marshmallow_schemas.NIBRSRegionVictimDenormAgeSchema(many=True))
query = cdemodels.NIBRSRegionVictimDenormAge.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_age_victim','')
elif queryType == 'victim' and variable == 'location':
self.set_schema(marshmallow_schemas.NIBRSRegionVictimDenormLocationSchema(many=True))
query = cdemodels.NIBRSRegionVictimDenormLocation.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_location','')
elif queryType == 'offender' and variable == 'count':
self.set_schema(marshmallow_schemas.NIBRSRegionOffenderDenormCountSchema(many=True))
query = cdemodels.NIBRSRegionOffenderDenormCount.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_count_offender','')
elif queryType == 'offender' and variable == 'sex':
self.set_schema(marshmallow_schemas.NIBRSRegionOffenderDenormSexSchema(many=True))
query = cdemodels.NIBRSRegionOffenderDenormSex.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_sex_offender','')
elif queryType == 'offender' and variable == 'race':
self.set_schema(marshmallow_schemas.NIBRSRegionOffenderDenormRaceSchema(many=True))
query = cdemodels.NIBRSRegionOffenderDenormRace.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_race_offender','')
elif queryType == 'offender' and variable == 'ethnicity':
self.set_schema(marshmallow_schemas.NIBRSRegionOffenderDenormEthnicitySchema(many=True))
query = cdemodels.NIBRSRegionOffenderDenormEthnicity.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_ethnicity_offender','')
elif queryType == 'offender' and variable == 'age':
self.set_schema(marshmallow_schemas.NIBRSRegionOffenderDenormAgeSchema(many=True))
query = cdemodels.NIBRSRegionOffenderDenormAge.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_age_offender','')
elif queryType == 'offense' and variable == 'count':
self.set_schema(marshmallow_schemas.NIBRSRegionOffenseCountSchema(many=True))
query = cdemodels.NIBRSRegionOffenseCount.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_offense_count','')
elif queryType == 'victim' and variable == 'relationships':
self.set_schema(marshmallow_schemas.NIBRSRegionDenormVictimOffenderRelationshipSchema(many=True))
query = cdemodels.NIBRSRegionDenormVictimOffenderRelationship.get(region_name=region_name,offense_name=get_offenses(offense_name))
creator = munger.UIComponentCreator(query.all(),'nibrs_relatiopnship','')
else:
return self.with_metadata([], args)
ui = creator.munge_set()
return self.without_metadata(ui, args)


class NIBRSCountState(CdeResource):
@use_args(ArgumentsSchema)
Expand Down
130 changes: 130 additions & 0 deletions dba/create_new/offender_nibrs_rollup_mv.sql
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,136 @@ coalesce(sum(case when age_range = '90-99' then count end), 0) as range_90_99,
coalesce(sum(case when age_range = 'UNKNOWN' then count end), 0) as unknown
from public.nibrs_offender_count group by agency_id, ori, offense_name, data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_sex AS
select region_code as region_code,
region_name as region_name,
offense_name as offense_name,
data_year as data_year,
coalesce(sum(case when sex_code = 'M' then count end), 0) as male_count,
coalesce(sum(case when sex_code = 'F' then count end), 0) as female_count,
coalesce(sum(case when sex_code = 'U' then count end), 0) as unknown_count
from public.nibrs_offender_count group by region_code, region_name, offense_name, data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_count AS
select region_code as region_code,
region_name as region_name,
offense_name as offense_name,
data_year as data_year,
sum(count) as count
from public.nibrs_offender_count group by region_code, region_name, offense_name, data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_race AS
select region_code as region_code,
region_name as region_name,
offense_name as offense_name,
data_year as data_year,
coalesce(sum(case when race_desc = 'Asian' then count end), 0) as asian,
coalesce(sum(case when race_desc = 'Native Hawaiian or Pacific Islander' then count end), 0) as native_hawaiian,
coalesce(sum(case when race_desc = 'Black or African American' then count end), 0) as black,
coalesce(sum(case when race_desc = 'American Indian or Alaska Native' then count end), 0) as american_indian,
coalesce(sum(case when race_desc = 'Unknown' then count end), 0) as unknown,
coalesce(sum(case when race_desc = 'White' then count end), 0) as white
from public.nibrs_offender_count group by region_code, region_name, offense_name, data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_ethnicity AS
select region_code as region_code,
region_name as region_name,
offense_name as offense_name,
data_year as data_year,
coalesce(sum(case when ethnicity_name = 'Hispanic or Latino' then count end), 0) as hispanic,
coalesce(sum(case when ethnicity_name = 'Multiple' then count end), 0) as multiple,
coalesce(sum(case when ethnicity_name = 'Not Hispanic or Latino' then count end), 0) as not_Hispanic,
coalesce(sum(case when ethnicity_name = 'Unknown' then count end), 0) as unknown
from public.nibrs_offender_count group by region_code, region_name, offense_name, data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_age AS
select region_code as region_code,
region_name as region_name,
offense_name as offense_name,
data_year as data_year,
coalesce(sum(case when age_range = '0-9' then count end), 0) as range_0_9,
coalesce(sum(case when age_range = '10-19' then count end), 0) as range_10_19,
coalesce(sum(case when age_range = '20-29' then count end), 0) as range_20_29,
coalesce(sum(case when age_range = '30-39' then count end), 0) as range_30_39,
coalesce(sum(case when age_range = '40-49' then count end), 0) as range_40_49,
coalesce(sum(case when age_range = '50-59' then count end), 0) as range_50_59,
coalesce(sum(case when age_range = '60-69' then count end), 0) as range_60_69,
coalesce(sum(case when age_range = '70-79' then count end), 0) as range_70_79,
coalesce(sum(case when age_range = '80-89' then count end), 0) as range_80_89,
coalesce(sum(case when age_range = '90-99' then count end), 0) as range_90_99,
coalesce(sum(case when age_range = 'UNKNOWN' then count end), 0) as unknown
from public.nibrs_offender_count group by region_code, region_name, offense_name, data_year;


--Region
CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_sex AS
select s.region_code as region_code,
r.region_name as region_name,
n.offense_name as offense_name,
n.data_year as data_year,
SUM(n.male_count) as male_count,
SUM(n.female_count) as female_count,
SUM(n.unknown_count) as unknown_count
from public.nibrs_state_denorm_offender_sex n, public.state_lk s,public.region_lk r
where s.region_code = r.region_code group by s.region_code,r.region_name, n.offense_name, n.data_year;


CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_count AS
select s.region_code as region_code,
r.region_name as region_name,
n.offense_name as offense_name,
n.data_year as data_year,
sum(n.count) as count
from public.nibrs_offender_count n, public.state_lk s,public.region_lk r
where s.region_code = r.region_code group by s.region_code,r.region_name, n.offense_name, n.data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_race AS
select s.region_code as region_code,
r.region_name as region_name,
n.offense_name as offense_name,
n.data_year as data_year,
coalesce(sum(case when n.race_desc = 'Asian' then count end), 0) as asian,
coalesce(sum(case when n.race_desc = 'Native Hawaiian or Pacific Islander' then count end), 0) as native_hawaiian,
coalesce(sum(case when n.race_desc = 'Black or African American' then count end), 0) as black,
coalesce(sum(case when n.race_desc = 'American Indian or Alaska Native' then count end), 0) as american_indian,
coalesce(sum(case when n.race_desc = 'Unknown' then count end), 0) as unknown,
coalesce(sum(case when n.race_desc = 'White' then count end), 0) as white
from public.nibrs_offender_count n, public.state_lk s,public.region_lk r
where s.region_code = r.region_code
group by s.region_code,r.region_name, n.offense_name, n.data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_ethnicity AS
select s.region_code as region_code,
r.region_name as region_name,
n.offense_name as offense_name,
n.data_year as data_year,
coalesce(sum(case when n.ethnicity_name = 'Hispanic or Latino' then count end), 0) as hispanic,
coalesce(sum(case when n.ethnicity_name = 'Multiple' then count end), 0) as multiple,
coalesce(sum(case when n.ethnicity_name = 'Not Hispanic or Latino' then count end), 0) as not_Hispanic,
coalesce(sum(case when n.ethnicity_name = 'Unknown' then count end), 0) as unknown
from public.nibrs_offender_count n, public.state_lk s,public.region_lk r
where s.region_code = r.region_code
group by s.region_code,r.region_name, n.offense_name, n.data_year;

CREATE MATERIALIZED VIEW nibrs_region_denorm_offender_age AS
select s.region_code as region_code,
r.region_name as region_name,
n.offense_name as offense_name,
n.data_year as data_year,
coalesce(sum(case when n.age_range = '0-9' then count end), 0) as range_0_9,
coalesce(sum(case when n.age_range = '10-19' then count end), 0) as range_10_19,
coalesce(sum(case when n.age_range = '20-29' then count end), 0) as range_20_29,
coalesce(sum(case when n.age_range = '30-39' then count end), 0) as range_30_39,
coalesce(sum(case when n.age_range = '40-49' then count end), 0) as range_40_49,
coalesce(sum(case when n.age_range = '50-59' then count end), 0) as range_50_59,
coalesce(sum(case when n.age_range = '60-69' then count end), 0) as range_60_69,
coalesce(sum(case when n.age_range = '70-79' then count end), 0) as range_70_79,
coalesce(sum(case when n.age_range = '80-89' then count end), 0) as range_80_89,
coalesce(sum(case when n.age_range = '90-99' then count end), 0) as range_90_99,
coalesce(sum(case when n.age_range = 'UNKNOWN' then count end), 0) as unknown
from public.nibrs_offender_count n, public.state_lk s,public.region_lk r
where s.region_code = r.region_code
group by s.region_code,r.region_name, n.offense_name, n.data_year;

UPDATE nibrs_offender_count
SET state_abbr = TRIM(state_abbr),ori = TRIM(ori),
Expand Down
14 changes: 13 additions & 1 deletion dba/create_new/offense_counts_nibrs_rollup_mv.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ sum(offense_count) as offense_count
from public.nibrs_offense_count group by offense_name, data_year;


CREATE MATERIALIZED VIEW nibrs_state_denorm_offense_count AS
CREATE MATERIALIZED VIEW nibrs_region_denorm_offense_count AS
select state_id as state_id,
state_abbr as state_abbr,
offense_name as offense_name,
Expand All @@ -25,6 +25,18 @@ sum(incident_count) as incident_count,
sum(offense_count) as offense_count
from public.nibrs_offense_count group by agency_id, ori, offense_name, data_year;

--region
CREATE MATERIALIZED VIEW nibrs_state_denorm_offense_count AS
select s.region_code as region_code,
r.region_name as region_name,
n.offense_name as offense_name,
n.data_year as data_year,
sum(n.incident_count) as incident_count,
sum(n.offense_count) as offense_count
from public.nibrs_offense_count n, public.state_lk s,public.region_lk r
where s.region_code = r.region_code
group by s.region_code,r.region_name, n.offense_name, n.data_year;;

UPDATE nibrs_offense_count
SET state_abbr = TRIM(state_abbr),ori = TRIM(ori),
offense_name = TRIM(offense_name),
Loading