diff --git a/corktown_offline_indicators.py b/corktown_offline_indicators.py index 4881ecc..5daa462 100644 --- a/corktown_offline_indicators.py +++ b/corktown_offline_indicators.py @@ -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') @@ -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]: @@ -59,10 +65,12 @@ 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 @@ -70,16 +78,20 @@ ) 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 @@ -104,7 +116,7 @@ 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'] @@ -112,24 +124,40 @@ def create_scenario_row(all_ind, scenario_name): 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') \ No newline at end of file +output.to_csv('{}scenario_outputs.csv'.format(folder)) \ No newline at end of file diff --git a/mobility_indicator.py b/mobility_indicator.py index 21f83cf..ccd5692 100644 --- a/mobility_indicator.py +++ b/mobility_indicator.py @@ -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): @@ -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), diff --git a/proximity_indicator.py b/proximity_indicator.py index ad27f5c..d00dc06 100644 --- a/proximity_indicator.py +++ b/proximity_indicator.py @@ -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)) @@ -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') @@ -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 @@ -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 @@ -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())