Skip to content

Commit

Permalink
Diversity using site parcel data
Browse files Browse the repository at this point in the history
  • Loading branch information
doorleyr committed Jun 12, 2020
1 parent 1539f54 commit 2c60cc1
Show file tree
Hide file tree
Showing 3 changed files with 5,139 additions and 15 deletions.
135 changes: 135 additions & 0 deletions corktown_offline_indicators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 12 11:21:39 2020
@author: doorleyr
"""

from toolbox import Handler, Indicator, CompositeIndicator
from proximity_indicator import ProxIndicator
from innovation_indicator import InnoIndicator
from mobility_indicator import MobilityIndicator
from aggregate_indicator import AggregateIndicator
from economic_indicator import EconomicIndicator
from buildings_indicator import BuildingsIndicator
from diversity_indicator import DiversityIndicator

import urllib
import json
import pandas as pd


I = InnoIndicator()
P = ProxIndicator(name='proximity', indicator_type_in='numeric', table_name='corktown')
#P_hm = ProxIndicator(name='proximity_heatmap', indicator_type_in='heatmap', table_name='corktown')
M = MobilityIndicator(name='mobility', table_name='corktown')
B= BuildingsIndicator(name='buildings', table_name='corktown')
D= DiversityIndicator(name='diversity', table_name='corktown')

# 2nd order individual indicators
E = EconomicIndicator(name='Economic',
table_name='corktown')

#H = Handler('corktown', quietly=False)
#
#H.add_indicators([
# I,
# P,
## P_hm,
# M,
# E,
# B,
# D
# ])

geogrid=json.load(open('../CS_Grid_Maker/examples/results/corktown_geogrid.geojson'))

types=json.load(open('../CS_Grid_Maker/examples/type_definitions/corktown_types.json'))

static_types=json.load(open('../CS_Grid_Maker/examples/type_definitions/corktown_static_types.json'))

types.update(static_types)

for ind in [I, P,
# P_hm,
M, B, D, E]:
ind.types_def=types
ind.geogrid_header=geogrid['properties']['header']

I.types_def

geogrid_data_base=json.load(open('../Scenarios/12_Jun_20/ford_base.json'))
geogrid_data_campus=json.load(open('../Scenarios/12_Jun_20/ford_campus.json'))
geogrid_data_housing=json.load(open('../Scenarios/12_Jun_20/ford_housing.json'))
geogrid_data_inno_com=json.load(open('../Scenarios/12_Jun_20/ford_inno_com.json'))

cell_area=geogrid['properties']['header']['cellSize']**2

updatable=[((feat['properties']['interactive'])or (feat['properties']['static_new'])
) for feat in geogrid['features']]


def get_type_stats(geogrid_data, type_name, updatable,cell_area, types_def=I.types_def):
sqm_pp=types_def[type_name]['sqm_pperson']
floors=0
for gi, cell in enumerate(geogrid_data):
if ((updatable[gi]) and (cell['name']==type_name)):
height=cell['height']
if isinstance(height, list):
height=height[-1]
floors+=height
return sqm_pp, floors*cell_area, floors*cell_area/sqm_pp



def get_all_indicators(geogrid_data, future_mobility):
all_ind=[]
print('Mobility')
all_ind.extend(M.return_indicator(geogrid_data, future_mobility=future_mobility))

print('Innovation')
all_ind.extend(I.return_indicator(geogrid_data))

print('Economic')
all_ind.extend(E.return_indicator(geogrid_data))

print('Proximity')
all_ind.extend(P.return_indicator(geogrid_data))

print('Diversity')
all_ind.extend(D.return_indicator(geogrid_data))

print('Buildings')
all_ind.extend(B.return_indicator(geogrid_data))
return all_ind

def create_scenario_row(all_ind, scenario_name):
all_cols={'Scenario': scenario_name}
for ind in all_ind:
all_cols[ind['name']+' norm']=ind['value']
raw_name=ind['name']+' raw'
if not ind['units']==None:
raw_name+= ' ['+ind['units']+']'
all_cols[raw_name]=ind['raw_value']
return all_cols

base_indicators=get_all_indicators(geogrid_data_base, False)
campus_indicators=get_all_indicators(geogrid_data_campus, False)
campus_mobility_indicators=get_all_indicators(geogrid_data_campus, True)
housing_indicators=get_all_indicators(geogrid_data_housing, False)
inno_com_indicators=get_all_indicators(geogrid_data_inno_com, True)

all_scenarios=[]
all_scenarios.append(create_scenario_row(base_indicators, scenario_name='BAU'))
all_scenarios.append(create_scenario_row(campus_indicators, scenario_name='Campus Only'))
all_scenarios.append(create_scenario_row(campus_mobility_indicators, scenario_name='Future Mobility'))
all_scenarios.append(create_scenario_row(housing_indicators, scenario_name='Housing'))
all_scenarios.append(create_scenario_row(inno_com_indicators, scenario_name='Innovation Community'))

col_order = ['Scenario']+[col for col in all_scenarios[0] if 'norm' in col]+[col for col in all_scenarios[0] if 'raw' in col]

output=pd.DataFrame(all_scenarios)
output=output[col_order]

output.to_csv('scenario_outputs.csv')
104 changes: 89 additions & 15 deletions diversity_indicator.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import pandas as pd
import json
from toolbox import Handler, Indicator
from indicator_tools import EconomicIndicatorBase, shannon_equitability_score
from indicator_tools import EconomicIndicatorBase, shannon_equitability_score, flatten_grid_cell_attributes, collect_grid_cell_counts

class DiversityIndicator(EconomicIndicatorBase):
def setup(self ,*args,**kwargs):
Expand All @@ -11,41 +11,115 @@ def setup(self ,*args,**kwargs):
'42', '44', '45', '48', '49', '51', '52',
'53', '54', '55', '56', '61', '62', '71',
'72', '81', '92']
self.third_place_naics_codes=['7224', '7225', '7211',
'4451', '4452', '4453' ]
# self.third_place_naics_codes=['7224', '7225', '7211',
# '4451', '4452', '4453' ]
self.education_naics_codes=['6111', '6113', '6115',
'6116' ]
parcel_data_loc='./tables/{}/geometry/{}_site_parcels_cs_types.geojson'.format(self.table_name, self.table_name)
self.parcel_data=json.load(open(parcel_data_loc))
self.school_type_to_NAICS={'School': '6111'}
self.prepare_base_populations()





def prepare_base_populations(self):
# create dict of housing {'R2', 'R3', 'R5', 'R6'}
self.housing_counts={'R1': 0, 'R2':0, 'R3':0, 'R4': 0,'R5':0, 'R6':0}
self.education_counts={'6111':0, '6113':0, '6115':0,
'6116':0}
self.third_place_counts={'2200':0, '2100':0, '7240':0}

for feat in self.parcel_data['features']:
area=feat['properties']['area_sqm']
floor_area=feat['properties']['floor_area_sqm']
if feat['properties']['CS_LU']=='Institutional':
school_naics=self.school_type_to_NAICS[feat['properties']['school_type']]
self.education_counts[school_naics]+=floor_area
elif 'Residential' in feat['properties']['CS_LU']:
if feat['properties']['ZONING'] in self.housing_counts:
self.housing_counts[feat['properties']['ZONING']]+=floor_area
elif feat['properties']['CS_LU']=='Retail':
self.third_place_counts['2200']+=0.9*floor_area
self.third_place_counts['2100']+=0.1*floor_area
elif feat['properties']['CS_LU']=='Park':
self.third_place_counts['7240']+=area

def return_indicator(self,geogrid_data):
industry_composition=self.grid_to_industries(geogrid_data)
industry_species_counts={}
third_place_species_counts={}
education_species_counts={}
# third_place_species_counts={}
# education_species_counts={}
for td_code in self.two_digit_naics_species:
industry_species_counts[td_code]=sum([industry_composition[code] for
code in industry_composition if code[:2]==td_code])
for tp_code in self.third_place_naics_codes:
third_place_species_counts[tp_code]=sum([industry_composition[code] for
code in industry_composition if code==tp_code])
for ed_code in self.education_naics_codes:
education_species_counts[ed_code]=sum([industry_composition[code] for
code in industry_composition if code==ed_code])
# for tp_code in self.third_place_naics_codes:
# third_place_species_counts[tp_code]=sum([industry_composition[code] for
# code in industry_composition if code==tp_code])
# for ed_code in self.education_naics_codes:
# education_species_counts[ed_code]=sum([industry_composition[code] for
# code in industry_composition if code==ed_code])

job_diversity=shannon_equitability_score([industry_species_counts[code] for code in industry_species_counts])
third_diversity=shannon_equitability_score([third_place_species_counts[code] for code in third_place_species_counts])
edu_diversity=shannon_equitability_score([education_species_counts[code] for code in education_species_counts])
# third_diversity=shannon_equitability_score([third_place_species_counts[code] for code in third_place_species_counts])
# edu_diversity=shannon_equitability_score([education_species_counts[code] for code in education_species_counts])

# make copies of the baseline counts
housing_counts={k:self.housing_counts[k] for k in self.housing_counts}
education_counts={k:self.education_counts[k] for k in self.education_counts}
third_place_counts={k:self.third_place_counts[k] for k in self.third_place_counts}

all_new_LBCS=[]
all_new_NAICS=[]
for cell in geogrid_data:
if cell['interactive']:
lbcs_this_cell=flatten_grid_cell_attributes(
type_def=self.types_def[cell['name']], height=cell['height'],
attribute_name='LBCS', area_per_floor=self.geogrid_header['cellSize']**2,
return_units='floors')
naics_this_cell=flatten_grid_cell_attributes(
type_def=self.types_def[cell['name']], height=cell['height'],
attribute_name='NAICS', area_per_floor=self.geogrid_header['cellSize']**2,
return_units='floors')
all_new_LBCS.append(lbcs_this_cell)
all_new_NAICS.append(naics_this_cell)

all_new_LBCS_agg=collect_grid_cell_counts(all_new_LBCS)
all_new_NAICS_agg=collect_grid_cell_counts(all_new_NAICS)

area_one_floor=self.geogrid_header['cellSize']**2
# for each education lbcs, add new
# for each third_place lbcs add new
for lbcs in third_place_counts:
if lbcs in all_new_LBCS_agg:
third_place_counts[lbcs]+=all_new_LBCS_agg[lbcs]*area_one_floor
for naics in education_counts:
if naics in all_new_NAICS_agg:
education_counts[naics]+=all_new_NAICS_agg[naics]*area_one_floor

# new_R5 = 80% of new housing
# new_R6 = 20% of new housing
new_housing=all_new_LBCS_agg['1100']*area_one_floor
housing_counts['R5']+=new_housing*0.8
housing_counts['R6']+=new_housing*0.2

third_diversity=shannon_equitability_score([third_place_counts[code] for code in third_place_counts])
housing_diversity=shannon_equitability_score([housing_counts[code] for code in housing_counts])
edu_diversity=shannon_equitability_score([education_counts[code] for code in education_counts])


return [{'name': 'Diversity Jobs', 'value': job_diversity,'raw_value': job_diversity,
'viz_type': self.viz_type, 'units': None},
{'name': 'Diveristy Third Places', 'value': third_diversity, 'raw_value': third_diversity,
'viz_type': self.viz_type, 'units': None},
{'name': 'Diveristy Education', 'value': edu_diversity, 'raw_value': edu_diversity,
'viz_type': self.viz_type, 'units': None},
{'name': 'Diveristy Housing', 'value': housing_diversity, 'raw_value': housing_diversity,
'viz_type': self.viz_type, 'units': None}]


def main():
D = Diversity_Indicator()
D = DiversityIndicator()
H = Handler('corktown', quietly=False)
H.add_indicator(D)
# geogrid_data=H.get_geogrid_data()
Expand Down
Loading

0 comments on commit 2c60cc1

Please sign in to comment.