Skip to content

Commit

Permalink
Proximity aggregation to 3rd places.
Browse files Browse the repository at this point in the history
  • Loading branch information
doorleyr committed Jun 19, 2020
1 parent fe6ab0a commit d48684b
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 59 deletions.
74 changes: 51 additions & 23 deletions corktown_offline_indicators.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
import pandas as pd



folder='../Scenarios/17_Jun_20/'


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')
Expand Down Expand Up @@ -51,6 +55,8 @@

types.update(static_types)

reporting_types=[t for t in types if t not in ['None','Residential Low Density', 'Industrial']]

for ind in [I, P,
# P_hm,
M, B, D, E]:
Expand All @@ -59,27 +65,33 @@

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'))


geogrid_data_base=json.load(open('{}ford_base.json'.format(folder)))
geogrid_data_campus=json.load(open('{}ford_campus.json'.format(folder)))
geogrid_data_housing=json.load(open('{}ford_housing.json'.format(folder)))
geogrid_data_inno_com=json.load(open('{}ford_inno_com.json'.format(folder)))

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_type_stats(geogrid_data, reporting_types, updatable,cell_area, types_def=types):
results={}
for type_name in reporting_types:
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
results[type_name]= {'sqm_pp': sqm_pp, 'sqm': floors*cell_area,
'capacity':floors*cell_area/sqm_pp }
return results



Expand All @@ -104,32 +116,48 @@ def get_all_indicators(geogrid_data, future_mobility):
all_ind.extend(B.return_indicator(geogrid_data))
return all_ind

