Source code for atra.stats.air_water_vulnerability_stats

"""Sum max/min total flow exposed under hazard scenarios at air and water network nodes
"""
import os
import sys

import geopandas as gpd
import pandas as pd
from atra.utils import *


[docs]def main(): incoming_data_path,data_path, calc_path, output_path = load_config()['paths']['incoming_data'],load_config()['paths']['data'], load_config()[ 'paths']['calc'], load_config()['paths']['output'] # Output to Excel # sheets: air, water impact_output_file = os.path.join( output_path, 'network_stats', 'air-water-node-impacts.xlsx') impact_summary_file = os.path.join( output_path, 'network_stats', 'air-water-node-impacts-summary.xlsx') hazard_file = os.path.join( output_path, 'hazard_scenarios') # read data print(" * Reading data") airports_with_flows = pd.read_csv(os.path.join(output_path,'network_stats','air_ranked_flows.csv'),encoding='utf-8-sig') airports_with_flows = airports_with_flows[airports_with_flows['passengers'] > 0][['node_id','name','passengers']] ports_with_flows = pd.read_csv(os.path.join(output_path,'network_stats','port_ranked_flows.csv'),encoding='utf-8-sig') ports_with_flows = ports_with_flows[ports_with_flows['max_total_tons'] > 0][['node_id','name','locality','min_total_tons','max_total_tons']] air_exposure, port_exposure = read_hazards(hazard_file) # save flows # join hazards print(" * Joining hazards") airports_with_hazards = join_hazards(airports_with_flows, air_exposure) ports_with_hazards = join_hazards(ports_with_flows, port_exposure) # save hazards with pd.ExcelWriter(impact_output_file) as writer: airports_with_hazards.to_excel(writer, sheet_name='air', index=False) ports_with_hazards.to_excel(writer, sheet_name='port', index=False) # summarise print(" * Summarising") airports_summary = summarise(airports_with_hazards,['name','passengers'],'passengers','air') ports_summary = summarise(ports_with_hazards,['name','locality','min_total_tons','max_total_tons'],'max_total_tons','port') # save summaries with pd.ExcelWriter(impact_summary_file) as writer: airports_summary.to_excel(writer, sheet_name='air') ports_summary.to_excel(writer, sheet_name='port') print(" * Done")
[docs]def read_hazards(hazard_file): data_air = pd.read_csv(os.path.join(hazard_file,'air_hazard_intersections.csv')) data_port = pd.read_csv(os.path.join(hazard_file,'port_hazard_intersections.csv')) keep_cols = ['node_id', 'hazard_type', 'model', 'climate_scenario', 'probability','min_depth','max_depth', 'year'] air_exposure = data_air[keep_cols] water_exposure = data_port[keep_cols] return air_exposure, water_exposure
[docs]def join_hazards(nodes_with_flows_df, hazards_df): return pd.merge( nodes_with_flows_df, hazards_df, how='inner', validate='one_to_many', on='node_id' )
[docs]def summarise(nodes_with_hazards_df,id_columns,sort_column,mode): grouped = nodes_with_hazards_df[ id_columns + ['hazard_type', 'climate_scenario', 'probability'] ].groupby( id_columns + ['hazard_type', 'climate_scenario'] ) min_prob = grouped.min( ).rename(columns={'probability': 'min_probability'}) max_prob = grouped.max( )[ ['probability'] ].rename(columns={'probability': 'max_probability'}) summary = pd.concat( [min_prob, max_prob], axis=1 ).sort_values( by=[sort_column, 'hazard_type', 'climate_scenario'], ascending=[False, True, True] ).rename( columns={ 'min_probability': 'Probability (minimum)', 'max_probability': 'Probability (maximum)', } ) if mode == 'port': summary.index.names = [ 'Name', # was 'name' 'Port cluster', 'Minimum flow (tons/day)', # was 'min_tons' 'Maximum flow (tons/day)', # was 'max_tons' 'Hazard type', # was 'hazard_type' 'Climate scenario', # was 'climate_scenario' ] elif mode == 'air': summary.index.names = [ 'Name', # was 'name' 'Passenger flow (passengers/year)', # was 'passenger' 'Hazard type', # was 'hazard_type' 'Climate scenario', # was 'climate_scenario' ] return summary
if __name__ == '__main__': main()