Source code for atra.stats.boundary_hazard_percentages
"""Summarise network-hazard intersections per-boundary (district, commune or province)
Purpose
-------
Collect network-hazard intersection attributes
- Combine with boundary Polygons to collect network-boundary intersection attributes
- Write final results to an Excel sheet
Input data requirements
-----------------------
1. Correct paths to all files and correct input parameters
2. Shapefiles of network-hazard intersections results with attributes:
- edge_id or node_id - String/Integer/Float Edge ID or Node ID of network
- length - Float length of edge intersecting with hazards
- geometry - Shapely geometry of edges as LineString or nodes as Points
3. Shapefile of administrative boundaries of Argentina with attributes:
- province_i - String/Integer ID of Province
- pro_name_e - String name of Province in English
- district_i - String/Integer ID of District
- dis_name_e - String name of District in English
- commune_id - String/Integer ID of Commune
- name_eng - String name of Commune in English
- geometry - Shapely geometry of boundary Polygon
Results
-------
1. Excel sheet of network-hazard-boundary intersection with attributes:
- edge_id/node_id - String name of intersecting edge ID or node ID
- length - Float length of intersection of edge LineString and hazard Polygon: Only for edges
- province_id - String/Integer ID of Province
- province_name - String name of Province in English
- district_id - String/Integer ID of District
- district_name - String name of District in English
- commune_id - String/Integer ID of Commune
- commune_name - String name of Commune in English
"""
import itertools
import os
import sys
import geopandas as gpd
import pandas as pd
from shapely.geometry import Polygon
from atra.utils import *
from atra.transport_flow_and_failure_functions import *
[docs]def main():
"""Summarise intersections
1. Specify the paths from where you to read and write:
- Input data
- Intermediate calcuations data
- Output results
2. Supply input data and parameters
- Names of the three Provinces - List of string types
- Names of modes - List of strings
- Names of output modes - List of strings
- Names of hazard bands - List of integers
- Names of hazard thresholds - List of integers
- Condition 'Yes' or 'No' is the users wants to process results
3. Give the paths to the input data files:
- Commune boundary and stats data shapefile
- Hazard datasets description Excel file
- String name of sheet in hazard datasets description Excel file
4. Specify the output files and paths to be created
"""
data_path, calc_path, output_path = load_config()['paths']['data'], load_config()[
'paths']['calc'], load_config()['paths']['output']
# Supply input data and parameters
modes = ['road','rail']
boundary_cols = ['department_id','department_name','province_id','province_name']
hazard_cols = ['climate_scenario','hazard_type','model','probability','year']
national_results = 'Yes'
# Give the paths to the input data files
national_file = os.path.join(output_path,
'network_stats',
'national_scale_boundary_stats.xlsx')
national_hazard_file = os.path.join(output_path,
'hazard_scenarios',
'national_scale_hazard_intersections.xlsx')
# Specify the output files and paths to be created
output_dir = os.path.join(output_path, 'network_stats')
if os.path.exists(output_dir) == False:
os.mkdir(output_dir)
# Process national scale results
if national_results == 'Yes':
print ('* Processing national scale results')
data_excel = os.path.join(
output_dir,'national_scale_hazards_stats.xlsx')
nat_excel_writer = pd.ExcelWriter(data_excel)
for m in range(len(modes)):
if modes[m] in ['road','rail']:
national_edges_stats = pd.read_excel(national_file,sheet_name=modes[m])
national_edges_stats = national_edges_stats.groupby(boundary_cols)['length'].sum().reset_index()
national_edges_stats.rename(columns={'length':'total_length'},inplace=True)
hazard_stats = pd.read_excel(national_hazard_file,sheet_name=modes[m])
hazard_stats = hazard_stats.groupby(boundary_cols+hazard_cols)['length'].sum().reset_index()
hazard_stats = pd.merge(hazard_stats,national_edges_stats,how='left', on=boundary_cols).fillna(0)
hazard_stats['percentage'] = 100.0*hazard_stats['length']/hazard_stats['total_length']
hazard_stats.to_excel(nat_excel_writer, modes[m], index=False)
nat_excel_writer.save()
del hazard_stats
if __name__ == "__main__":
main()