def create_scenario_row(all_ind, scenario_name):
def create_scenario_row(all_ind, stats, 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']
for type_name in stats:
all_cols[type_name + ' sqm']=stats[type_name]['sqm']
all_cols[type_name + ' capacity']=stats[type_name]['capacity']
return all_cols

base_indicators=get_all_indicators(geogrid_data_base, False)
base_stats=get_type_stats(geogrid_data_base, reporting_types, updatable,cell_area)

campus_indicators=get_all_indicators(geogrid_data_campus, False)
campus_stats=get_type_stats(geogrid_data_campus, reporting_types, updatable,cell_area)

campus_mobility_indicators=get_all_indicators(geogrid_data_campus, True)
campus_mobility_stats=campus_stats

housing_indicators=get_all_indicators(geogrid_data_housing, False)
housing_stats=get_type_stats(geogrid_data_housing, reporting_types, updatable,cell_area)

inno_com_indicators=get_all_indicators(geogrid_data_inno_com, True)
inno_com_stats=get_type_stats(geogrid_data_inno_com, reporting_types, updatable,cell_area)

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]
all_scenarios.append(create_scenario_row(base_indicators, base_stats, scenario_name='BAU'))
all_scenarios.append(create_scenario_row(campus_indicators, campus_stats, scenario_name='Campus Only'))
all_scenarios.append(create_scenario_row(campus_mobility_indicators, campus_mobility_stats, scenario_name='Future Mobility'))
all_scenarios.append(create_scenario_row(housing_indicators, housing_stats, scenario_name='Housing'))
all_scenarios.append(create_scenario_row(inno_com_indicators, inno_com_stats, 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]
for type_name in reporting_types:
col_order.append(type_name + ' sqm')
col_order.append(type_name + ' capacity')

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

output.to_csv('scenario_outputs.csv')
output.to_csv('{}scenario_outputs.csv'.format(folder))
4 changes: 2 additions & 2 deletions mobility_indicator.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def train(self):

def normalised_prediction(self, model, X_in, y_max, y_min):
y_pred=model.predict(X_in)[0]
print(y_pred)
# print(y_pred)
return {'raw':y_pred, 'norm': max(0, min(1,(y_pred-y_min)/(y_max-y_min)))}

def load_module(self):
Expand Down Expand Up @@ -105,7 +105,7 @@ def return_indicator(self, geogrid_data, future_mobility=1):
else:
x=0
X_pa.append(x)
print(self.co2_model_features)
# print(self.co2_model_features)
co2=self.normalised_prediction(self.co2_model, np.array(X_co2).reshape(1, -1),
self.max_co2, self.min_co2)
pa=self.normalised_prediction(self.pa_model, np.array(X_pa).reshape(1, -1),
Expand Down
75 changes: 41 additions & 34 deletions proximity_indicator.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from toolbox import Handler, Indicator
from indicator_tools import flatten_grid_cell_attributes


def approx_shape_centroid(geometry):
if geometry['type']=='Polygon':
centroid=list(np.mean(geometry['coordinates'][0], axis=0))
Expand Down Expand Up @@ -66,6 +67,7 @@ def setup(self,*args,**kwargs):
'2100': 'groceries',
'2200': 'restaurants',
}
self.agg_pois={'3rd Places': ['restaurants', 'groceries']}

def prepare_model(self):
print('Preparing model')
Expand Down Expand Up @@ -333,6 +335,9 @@ def create_access_geojson(self, grids):
return output_geojson

def return_indicator(self, geogrid_data):
# =============================================================================
# Get accessibility results for each node
# =============================================================================
sample_nodes_acc={n: {t:self.sample_nodes_acc_base[n][t] for t in self.all_poi_types
} for n in self.sample_nodes_acc_base}
grid_nodes_acc={n: {t:self.grid_nodes_acc_base[n][t] for t in self.all_poi_types
Expand Down Expand Up @@ -377,43 +382,45 @@ def return_indicator(self, geogrid_data):
sample_nodes_acc[n.split('s')[1]][poi]+=n_to_add
for n in grid_nodes_to_update:
grid_nodes_acc[n.split('g')[1]][poi]+=n_to_add


# if any lbcs in lbcs_to_pois
# get nodes to update
# for lbcs in all_lbcs:
# for poi in lbcs_to_pois[lbcs]
# n_to_add= lbcs_capacity

# if this_grid_lu in self.pois_per_lu:
# sample_nodes_to_update=self.affected_sample_nodes[str(gi)]
# grid_nodes_to_update=self.affected_grid_nodes[str(gi)]
# for poi in self.pois_per_lu[this_grid_lu]:
# if poi in self.all_poi_types:
# n_to_add=self.pois_per_lu[this_grid_lu][poi]
# if n_to_add<1:
# if random.uniform(0,1)<=n_to_add:
# n_to_add=1
# else:
# n_to_add=0
# for n in sample_nodes_to_update:
# sample_nodes_acc[n.split('s')[1]][poi]+=n_to_add
# for n in grid_nodes_to_update:
# grid_nodes_acc[n.split('g')[1]][poi]+=n_to_add
self.value_indicators=[]
# TODO: more generic way of deciding the "from" grids

# =============================================================================
# Compute the indicator values and/or create geojson
# =============================================================================

indicators={}
for poi in self.from_employ_pois:
this_indicator_raw=np.mean([grid_nodes_acc[str(g)][poi
indicators[poi]={}
raw=np.mean([grid_nodes_acc[str(g)][poi
] for g in range(len(geogrid_data)
) if geogrid_data[g]['name'] in self.employment_types])
this_indicator_norm=min(1, this_indicator_raw/self.scalers[poi])
self.value_indicators.append({'name': 'Access to {}'.format(poi), 'value': this_indicator_norm, 'raw_value': this_indicator_raw,'viz_type': self.viz_type, 'units': 'Capacity'})
indicators[poi]['raw']=raw
indicators[poi]['norm']=min(1, raw/self.scalers[poi])

for poi in self.from_housing_pois:
this_indicator_raw=np.mean([grid_nodes_acc[str(g)][poi
indicators[poi]={}
raw=np.mean([grid_nodes_acc[str(g)][poi
] for g in range(len(geogrid_data)
) if geogrid_data[g]['name'] in self.residential_types])
this_indicator_norm=min(1, this_indicator_raw/self.scalers[poi])
self.value_indicators.append({'name': 'Access to {}'.format(poi), 'value': this_indicator_norm, 'raw_value': this_indicator_raw, 'viz_type': self.viz_type, 'units': 'Capacity'})
indicators[poi]['raw']=raw
indicators[poi]['norm']=min(1, raw/self.scalers[poi])

for agg_poi in self.agg_pois:
this_agg_indicator_raw=np.mean([indicators[poi]['raw'] for poi in self.agg_pois[agg_poi]])
this_agg_indicator_norm=np.mean([indicators[poi]['norm'] for poi in self.agg_pois[agg_poi]])
# this_agg_indicator_raw=np.sum([indicators[poi]['raw'] for poi in self.agg_pois[agg_poi]])
# this_agg_indicator_norm=this_agg_indicator_raw/(np.sum([self.scalers[poi] for poi in self.agg_pois[agg_poi]]))
indicators[agg_poi]={'raw': this_agg_indicator_raw, 'norm': this_agg_indicator_norm}
indicators={k: v for k, v in indicators.items() if k not in self.agg_pois[agg_poi]}



self.value_indicators=[]
for poi in indicators:
self.value_indicators.append({'name': 'Access to {}'.format(poi),
'value': indicators[poi]['norm'],
'raw_value': indicators[poi]['raw'],
'viz_type': self.viz_type,
'units': 'Capacity'})
if self.indicator_type in ['heatmap', 'access']:
grid_geojson=self.create_access_geojson(sample_nodes_acc)
return grid_geojson
Expand All @@ -422,13 +429,13 @@ def return_indicator(self, geogrid_data):


def main():
P= ProxIndicator(name='proximity', indicator_type_in='heatmap',
table_name='corktown', viz_type_in='heatmap')
P= ProxIndicator(name='proximity', indicator_type_in='numeric',
table_name='corktown', viz_type_in='bar')
P.prepare_model()
# H = Handler('corktown', quietly=False)
# H.add_indicator(P)
#
# print(H.geogrid_data())
# geogrid_data=H.get_geogrid_data()
#
# print(H.list_indicators())
# print(H.update_package())
Expand Down

0 comments on commit d48684b

Please sign in to comment.