"""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()