From 01de126b679c163c5b4d0864c5638b9ed1de2d43 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:08:42 +0200 Subject: [PATCH 01/53] Add CSV versions of input archetype files --- .../version/ALPS2023/arch_input_reg.csv | 45 +++++++++++++++++++ .../chilled/version/ALPS2023/arch_regions.csv | 23 ++++++++++ 2 files changed, 68 insertions(+) create mode 100644 message_ix_buildings/data/chilled/version/ALPS2023/arch_input_reg.csv create mode 100644 message_ix_buildings/data/chilled/version/ALPS2023/arch_regions.csv diff --git a/message_ix_buildings/data/chilled/version/ALPS2023/arch_input_reg.csv b/message_ix_buildings/data/chilled/version/ALPS2023/arch_input_reg.csv new file mode 100644 index 0000000..a140e91 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2023/arch_input_reg.csv @@ -0,0 +1,45 @@ +id,name,urt,arch,permanent,area_env,gl_perc,vol,fl_cnd,u_val,ach_cl,ach_op,gn_int,gl_g,gl_sh,roof_area,roof_abs,u_roof +0,AFR_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +1,AFR_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +2,CPA_r_new,rur,new,1,3.7,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,1,0.6,0.7 +3,CPA_u_new,urb,new,1,1.52,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.7 +4,EEU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +5,EEU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +6,FSU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +7,FSU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +8,LAC_r_new,rur,new,1,3.7,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,1,0.6,1.6 +9,LAC_u_new,urb,new,1,1.52,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.6 +10,MEA_r_new,rur,new,1,3.7,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,1,0.6,1 +11,MEA_r_new,urb,new,1,1.52,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1 +12,NAM_r_new,rur,new,1,3.7,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,1,0.6,0.34 +13,NAM_u_new,urb,new,1,1.52,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.34 +14,PAO_r_new,rur,new,1,3.7,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,1,0.6,0.35 +15,PAO_u_new,urb,new,1,1.52,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.35 +16,PAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +17,PAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +18,SAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +19,SAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +20,WEU_r_new,rur,new,1,3.7,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,1,0.6,0.2 +21,WEU_u_new,urb,new,1,1.52,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.2 +22,AFR_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +23,AFR_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +24,CPA_r_new,rur,exist,1,3.7,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,1,0.6,0.900 +25,CPA_u_new,urb,exist,1,1.52,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.900 +26,EEU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +27,EEU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +28,FSU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +29,FSU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +30,LAC_r_new,rur,exist,1,3.7,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +31,LAC_u_new,urb,exist,1,1.52,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +32,MEA_r_new,rur,exist,1,3.7,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +33,MEA_r_new,urb,exist,1,1.52,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +34,NAM_r_new,rur,exist,1,3.7,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,1,0.6,0.369 +35,NAM_u_new,urb,exist,1,1.52,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.369 +36,PAO_r_new,rur,exist,1,3.7,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,1,0.6,0.700 +37,PAO_u_new,urb,exist,1,1.52,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.700 +38,PAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +39,PAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +40,SAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +41,SAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +42,WEU_r_new,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 +43,WEU_u_new,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file diff --git a/message_ix_buildings/data/chilled/version/ALPS2023/arch_regions.csv b/message_ix_buildings/data/chilled/version/ALPS2023/arch_regions.csv new file mode 100644 index 0000000..15a8b74 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2023/arch_regions.csv @@ -0,0 +1,23 @@ +REGION_GEA,RegNum,arch,rural,urban +AFR,1,new,0,1 +CPA,2,new,2,3 +EEU,3,new,4,5 +FSU,4,new,6,7 +LAC,5,new,8,9 +MEA,6,new,10,11 +NAM,7,new,12,13 +PAO,8,new,14,15 +PAS,9,new,16,17 +SAS,10,new,18,19 +WEU,11,new,20,21 +AFR,1,exist,22,23 +CPA,2,exist,24,25 +EEU,3,exist,26,27 +FSU,4,exist,28,29 +LAC,5,exist,30,31 +MEA,6,exist,32,33 +NAM,7,exist,34,35 +PAO,8,exist,36,37 +PAS,9,exist,38,39 +SAS,10,exist,40,41 +WEU,11,exist,42,43 \ No newline at end of file From 46a8ac282dae2346fec60c0dfde9cf53f214bb5f Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:12:12 +0200 Subject: [PATCH 02/53] Update functions to read in CSVs and condense functions --- message_ix_buildings/chilled/util/util.py | 83 ++++++++--------------- 1 file changed, 27 insertions(+), 56 deletions(-) diff --git a/message_ix_buildings/chilled/util/util.py b/message_ix_buildings/chilled/util/util.py index 061ab3f..8209998 100644 --- a/message_ix_buildings/chilled/util/util.py +++ b/message_ix_buildings/chilled/util/util.py @@ -32,85 +32,56 @@ def get_archs(config: "Config"): version_path = os.path.join(root_path, "data", "chilled", "version", config.vstr) if config.arch_setting == "fixed": - input_file = os.path.join(version_path, "arch_input.xlsx") - - if os.path.exists(input_file): - input_file = os.path.join(version_path, "arch_input.xlsx") - archs = pd.ExcelFile(input_file).sheet_names - - return archs - else: - raise FileNotFoundError( - "Archetypes input file " - + input_file - + " does not exist! Please create file for input." - ) - + input_file = os.path.join(version_path, "arch_input.csv") elif config.arch_setting == "regional": - input_file = os.path.join( - version_path, - "arch_input_reg.xlsx", - ) + input_file = os.path.join(version_path, "arch_input_reg.csv") - if os.path.exists(input_file): - archs = pd.read_excel(input_file, sheet_name="arch").arch.unique().tolist() + if os.path.exists(input_file): + archs = pd.read_csv(input_file).arch.unique().tolist() - return archs - else: - raise FileNotFoundError( - "Archetypes input file " - + input_file - + " does not exist! Please create file for input" - ) + return archs + else: + raise FileNotFoundError( + "Archetypes input file " + + input_file + + " does not exist! Please create file for input." + ) -def read_arch_inputs_df(config: "Config", suff: str): +def read_arch_inputs_df(config: "Config"): root_path = get_project_root() version_path = os.path.join(root_path, "data", "chilled", "version", config.vstr) if config.arch_setting == "fixed": - input_file = os.path.join(version_path, "arch_input.xlsx") - - if os.path.exists(input_file): - arch_inputs = pd.read_excel(input_file, sheet_name=suff, index_col="id") - - return arch_inputs - else: - raise FileNotFoundError( - "Archetypes input file " - + input_file - + " does not exist! Please create file for input." - ) + input_file = os.path.join(version_path, "arch_input.csv") elif config.arch_setting == "regional": - input_file = os.path.join( - version_path, - "arch_input_reg.xlsx", - ) + input_file = os.path.join(version_path, "arch_input_reg.csv") - if os.path.exists(input_file): - arch_inputs = pd.read_excel(input_file, sheet_name="arch") + if os.path.exists(input_file): + arch_inputs = pd.read_csv(input_file) - return arch_inputs - else: - raise FileNotFoundError( - "Archetypes input file " - + input_file - + " does not exist! Please create file for input." - ) + return arch_inputs + + else: + raise FileNotFoundError( + "Archetypes input file " + + input_file + + " does not exist! Please create file for input." + ) -def read_arch_reg_df(config: "Config", arch: str): +def read_arch_reg_df(config: "Config"): root_path = get_project_root() version_path = os.path.join(root_path, "data", "chilled", "version", config.vstr) if config.arch_setting == "regional": reg_file = os.path.join( version_path, - "arch_regions.xlsx", + "arch_regions.csv", ) if os.path.exists(reg_file): - arch_reg = pd.read_excel(reg_file, sheet_name=arch) + arch_reg = pd.read_excel(reg_file) return arch_reg else: raise FileNotFoundError( From b8271ab3dd4c215815bd9dcac28ddb8e1419f459 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:12:30 +0200 Subject: [PATCH 03/53] Modify input parameters of updated function --- message_ix_buildings/chilled/preprocess/archetypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/preprocess/archetypes.py b/message_ix_buildings/chilled/preprocess/archetypes.py index 0e1ab0f..57ecb0b 100644 --- a/message_ix_buildings/chilled/preprocess/archetypes.py +++ b/message_ix_buildings/chilled/preprocess/archetypes.py @@ -49,7 +49,7 @@ def create_archetypes(config: "Config"): ) for arch in vers_archs: - arch_reg = read_arch_reg_df(config, arch) + arch_reg = read_arch_reg_df(config).query("arch == @arch") # Create map of archetypes based on MESSAGE regions raster arch_map = xr.Dataset( From d2da3ff4c6b51e9d83ba814f9853c669f908143e Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:13:53 +0200 Subject: [PATCH 04/53] Update parameters of function --- message_ix_buildings/chilled/preprocess/archetypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/preprocess/archetypes.py b/message_ix_buildings/chilled/preprocess/archetypes.py index 57ecb0b..aeaf55d 100644 --- a/message_ix_buildings/chilled/preprocess/archetypes.py +++ b/message_ix_buildings/chilled/preprocess/archetypes.py @@ -115,7 +115,7 @@ def map_archetype_variables(args): ) # read in input files - arch_inputs = read_arch_inputs_df(config, arch) + arch_inputs = read_arch_inputs_df(config).query("arch == @arch") # read in relevant archetype raster map = xr.open_dataset( From a8b31e6c587c78ad46cbe0cac7df070e9262912d Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:19:59 +0200 Subject: [PATCH 05/53] Add CSV files for `dle_coolssp` version --- .../version/dle_coolssp/arch_input_reg.csv | 45 +++++++++++++++++++ .../version/dle_coolssp/arch_regions.csv | 34 ++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv create mode 100644 message_ix_buildings/data/chilled/version/dle_coolssp/arch_regions.csv diff --git a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv new file mode 100644 index 0000000..b8eeb85 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv @@ -0,0 +1,45 @@ +id,name,urt,arch,permanent,area_env,gl_perc,vol,fl_cnd,u_val,ach_cl,ach_op,gn_int,gl_g,gl_sh,roof_area,roof_abs,u_roof +0,AFR_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +1,AFR_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +2,CPA_r_new,rur,new,1,3.7,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,1,0.6,0.7 +3,CPA_u_new,urb,new,1,1.52,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.7 +4,EEU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +5,EEU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +6,FSU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +7,FSU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +8,LAC_r_new,rur,new,1,3.7,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,1,0.6,1.6 +9,LAC_u_new,urb,new,1,1.52,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.6 +10,MEA_r_new,rur,new,1,3.7,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,1,0.6,1 +11,MEA_r_new,urb,new,1,1.52,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1 +12,NAM_r_new,rur,new,1,3.7,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,1,0.6,0.34 +13,NAM_u_new,urb,new,1,1.52,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.34 +14,PAO_r_new,rur,new,1,3.7,0.125,3,1,0.94,0.5,1.5,2.14,0.85,0.8,1,0.6,0.35 +15,PAO_u_new,urb,new,1,1.52,0.125,3,1,0.94,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.35 +16,PAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +17,PAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +18,SAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +19,SAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +20,WEU_r_new,rur,new,1,3.7,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,1,0.6,0.2 +21,WEU_u_new,urb,new,1,1.52,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.2 +22,AFR_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.3 +23,AFR_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.3 +24,CPA_r_new,rur,exist,1,3.7,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,1,0.6,0.9 +25,CPA_u_new,urb,exist,1,1.52,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.9 +26,EEU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.8 +27,EEU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.8 +28,FSU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.8 +29,FSU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.8 +30,LAC_r_new,rur,exist,1,3.7,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,1,0.6,1.75 +31,LAC_u_new,urb,exist,1,1.52,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.75 +32,MEA_r_new,rur,exist,1,3.7,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,1,0.6,1.75 +33,MEA_r_new,urb,exist,1,1.52,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.75 +34,NAM_r_new,rur,exist,1,3.7,0.125,3,1,1.56,0.5,1.5,2.14,0.85,0.8,1,0.6,0.369 +35,NAM_u_new,urb,exist,1,1.52,0.125,3,1,1.56,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.369 +36,PAO_r_new,rur,exist,1,3.7,0.125,3,1,1.33,0.5,1.5,2.14,0.85,0.8,1,0.6,0.7 +37,PAO_u_new,urb,exist,1,1.52,0.125,3,1,1.33,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.7 +38,PAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.3 +39,PAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.3 +40,SAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.3 +41,SAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.3 +42,WEU_r_new,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 +43,WEU_u_new,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file diff --git a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_regions.csv b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_regions.csv new file mode 100644 index 0000000..d1ac6d7 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_regions.csv @@ -0,0 +1,34 @@ +REGION_GEA,RegNum,arch,rural,urban +AFR,1,new,0,1 +CPA,2,new,2,3 +EEU,3,new,4,5 +FSU,4,new,6,7 +LAC,5,new,8,9 +MEA,6,new,10,11 +NAM,7,new,12,13 +PAO,8,new,14,15 +PAS,9,new,16,17 +SAS,10,new,18,19 +WEU,11,new,20,21 +AFR,1,exist,22,23 +CPA,2,exist,24,25 +EEU,3,exist,26,27 +FSU,4,exist,28,29 +LAC,5,exist,30,31 +MEA,6,exist,32,33 +NAM,7,exist,34,35 +PAO,8,exist,36,37 +PAS,9,exist,38,39 +SAS,10,exist,40,41 +WEU,11,exist,42,43 +AFR,1,low,44,45 +CPA,2,low,46,47 +EEU,3,low,48,49 +FSU,4,low,50,51 +LAC,5,low,52,53 +MEA,6,low,54,55 +NAM,7,low,56,57 +PAO,8,low,58,59 +PAS,9,low,60,61 +SAS,10,low,62,63 +WEU,11,low,64,65 \ No newline at end of file From 77078c128b13a71cd9960ed98088d8c9054cf780 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:21:25 +0200 Subject: [PATCH 06/53] Add CSV input files for `test` version --- .../chilled/version/test/arch_input_reg.csv | 45 +++++++++++++++++++ .../chilled/version/test/arch_regions.csv | 23 ++++++++++ 2 files changed, 68 insertions(+) create mode 100644 message_ix_buildings/data/chilled/version/test/arch_input_reg.csv create mode 100644 message_ix_buildings/data/chilled/version/test/arch_regions.csv diff --git a/message_ix_buildings/data/chilled/version/test/arch_input_reg.csv b/message_ix_buildings/data/chilled/version/test/arch_input_reg.csv new file mode 100644 index 0000000..a140e91 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/test/arch_input_reg.csv @@ -0,0 +1,45 @@ +id,name,urt,arch,permanent,area_env,gl_perc,vol,fl_cnd,u_val,ach_cl,ach_op,gn_int,gl_g,gl_sh,roof_area,roof_abs,u_roof +0,AFR_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +1,AFR_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +2,CPA_r_new,rur,new,1,3.7,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,1,0.6,0.7 +3,CPA_u_new,urb,new,1,1.52,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.7 +4,EEU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +5,EEU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +6,FSU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +7,FSU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +8,LAC_r_new,rur,new,1,3.7,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,1,0.6,1.6 +9,LAC_u_new,urb,new,1,1.52,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.6 +10,MEA_r_new,rur,new,1,3.7,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,1,0.6,1 +11,MEA_r_new,urb,new,1,1.52,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1 +12,NAM_r_new,rur,new,1,3.7,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,1,0.6,0.34 +13,NAM_u_new,urb,new,1,1.52,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.34 +14,PAO_r_new,rur,new,1,3.7,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,1,0.6,0.35 +15,PAO_u_new,urb,new,1,1.52,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.35 +16,PAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +17,PAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +18,SAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +19,SAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +20,WEU_r_new,rur,new,1,3.7,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,1,0.6,0.2 +21,WEU_u_new,urb,new,1,1.52,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.2 +22,AFR_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +23,AFR_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +24,CPA_r_new,rur,exist,1,3.7,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,1,0.6,0.900 +25,CPA_u_new,urb,exist,1,1.52,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.900 +26,EEU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +27,EEU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +28,FSU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +29,FSU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +30,LAC_r_new,rur,exist,1,3.7,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +31,LAC_u_new,urb,exist,1,1.52,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +32,MEA_r_new,rur,exist,1,3.7,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +33,MEA_r_new,urb,exist,1,1.52,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +34,NAM_r_new,rur,exist,1,3.7,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,1,0.6,0.369 +35,NAM_u_new,urb,exist,1,1.52,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.369 +36,PAO_r_new,rur,exist,1,3.7,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,1,0.6,0.700 +37,PAO_u_new,urb,exist,1,1.52,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.700 +38,PAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +39,PAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +40,SAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +41,SAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +42,WEU_r_new,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 +43,WEU_u_new,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file diff --git a/message_ix_buildings/data/chilled/version/test/arch_regions.csv b/message_ix_buildings/data/chilled/version/test/arch_regions.csv new file mode 100644 index 0000000..15a8b74 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/test/arch_regions.csv @@ -0,0 +1,23 @@ +REGION_GEA,RegNum,arch,rural,urban +AFR,1,new,0,1 +CPA,2,new,2,3 +EEU,3,new,4,5 +FSU,4,new,6,7 +LAC,5,new,8,9 +MEA,6,new,10,11 +NAM,7,new,12,13 +PAO,8,new,14,15 +PAS,9,new,16,17 +SAS,10,new,18,19 +WEU,11,new,20,21 +AFR,1,exist,22,23 +CPA,2,exist,24,25 +EEU,3,exist,26,27 +FSU,4,exist,28,29 +LAC,5,exist,30,31 +MEA,6,exist,32,33 +NAM,7,exist,34,35 +PAO,8,exist,36,37 +PAS,9,exist,38,39 +SAS,10,exist,40,41 +WEU,11,exist,42,43 \ No newline at end of file From f083caf59e4e584c69a212e7f086d05ce95048ff Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:21:54 +0200 Subject: [PATCH 07/53] Remove Excel files for `ALPS2023` version --- .../version/ALPS2023/arch_input_reg.xlsx | Bin 27580 -> 0 bytes .../chilled/version/ALPS2023/arch_regions.xlsx | Bin 22870 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 message_ix_buildings/data/chilled/version/ALPS2023/arch_input_reg.xlsx delete mode 100755 message_ix_buildings/data/chilled/version/ALPS2023/arch_regions.xlsx diff --git a/message_ix_buildings/data/chilled/version/ALPS2023/arch_input_reg.xlsx b/message_ix_buildings/data/chilled/version/ALPS2023/arch_input_reg.xlsx deleted file mode 100755 index a97cff8e31305203dbd0dded98421574481d818b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27580 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 diff --git a/message_ix_buildings/data/chilled/version/ALPS2023/arch_regions.xlsx b/message_ix_buildings/data/chilled/version/ALPS2023/arch_regions.xlsx deleted file mode 100755 index 803bbe6a99e1bb792fd61705843350f23881d19f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22870 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 From f0062ac85b6a92e57f174d34549dddd868fbc567 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:22:09 +0200 Subject: [PATCH 08/53] Remove Excel files for `dle_coolssp` version --- .../version/dle_coolssp/arch_input_reg.xlsx | Bin 23116 -> 0 bytes .../version/dle_coolssp/arch_regions.xlsx | Bin 21428 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.xlsx delete mode 100644 message_ix_buildings/data/chilled/version/dle_coolssp/arch_regions.xlsx diff --git a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.xlsx b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.xlsx deleted file mode 100644 index 69dcfe97dc7d157f36cb6af76ba393a662f1d99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23116 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 F@c>`N9*h70 diff --git a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_regions.xlsx b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_regions.xlsx deleted file mode 100644 index e318634c909d6d76f0c22607d728544a35f10ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21428 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 From 9ec16d5b2c20be2ed20fd979cab2104367c55d8a Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 15 Oct 2024 13:22:23 +0200 Subject: [PATCH 09/53] Remove Excel files for `test` version --- .../chilled/version/test/arch_input_reg.xlsx | Bin 27580 -> 0 bytes .../data/chilled/version/test/arch_regions.xlsx | Bin 22870 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 message_ix_buildings/data/chilled/version/test/arch_input_reg.xlsx delete mode 100755 message_ix_buildings/data/chilled/version/test/arch_regions.xlsx diff --git a/message_ix_buildings/data/chilled/version/test/arch_input_reg.xlsx b/message_ix_buildings/data/chilled/version/test/arch_input_reg.xlsx deleted file mode 100755 index a97cff8e31305203dbd0dded98421574481d818b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27580 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 diff --git a/message_ix_buildings/data/chilled/version/test/arch_regions.xlsx b/message_ix_buildings/data/chilled/version/test/arch_regions.xlsx deleted file mode 100755 index 803bbe6a99e1bb792fd61705843350f23881d19f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22870 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 From 7d861b629f285ff55a892eaa7277a0238b84083a Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 16 Oct 2024 18:09:10 +0200 Subject: [PATCH 10/53] Change `read_excel` to `read_csv` --- message_ix_buildings/chilled/util/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/util/util.py b/message_ix_buildings/chilled/util/util.py index 8209998..e3724e4 100644 --- a/message_ix_buildings/chilled/util/util.py +++ b/message_ix_buildings/chilled/util/util.py @@ -81,7 +81,7 @@ def read_arch_reg_df(config: "Config"): ) if os.path.exists(reg_file): - arch_reg = pd.read_excel(reg_file) + arch_reg = pd.read_csv(reg_file) return arch_reg else: raise FileNotFoundError( From 7bc8668bc7c60b6ab9e8f5acbeae450d47b740f5 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 16 Oct 2024 18:16:18 +0200 Subject: [PATCH 11/53] Fix naming in arch input of `dle_coolssp` scenario Copied over from /DLE - Analysis/Climate impacts and space conditioning/Data/input_data/arch_input_v17_dle_coolssp2050_reg.xlsx --- .../version/dle_coolssp/arch_input_reg.csv | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv index b8eeb85..0bed345 100644 --- a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv +++ b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv @@ -21,25 +21,25 @@ 19,SAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 20,WEU_r_new,rur,new,1,3.7,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,1,0.6,0.2 21,WEU_u_new,urb,new,1,1.52,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.2 -22,AFR_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.3 -23,AFR_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.3 -24,CPA_r_new,rur,exist,1,3.7,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,1,0.6,0.9 -25,CPA_u_new,urb,exist,1,1.52,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.9 -26,EEU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.8 -27,EEU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.8 -28,FSU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.8 -29,FSU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.8 -30,LAC_r_new,rur,exist,1,3.7,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,1,0.6,1.75 -31,LAC_u_new,urb,exist,1,1.52,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.75 -32,MEA_r_new,rur,exist,1,3.7,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,1,0.6,1.75 -33,MEA_r_new,urb,exist,1,1.52,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.75 -34,NAM_r_new,rur,exist,1,3.7,0.125,3,1,1.56,0.5,1.5,2.14,0.85,0.8,1,0.6,0.369 -35,NAM_u_new,urb,exist,1,1.52,0.125,3,1,1.56,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.369 -36,PAO_r_new,rur,exist,1,3.7,0.125,3,1,1.33,0.5,1.5,2.14,0.85,0.8,1,0.6,0.7 -37,PAO_u_new,urb,exist,1,1.52,0.125,3,1,1.33,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.7 -38,PAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.3 -39,PAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.3 -40,SAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.3 -41,SAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.3 -42,WEU_r_new,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 -43,WEU_u_new,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file +22,AFR_r_exist,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +23,AFR_u_exist,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +24,CPA_r_exist,rur,exist,1,3.7,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,1,0.6,0.900 +25,CPA_u_exist,urb,exist,1,1.52,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.900 +26,EEU_r_exist,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +27,EEU_u_exist,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +28,FSU_r_exist,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +29,FSU_u_exist,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +30,LAC_r_exist,rur,exist,1,3.7,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +31,LAC_u_exist,urb,exist,1,1.52,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +32,MEA_r_exist,rur,exist,1,3.7,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +33,MEA_r_exist,urb,exist,1,1.52,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +34,NAM_r_exist,rur,exist,1,3.7,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,1,0.6,0.369 +35,NAM_u_exist,urb,exist,1,1.52,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.369 +36,PAO_r_exist,rur,exist,1,3.7,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,1,0.6,0.700 +37,PAO_u_exist,urb,exist,1,1.52,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.700 +38,PAS_r_exist,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +39,PAS_u_exist,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +40,SAS_r_exist,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +41,SAS_u_exist,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +42,WEU_r_exist,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 +43,WEU_u_exist,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file From c7f3293bc53bb8675073301bda4f386d0b3c11a6 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 16 Oct 2024 18:17:54 +0200 Subject: [PATCH 12/53] Add arch input data for `low` arch Copied over from /DLE - Analysis/Climate impacts and space conditioning/Data/input_data/arch_input_v17_dle_coolssp2050_reg.xlsx --- .../version/dle_coolssp/arch_input_reg.csv | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv index 0bed345..8ea1f43 100644 --- a/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv +++ b/message_ix_buildings/data/chilled/version/dle_coolssp/arch_input_reg.csv @@ -42,4 +42,26 @@ 40,SAS_r_exist,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 41,SAS_u_exist,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 42,WEU_r_exist,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 -43,WEU_u_exist,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file +43,WEU_u_exist,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 +44,AFR_r_low,rur,low,1,3.7,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,1,0.6,0.230 +45,AFR_u_low,urb,low,1,1.52,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.230 +46,CPA_r_low,rur,low,1,3.7,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,1,0.6,0.230 +47,CPA_u_low,urb,low,1,1.52,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.230 +48,EEU_r_low,rur,low,1,3.7,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,1,0.6,0.150 +49,EEU_u_low,urb,low,1,1.52,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.150 +50,FSU_r_low,rur,low,1,3.7,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,1,0.6,0.150 +51,FSU_u_low,urb,low,1,1.52,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.150 +52,LAC_r_low,rur,low,1,3.7,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,1,0.6,0.230 +53,LAC_u_low,urb,low,1,1.52,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.230 +54,MEA_r_low,rur,low,1,3.7,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,1,0.6,0.230 +55,MEA_r_low,urb,low,1,1.52,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.230 +56,NAM_r_low,rur,low,1,3.7,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,1,0.6,0.150 +57,NAM_u_low,urb,low,1,1.52,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.150 +58,PAO_r_low,rur,low,1,3.7,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,1,0.6,0.150 +59,PAO_u_low,urb,low,1,1.52,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.150 +60,PAS_r_low,rur,low,1,3.7,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,1,0.6,0.230 +61,PAS_u_low,urb,low,1,1.52,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.230 +62,SAS_r_low,rur,low,1,3.7,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,1,0.6,0.230 +63,SAS_u_low,urb,low,1,1.52,0.125,3,1,0.591,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.230 +64,WEU_r_low,rur,low,1,3.7,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,1,0.6,0.150 +65,WEU_u_low,urb,low,1,1.52,0.125,3,1,0.380,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.150 \ No newline at end of file From c041c82e566f33a518be69d7918596d28e320a03 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 22 Oct 2024 16:51:46 +0200 Subject: [PATCH 13/53] Remove path setting in config --- message_ix_buildings/chilled/util/config.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/message_ix_buildings/chilled/util/config.py b/message_ix_buildings/chilled/util/config.py index f8ba6cb..bafe7ff 100644 --- a/message_ix_buildings/chilled/util/config.py +++ b/message_ix_buildings/chilled/util/config.py @@ -4,8 +4,6 @@ import numpy as np -from message_ix_buildings.chilled.functions.user_settings import DICT_USER_SETTINGS - @dataclass class Config: @@ -128,14 +126,6 @@ class Config: #: TODO: In the future, support "R12". node: Literal["R11"] = "R11" - #: Paths settings by user - project_path: str = str(DICT_USER_SETTINGS[user]["project_path"]) - dle_path: str = str(DICT_USER_SETTINGS[user]["dle_path"]) - message_region_file: str = str(DICT_USER_SETTINGS[user]["message_region_map_file"]) - isimip_bias_adj_path: str = str(DICT_USER_SETTINGS[user]["isimip_bias_adj_path"]) - isimip_ewemib_path: str = str(DICT_USER_SETTINGS[user]["isimip_ewembi_path"]) - chunk_size = DICT_USER_SETTINGS[user]["chunk_size"] - #: NetCDF settings netcdf4_format = "NETCDF4_CLASSIC" comp = dict(zlib=True, complevel=5) # Compression between 0 and 9 (highest) From 884681dc64b898ce12b02d0e59864e7a5f489947 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 22 Oct 2024 16:51:57 +0200 Subject: [PATCH 14/53] Add function to set paths based on user --- message_ix_buildings/chilled/util/util.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/util/util.py b/message_ix_buildings/chilled/util/util.py index e3724e4..af923aa 100644 --- a/message_ix_buildings/chilled/util/util.py +++ b/message_ix_buildings/chilled/util/util.py @@ -3,13 +3,24 @@ from pathlib import Path import pandas as pd -from util.config import Config # type: ignore + +from message_ix_buildings.chilled.functions.user_settings import DICT_USER_SETTINGS +from message_ix_buildings.chilled.util.config import Config # type: ignore def get_project_root() -> Path: return Path(__file__).parent.parent.parent +def get_paths(config: "Config", selection): + # if selection is chunk_size, then return chunk_size as is + # else, return string version of the path + if selection == "chunk_size": + return DICT_USER_SETTINGS[config.user][selection] + else: + return str(DICT_USER_SETTINGS[config.user][selection]) + + def get_logger(name: str): log = logging.getLogger(name) log.setLevel(logging.INFO) From 9497a7843fd481757febf58ddb566cd0583e0736 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 22 Oct 2024 16:52:06 +0200 Subject: [PATCH 15/53] Update path setting in other scripts --- message_ix_buildings/chilled/core/climate.py | 68 +++++++++++++------ .../chilled/postprocess/postprocess.py | 7 +- .../chilled/preprocess/archetypes.py | 9 ++- 3 files changed, 57 insertions(+), 27 deletions(-) diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index 94cdd4c..daf0dfe 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -48,6 +48,7 @@ from message_ix_buildings.chilled.util.util import ( get_archs, get_logger, + get_paths, load_all_scenarios_data, load_parametric_analysis_data, ) @@ -56,7 +57,11 @@ def create_climate_variables_maps(config: "Config", start_time: datetime.datetime): - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + dle_path = get_paths(config, "dle_path") + isimip_bias_adj_path = get_paths(config, "isimip_bias_adj_path") + + out_path = os.path.join(project_path, "out", "version", config.vstr) archetype_path = os.path.join(out_path, "rasters") save_path = os.path.join(out_path, "VDD_ene_calcs") @@ -105,10 +110,10 @@ def map_calculated_variables(args): endstr = ".nc" if str(clim) == "hist": - isi_folder = config.isimip_ewemib_path + isi_folder = isimip_ewemib_path filestr = climate_filestr_hist else: - isi_folder = config.isimip_bias_adj_path + isi_folder = isimip_bias_adj_path filestr = climate_filestr_future filepath = os.path.join( @@ -135,12 +140,12 @@ def map_calculated_variables(args): t_oa_gbm = t_out_ave.groupby("time.month") i_sol_v = xr.open_dataarray( - os.path.join(config.dle_path, "EWEMBI_vert_irrad_1980-2009_avg.nc") + os.path.join(dle_path, "EWEMBI_vert_irrad_1980-2009_avg.nc") ) # Values in daily Wh/m2 # Horizontal irradiation i_sol_h = xr.open_dataarray( - os.path.join(config.dle_path, "EWEMBI_horiz_irrad_1980-2009_avg.nc") + os.path.join(dle_path, "EWEMBI_horiz_irrad_1980-2009_avg.nc") ) # Values in daily Wh/m2 if config.arch_setting == "regional": @@ -756,7 +761,8 @@ def read_netcdf_files(input_args): def aggregate_urban_rural_files(config: "Config"): - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + out_path = os.path.join(project_path, "out", "version", config.vstr) save_path = os.path.join(out_path, "VDD_ene_calcs") output_path_vdd = os.path.join( @@ -834,7 +840,8 @@ def aggregate_urban_rural_files(config: "Config"): def make_vdd_total_maps(config: "Config"): - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + out_path = os.path.join(project_path, "out", "version", config.vstr) save_path = os.path.join(out_path, "VDD_ene_calcs") output_path_vdd = os.path.join( @@ -1133,7 +1140,9 @@ def make_map( def process_construction_shares(config: "Config"): - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + dle_path = get_paths(config, "dle_path") + out_path = os.path.join(project_path, "out", "version", config.vstr) floorarea_path = os.path.join(out_path, "floorarea_country") output_path = os.path.join( @@ -1153,7 +1162,7 @@ def process_construction_shares(config: "Config"): # If constr_setting == 1, then process construction shares. Otherwise, skip if config.constr_setting == 1: - input_path = config.dle_path + input_path = dle_path dsc = xr.Dataset() for urt in config.urts: @@ -1226,8 +1235,10 @@ def process_construction_shares(config: "Config"): def process_floor_area_maps(config: "Config"): - input_path = config.dle_path - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + dle_path = get_paths(config, "dle_path") + input_path = dle_path + out_path = os.path.join(project_path, "out", "version", config.vstr) save_path = os.path.join(out_path, "floorarea_country") output_path = os.path.join( @@ -1354,8 +1365,11 @@ def process_floor_area_maps(config: "Config"): def process_country_maps(config: "Config"): - input_path = config.dle_path - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + dle_path = get_paths(config, "dle_path") + + input_path = dle_path + out_path = os.path.join(project_path, "out", "version", config.vstr) save_path = os.path.join(out_path, "floorarea_country") output_path = os.path.join( @@ -1436,8 +1450,11 @@ def process_country_maps(config: "Config"): def process_final_maps(config: "Config"): - input_path = config.dle_path - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + dle_path = get_paths(config, "dle_path") + + input_path = dle_path + out_path = os.path.join(project_path, "out", "version", config.vstr) vdd_path = os.path.join( out_path, "VDD_ene_calcs", @@ -1835,8 +1852,11 @@ def process_final_maps(config: "Config"): def process_iso_tables(config: "Config"): start = datetime.datetime.now() - input_path = config.dle_path - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + dle_path = get_paths(config, "dle_path") + + input_path = dle_path + out_path = os.path.join(project_path, "out", "version", config.vstr) vdd_path = os.path.join(out_path, "VDD_ene_calcs", config.gcm, config.rcp) floorarea_path = os.path.join(out_path, "floorarea_country", config.gcm, config.rcp) finalmaps_path = os.path.join(out_path, "final_maps", config.gcm, config.rcp) @@ -2140,7 +2160,11 @@ def aggregate_ncfile(args: tuple) -> xr.Dataset: def create_climate_outputs(config: "Config", start_time: datetime.datetime): - out_path = os.path.join(config.project_path, "out", "version", config.vstr) + project_path = get_paths(config, "project_path") + dle_path = get_paths(config, "dle_path") + isimip_bias_adj_path = get_paths(config, "isimip_bias_adj_path") + isimip_ewemib_path = get_paths(config, "isimip_ewemib_path") + out_path = os.path.join(project_path, "out", "version", config.vstr) archetype_path = os.path.join(out_path, "rasters") save_path = os.path.join(out_path, "VDD_ene_calcs") @@ -2180,10 +2204,10 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): nyrs_clim = int(years_clim[1]) - int(years_clim[0]) + 1 if str(clim) == "hist": - isi_folder = config.isimip_ewemib_path + isi_folder = isimip_ewemib_path filestr = config.climate_filestr_hist else: - isi_folder = config.isimip_bias_adj_path + isi_folder = isimip_bias_adj_path filestr = config.climate_filestr_future filepath = os.path.join( @@ -2226,12 +2250,12 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): # Vertical irradiation # i_sol_v = xr.open_dataarray(input_folder+'CERES_vert_irrad_2001-13_avg.nc') #Values in daily Wh/m2 i_sol_v = xr.open_dataarray( - os.path.join(config.dle_path, "EWEMBI_vert_irrad_1980-2009_avg.nc") + os.path.join(dle_path, "EWEMBI_vert_irrad_1980-2009_avg.nc") ) # Values in daily Wh/m2 # Horizontal irradiation i_sol_h = xr.open_dataarray( - os.path.join(config.dle_path, "EWEMBI_horiz_irrad_1980-2009_avg.nc") + os.path.join(dle_path, "EWEMBI_horiz_irrad_1980-2009_avg.nc") ) # Values in daily Wh/m2 # i_sol = i_sol.sel(time=slice(years_clim[0],years_clim[1])) diff --git a/message_ix_buildings/chilled/postprocess/postprocess.py b/message_ix_buildings/chilled/postprocess/postprocess.py index fd4316f..bef248b 100644 --- a/message_ix_buildings/chilled/postprocess/postprocess.py +++ b/message_ix_buildings/chilled/postprocess/postprocess.py @@ -3,10 +3,11 @@ import pandas as pd from message_ix_buildings.chilled.util.config import Config -from message_ix_buildings.chilled.util.util import get_logger +from message_ix_buildings.chilled.util.util import get_logger, get_paths log = get_logger(__name__) -cfg = Config() +cfg = Config(user="MEAS") +dle_path = get_paths(cfg, "dle_path") def get_sturm_data(input_path, input_version_name): @@ -254,4 +255,4 @@ def postprocess_electricity_demand(input_path, input_version_name): ) -postprocess_electricity_demand(cfg.dle_path, cfg.vstr) +postprocess_electricity_demand(dle_path, cfg.vstr) diff --git a/message_ix_buildings/chilled/preprocess/archetypes.py b/message_ix_buildings/chilled/preprocess/archetypes.py index aeaf55d..a37c8c8 100644 --- a/message_ix_buildings/chilled/preprocess/archetypes.py +++ b/message_ix_buildings/chilled/preprocess/archetypes.py @@ -15,6 +15,7 @@ from message_ix_buildings.chilled.util.util import ( get_archs, get_logger, + get_paths, read_arch_inputs_df, read_arch_reg_df, ) @@ -23,7 +24,9 @@ def create_archetypes(config: "Config"): - out_path = os.path.join(config.project_path, "out", "version") + project_path = get_paths(config, "dle_path") + + out_path = os.path.join(project_path, "out", "version") archetype_path = os.path.join(out_path, config.vstr, "rasters") # if archetypes folder does not exist, create it @@ -101,7 +104,9 @@ def create_archetypes(config: "Config"): def create_archetype_variables(config: "Config"): - out_path = os.path.join(config.project_path, "out", "version") + project_path = get_paths(config, "dle_path") + + out_path = os.path.join(project_path, "out", "version") archetype_path = os.path.join(out_path, config.vstr, "rasters") # get archs From b728bf37892b23c8da499dfb05826fabfd8633d4 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 22 Oct 2024 16:53:24 +0200 Subject: [PATCH 16/53] Add second version string to correct data path Currently data is stored in a folder that has a version number on it. It would be better to remove this so the files being read won't be dependent on this numbering system but instead should only depend on version name. --- message_ix_buildings/chilled/postprocess/postprocess.py | 2 +- message_ix_buildings/chilled/util/config.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/postprocess/postprocess.py b/message_ix_buildings/chilled/postprocess/postprocess.py index bef248b..5ceabdf 100644 --- a/message_ix_buildings/chilled/postprocess/postprocess.py +++ b/message_ix_buildings/chilled/postprocess/postprocess.py @@ -255,4 +255,4 @@ def postprocess_electricity_demand(input_path, input_version_name): ) -postprocess_electricity_demand(dle_path, cfg.vstr) +postprocess_electricity_demand(dle_path, cfg.vstr2 + "_" + cfg.vstr) diff --git a/message_ix_buildings/chilled/util/config.py b/message_ix_buildings/chilled/util/config.py index bafe7ff..cac5d17 100644 --- a/message_ix_buildings/chilled/util/config.py +++ b/message_ix_buildings/chilled/util/config.py @@ -18,6 +18,7 @@ class Config: #: #: This is used to name the output files and directories. vstr: str = "ALPS2023" + vstr2 = "v19" #: Select the climate model. #: From 4e78f3fef88a867378bfe95f0545aedfb0f0881c Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 22 Oct 2024 17:01:13 +0200 Subject: [PATCH 17/53] Fix path name typo --- message_ix_buildings/chilled/core/climate.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index daf0dfe..45bb9bd 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -60,6 +60,7 @@ def create_climate_variables_maps(config: "Config", start_time: datetime.datetim project_path = get_paths(config, "project_path") dle_path = get_paths(config, "dle_path") isimip_bias_adj_path = get_paths(config, "isimip_bias_adj_path") + isimip_ewembi_path = get_paths(config, "isimip_ewembi_path") out_path = os.path.join(project_path, "out", "version", config.vstr) archetype_path = os.path.join(out_path, "rasters") @@ -110,7 +111,7 @@ def map_calculated_variables(args): endstr = ".nc" if str(clim) == "hist": - isi_folder = isimip_ewemib_path + isi_folder = isimip_ewembi_path filestr = climate_filestr_hist else: isi_folder = isimip_bias_adj_path From 4595c5cbe83ab9c42d1a67daed4e649c04c24e70 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 31 Oct 2024 13:53:13 +0100 Subject: [PATCH 18/53] Update paths to use `get_paths()` in preprocessing --- message_ix_buildings/chilled/preprocess/message_raster.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/message_ix_buildings/chilled/preprocess/message_raster.py b/message_ix_buildings/chilled/preprocess/message_raster.py index 60b3c17..e969dfe 100644 --- a/message_ix_buildings/chilled/preprocess/message_raster.py +++ b/message_ix_buildings/chilled/preprocess/message_raster.py @@ -10,6 +10,7 @@ import xarray as xr from message_ix_buildings.chilled.util.config import Config +from message_ix_buildings.chilled.util.util import get_paths def create_message_raster(config: "Config"): @@ -35,11 +36,12 @@ def create_message_raster(config: "Config"): ISO attributes in a dataframe """ - input_path = os.path.join(config.dle_path) + input_path = get_paths(config, "dle_path") + message_region_file = get_paths(config, "message_region_map_file") if config.node == "R11": msgregions = pd.read_excel( - config.message_region_file, + message_region_file, sheet_name="regional definition", ) From 96da133cb6ca45f7b96e73485122fbcb7ccdbf25 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 22 Oct 2024 17:19:08 +0200 Subject: [PATCH 19/53] Save postprocessed CHILLED data --- message_ix_buildings/chilled/postprocess/postprocess.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/message_ix_buildings/chilled/postprocess/postprocess.py b/message_ix_buildings/chilled/postprocess/postprocess.py index 5ceabdf..08d5c4b 100644 --- a/message_ix_buildings/chilled/postprocess/postprocess.py +++ b/message_ix_buildings/chilled/postprocess/postprocess.py @@ -197,6 +197,14 @@ def postprocess_electricity_demand(input_path, input_version_name): ) # Save files + + df_chilled.to_csv( + os.path.join(version_output_path, "chilled_postprocessed.csv"), + index=False, + ) + + log.info("Saved: " + os.path.join(version_output_path, "chilled_postprocessed.csv")) + df_sturm.to_csv( os.path.join(version_output_path, "sturm_building_stock_inputs.csv"), index=False, From f406a31cf38d487ea51b489cf0bb0159109cc144 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 31 Oct 2024 14:09:54 +0100 Subject: [PATCH 20/53] Rename `chilled.util.util` to `chilled.util.base` --- message_ix_buildings/chilled/core/climate.py | 4 ++-- message_ix_buildings/chilled/functions/regression.py | 2 +- message_ix_buildings/chilled/postprocess/postprocess.py | 2 +- message_ix_buildings/chilled/preprocess/archetypes.py | 4 ++-- message_ix_buildings/chilled/preprocess/message_raster.py | 2 +- message_ix_buildings/chilled/run_agg.py | 2 +- message_ix_buildings/chilled/run_main.py | 2 +- message_ix_buildings/chilled/run_preprocess.py | 2 +- message_ix_buildings/chilled/util/{util.py => base.py} | 0 9 files changed, 10 insertions(+), 10 deletions(-) rename message_ix_buildings/chilled/util/{util.py => base.py} (100%) diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index 45bb9bd..641744f 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -44,14 +44,14 @@ from message_ix_buildings.chilled.preprocess.message_raster import ( create_message_raster, # type: ignore ) -from message_ix_buildings.chilled.util.config import Config # type: ignore -from message_ix_buildings.chilled.util.util import ( +from message_ix_buildings.chilled.util.base import ( get_archs, get_logger, get_paths, load_all_scenarios_data, load_parametric_analysis_data, ) +from message_ix_buildings.chilled.util.config import Config # type: ignore log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/functions/regression.py b/message_ix_buildings/chilled/functions/regression.py index 2b13577..944d1d3 100644 --- a/message_ix_buildings/chilled/functions/regression.py +++ b/message_ix_buildings/chilled/functions/regression.py @@ -4,7 +4,7 @@ import pyam # type: ignore import statsmodels.formula.api as smf # type: ignore -from message_ix_buildings.chilled.util.util import get_logger +from message_ix_buildings.chilled.util.base import get_logger log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/postprocess/postprocess.py b/message_ix_buildings/chilled/postprocess/postprocess.py index 08d5c4b..083fb02 100644 --- a/message_ix_buildings/chilled/postprocess/postprocess.py +++ b/message_ix_buildings/chilled/postprocess/postprocess.py @@ -2,8 +2,8 @@ import pandas as pd +from message_ix_buildings.chilled.util.base import get_logger, get_paths from message_ix_buildings.chilled.util.config import Config -from message_ix_buildings.chilled.util.util import get_logger, get_paths log = get_logger(__name__) cfg = Config(user="MEAS") diff --git a/message_ix_buildings/chilled/preprocess/archetypes.py b/message_ix_buildings/chilled/preprocess/archetypes.py index a37c8c8..a84aea3 100644 --- a/message_ix_buildings/chilled/preprocess/archetypes.py +++ b/message_ix_buildings/chilled/preprocess/archetypes.py @@ -11,14 +11,14 @@ from functions.variable_dicts import VARS_ARCHETYPES # type: ignore from preprocess.message_raster import create_message_raster # type: ignore -from message_ix_buildings.chilled.util.config import Config # type: ignore -from message_ix_buildings.chilled.util.util import ( +from message_ix_buildings.chilled.util.base import ( get_archs, get_logger, get_paths, read_arch_inputs_df, read_arch_reg_df, ) +from message_ix_buildings.chilled.util.config import Config # type: ignore log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/preprocess/message_raster.py b/message_ix_buildings/chilled/preprocess/message_raster.py index e969dfe..864bde2 100644 --- a/message_ix_buildings/chilled/preprocess/message_raster.py +++ b/message_ix_buildings/chilled/preprocess/message_raster.py @@ -9,8 +9,8 @@ import pandas as pd import xarray as xr +from message_ix_buildings.chilled.util.base import get_paths from message_ix_buildings.chilled.util.config import Config -from message_ix_buildings.chilled.util.util import get_paths def create_message_raster(config: "Config"): diff --git a/message_ix_buildings/chilled/run_agg.py b/message_ix_buildings/chilled/run_agg.py index 7214b68..50e980f 100644 --- a/message_ix_buildings/chilled/run_agg.py +++ b/message_ix_buildings/chilled/run_agg.py @@ -10,8 +10,8 @@ process_floor_area_maps, process_iso_tables, ) +from message_ix_buildings.chilled.util.base import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore -from message_ix_buildings.chilled.util.util import get_logger log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/run_main.py b/message_ix_buildings/chilled/run_main.py index 08f34e6..ba28089 100644 --- a/message_ix_buildings/chilled/run_main.py +++ b/message_ix_buildings/chilled/run_main.py @@ -14,8 +14,8 @@ process_floor_area_maps, process_iso_tables, ) +from message_ix_buildings.chilled.util.base import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore -from message_ix_buildings.chilled.util.util import get_logger log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/run_preprocess.py b/message_ix_buildings/chilled/run_preprocess.py index d8f783f..54beea5 100644 --- a/message_ix_buildings/chilled/run_preprocess.py +++ b/message_ix_buildings/chilled/run_preprocess.py @@ -5,8 +5,8 @@ create_archetype_variables, create_archetypes, ) +from message_ix_buildings.chilled.util.base import get_logger from message_ix_buildings.chilled.util.config import Config -from message_ix_buildings.chilled.util.util import get_logger log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/util/util.py b/message_ix_buildings/chilled/util/base.py similarity index 100% rename from message_ix_buildings/chilled/util/util.py rename to message_ix_buildings/chilled/util/base.py From b7bd7f224ce54846891fa99afcd24dde6cf74125 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 31 Oct 2024 14:13:42 +0100 Subject: [PATCH 21/53] Move `get_logger()` and `get_project_root()` to new `chilled.util.common` --- message_ix_buildings/chilled/core/climate.py | 2 +- .../chilled/functions/regression.py | 2 +- .../chilled/postprocess/postprocess.py | 3 ++- .../chilled/preprocess/archetypes.py | 2 +- message_ix_buildings/chilled/run_agg.py | 2 +- message_ix_buildings/chilled/run_main.py | 2 +- .../chilled/run_preprocess.py | 2 +- message_ix_buildings/chilled/util/base.py | 26 ++----------------- message_ix_buildings/chilled/util/common.py | 23 ++++++++++++++++ 9 files changed, 33 insertions(+), 31 deletions(-) create mode 100644 message_ix_buildings/chilled/util/common.py diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index 641744f..884a111 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -46,11 +46,11 @@ ) from message_ix_buildings.chilled.util.base import ( get_archs, - get_logger, get_paths, load_all_scenarios_data, load_parametric_analysis_data, ) +from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/functions/regression.py b/message_ix_buildings/chilled/functions/regression.py index 944d1d3..7b3c2da 100644 --- a/message_ix_buildings/chilled/functions/regression.py +++ b/message_ix_buildings/chilled/functions/regression.py @@ -4,7 +4,7 @@ import pyam # type: ignore import statsmodels.formula.api as smf # type: ignore -from message_ix_buildings.chilled.util.base import get_logger +from message_ix_buildings.chilled.util.common import get_logger log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/postprocess/postprocess.py b/message_ix_buildings/chilled/postprocess/postprocess.py index 083fb02..2d7464b 100644 --- a/message_ix_buildings/chilled/postprocess/postprocess.py +++ b/message_ix_buildings/chilled/postprocess/postprocess.py @@ -2,7 +2,8 @@ import pandas as pd -from message_ix_buildings.chilled.util.base import get_logger, get_paths +from message_ix_buildings.chilled.util.base import get_paths +from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/preprocess/archetypes.py b/message_ix_buildings/chilled/preprocess/archetypes.py index a84aea3..adef491 100644 --- a/message_ix_buildings/chilled/preprocess/archetypes.py +++ b/message_ix_buildings/chilled/preprocess/archetypes.py @@ -13,11 +13,11 @@ from message_ix_buildings.chilled.util.base import ( get_archs, - get_logger, get_paths, read_arch_inputs_df, read_arch_reg_df, ) +from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/run_agg.py b/message_ix_buildings/chilled/run_agg.py index 50e980f..ec3f6cb 100644 --- a/message_ix_buildings/chilled/run_agg.py +++ b/message_ix_buildings/chilled/run_agg.py @@ -10,7 +10,7 @@ process_floor_area_maps, process_iso_tables, ) -from message_ix_buildings.chilled.util.base import get_logger +from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/run_main.py b/message_ix_buildings/chilled/run_main.py index ba28089..989337e 100644 --- a/message_ix_buildings/chilled/run_main.py +++ b/message_ix_buildings/chilled/run_main.py @@ -14,7 +14,7 @@ process_floor_area_maps, process_iso_tables, ) -from message_ix_buildings.chilled.util.base import get_logger +from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/run_preprocess.py b/message_ix_buildings/chilled/run_preprocess.py index 54beea5..b7da563 100644 --- a/message_ix_buildings/chilled/run_preprocess.py +++ b/message_ix_buildings/chilled/run_preprocess.py @@ -5,7 +5,7 @@ create_archetype_variables, create_archetypes, ) -from message_ix_buildings.chilled.util.base import get_logger +from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config log = get_logger(__name__) diff --git a/message_ix_buildings/chilled/util/base.py b/message_ix_buildings/chilled/util/base.py index af923aa..8f76443 100644 --- a/message_ix_buildings/chilled/util/base.py +++ b/message_ix_buildings/chilled/util/base.py @@ -1,15 +1,10 @@ -import logging import os -from pathlib import Path import pandas as pd from message_ix_buildings.chilled.functions.user_settings import DICT_USER_SETTINGS -from message_ix_buildings.chilled.util.config import Config # type: ignore - - -def get_project_root() -> Path: - return Path(__file__).parent.parent.parent +from message_ix_buildings.chilled.util.common import get_project_root # type: ignore +from message_ix_buildings.chilled.util.config import Config def get_paths(config: "Config", selection): @@ -21,23 +16,6 @@ def get_paths(config: "Config", selection): return str(DICT_USER_SETTINGS[config.user][selection]) -def get_logger(name: str): - log = logging.getLogger(name) - log.setLevel(logging.INFO) - - # configure the handler and formatter as needed - handler = logging.FileHandler(f"{name}.log", mode="w") - formatter = logging.Formatter("%(name)s %(asctime)s %(levelname)s %(message)s") - - # add formatter to the handler - handler.setFormatter(formatter) - - # add handler to the logger - log.addHandler(handler) - - return log - - def get_archs(config: "Config"): root_path = get_project_root() version_path = os.path.join(root_path, "data", "chilled", "version", config.vstr) diff --git a/message_ix_buildings/chilled/util/common.py b/message_ix_buildings/chilled/util/common.py new file mode 100644 index 0000000..4660f00 --- /dev/null +++ b/message_ix_buildings/chilled/util/common.py @@ -0,0 +1,23 @@ +import logging +from pathlib import Path + + +def get_project_root() -> Path: + return Path(__file__).parent.parent.parent + + +def get_logger(name: str): + log = logging.getLogger(name) + log.setLevel(logging.INFO) + + # configure the handler and formatter as needed + handler = logging.FileHandler(f"{name}.log", mode="w") + formatter = logging.Formatter("%(name)s %(asctime)s %(levelname)s %(message)s") + + # add formatter to the handler + handler.setFormatter(formatter) + + # add handler to the logger + log.addHandler(handler) + + return log From 8d340e9d1ffef89377f0f446916b7e96d84fb43f Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 31 Oct 2024 14:14:28 +0100 Subject: [PATCH 22/53] Change logging from FileHandler() to StreamHandler() on stdout This allows for the logs to be output in the terminal, which is helpful when running CHILLED on UniCC. --- message_ix_buildings/chilled/util/common.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/util/common.py b/message_ix_buildings/chilled/util/common.py index 4660f00..5d1e21d 100644 --- a/message_ix_buildings/chilled/util/common.py +++ b/message_ix_buildings/chilled/util/common.py @@ -1,4 +1,5 @@ import logging +import sys from pathlib import Path @@ -11,7 +12,7 @@ def get_logger(name: str): log.setLevel(logging.INFO) # configure the handler and formatter as needed - handler = logging.FileHandler(f"{name}.log", mode="w") + handler = logging.StreamHandler(sys.stdout) formatter = logging.Formatter("%(name)s %(asctime)s %(levelname)s %(message)s") # add formatter to the handler From 75bca5d924a122fd6dcf49168b9cbf60743abbdb Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 18 Dec 2024 15:39:02 +0100 Subject: [PATCH 23/53] Add Literal options in config --- message_ix_buildings/chilled/util/config.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/message_ix_buildings/chilled/util/config.py b/message_ix_buildings/chilled/util/config.py index cac5d17..3ef8ffc 100644 --- a/message_ix_buildings/chilled/util/config.py +++ b/message_ix_buildings/chilled/util/config.py @@ -47,25 +47,29 @@ class Config: #: #: 1 = run entire parametric analysis #: 0 = run only ref case - paranalysis_mode = 1 # 1 = run entire parametric analysis; 0 = run only ref case + paranalysis_mode: Literal[0, 1] = ( + 1 # 1 = run entire parametric analysis; 0 = run only ref case + ) #: Select whether to run simple (standard) degree days calculation. #: #: 1 = run simple (standard) degree days calculation #: 0 = don't run - runsdd = 0 # 1= run simple (standard) degree days calculation; 0 = don't run + runsdd: Literal[0, 1] = ( + 0 # 1= run simple (standard) degree days calculation; 0 = don't run + ) #: Select whether to run testing mode. #: #: 1 = selects only two years for testing #: 0 = select all years (full calculation) - testing_mode = 0 + testing_mode: Literal[0, 1] = 0 #: Select whether to fix population to SSP2. - popfix = True # If True, fix to SSP2, else.... (see script 4/5) + popfix: Literal[0, 1] = True # If True, fix to SSP2, else.... (see script 4/5) #: Select construction setting. - constr_setting = 0 + constr_setting: Literal[0, 1] = 0 #: Select floor setting. One of: #: @@ -93,13 +97,13 @@ class Config: #: #: 1 = calculate #: 0 = skip - cool = 1 + cool: Literal[0, 1] = 1 #: Select whether to run heating calculations. #: #: 1 = calculate #: 0 = skip - heat = 0 + heat: Literal[0, 1] = 0 #: Select solar gain calculation. One of: #: From 94ac6d94ed394e57157e4463c9b5eb828f0caefe Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 18 Dec 2024 15:39:35 +0100 Subject: [PATCH 24/53] Fix Literal options for popfix --- message_ix_buildings/chilled/util/config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/util/config.py b/message_ix_buildings/chilled/util/config.py index 3ef8ffc..d3c0b67 100644 --- a/message_ix_buildings/chilled/util/config.py +++ b/message_ix_buildings/chilled/util/config.py @@ -66,7 +66,9 @@ class Config: testing_mode: Literal[0, 1] = 0 #: Select whether to fix population to SSP2. - popfix: Literal[0, 1] = True # If True, fix to SSP2, else.... (see script 4/5) + popfix: Literal[True, False] = ( + True # If True, fix to SSP2, else.... (see script 4/5) + ) #: Select construction setting. constr_setting: Literal[0, 1] = 0 From 1415f2e9ae6614718667b68fea72962ddb4f6101 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 10:43:23 +0100 Subject: [PATCH 25/53] Create version for ALPS2024 (copied over from ALPS2023) --- .../version/ALPS2024/arch_input_reg.csv | 45 +++++++++++++++++++ .../chilled/version/ALPS2024/arch_regions.csv | 23 ++++++++++ .../data/chilled/version/ALPS2024/par_var.csv | 4 ++ .../data/chilled/version/ALPS2024/runs.csv | 11 +++++ 4 files changed, 83 insertions(+) create mode 100644 message_ix_buildings/data/chilled/version/ALPS2024/arch_input_reg.csv create mode 100644 message_ix_buildings/data/chilled/version/ALPS2024/arch_regions.csv create mode 100755 message_ix_buildings/data/chilled/version/ALPS2024/par_var.csv create mode 100755 message_ix_buildings/data/chilled/version/ALPS2024/runs.csv diff --git a/message_ix_buildings/data/chilled/version/ALPS2024/arch_input_reg.csv b/message_ix_buildings/data/chilled/version/ALPS2024/arch_input_reg.csv new file mode 100644 index 0000000..a140e91 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024/arch_input_reg.csv @@ -0,0 +1,45 @@ +id,name,urt,arch,permanent,area_env,gl_perc,vol,fl_cnd,u_val,ach_cl,ach_op,gn_int,gl_g,gl_sh,roof_area,roof_abs,u_roof +0,AFR_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +1,AFR_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +2,CPA_r_new,rur,new,1,3.7,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,1,0.6,0.7 +3,CPA_u_new,urb,new,1,1.52,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.7 +4,EEU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +5,EEU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +6,FSU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +7,FSU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +8,LAC_r_new,rur,new,1,3.7,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,1,0.6,1.6 +9,LAC_u_new,urb,new,1,1.52,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.6 +10,MEA_r_new,rur,new,1,3.7,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,1,0.6,1 +11,MEA_r_new,urb,new,1,1.52,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1 +12,NAM_r_new,rur,new,1,3.7,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,1,0.6,0.34 +13,NAM_u_new,urb,new,1,1.52,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.34 +14,PAO_r_new,rur,new,1,3.7,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,1,0.6,0.35 +15,PAO_u_new,urb,new,1,1.52,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.35 +16,PAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +17,PAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +18,SAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +19,SAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +20,WEU_r_new,rur,new,1,3.7,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,1,0.6,0.2 +21,WEU_u_new,urb,new,1,1.52,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.2 +22,AFR_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +23,AFR_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +24,CPA_r_new,rur,exist,1,3.7,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,1,0.6,0.900 +25,CPA_u_new,urb,exist,1,1.52,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.900 +26,EEU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +27,EEU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +28,FSU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +29,FSU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +30,LAC_r_new,rur,exist,1,3.7,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +31,LAC_u_new,urb,exist,1,1.52,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +32,MEA_r_new,rur,exist,1,3.7,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +33,MEA_r_new,urb,exist,1,1.52,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +34,NAM_r_new,rur,exist,1,3.7,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,1,0.6,0.369 +35,NAM_u_new,urb,exist,1,1.52,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.369 +36,PAO_r_new,rur,exist,1,3.7,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,1,0.6,0.700 +37,PAO_u_new,urb,exist,1,1.52,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.700 +38,PAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +39,PAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +40,SAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +41,SAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +42,WEU_r_new,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 +43,WEU_u_new,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file diff --git a/message_ix_buildings/data/chilled/version/ALPS2024/arch_regions.csv b/message_ix_buildings/data/chilled/version/ALPS2024/arch_regions.csv new file mode 100644 index 0000000..15a8b74 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024/arch_regions.csv @@ -0,0 +1,23 @@ +REGION_GEA,RegNum,arch,rural,urban +AFR,1,new,0,1 +CPA,2,new,2,3 +EEU,3,new,4,5 +FSU,4,new,6,7 +LAC,5,new,8,9 +MEA,6,new,10,11 +NAM,7,new,12,13 +PAO,8,new,14,15 +PAS,9,new,16,17 +SAS,10,new,18,19 +WEU,11,new,20,21 +AFR,1,exist,22,23 +CPA,2,exist,24,25 +EEU,3,exist,26,27 +FSU,4,exist,28,29 +LAC,5,exist,30,31 +MEA,6,exist,32,33 +NAM,7,exist,34,35 +PAO,8,exist,36,37 +PAS,9,exist,38,39 +SAS,10,exist,40,41 +WEU,11,exist,42,43 \ No newline at end of file diff --git a/message_ix_buildings/data/chilled/version/ALPS2024/par_var.csv b/message_ix_buildings/data/chilled/version/ALPS2024/par_var.csv new file mode 100755 index 0000000..adb40a3 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024/par_var.csv @@ -0,0 +1,4 @@ +id_run,name_run,cop,eff,t_sp_c,t_sp_c_max,t_sp_h,f_c,f_f,f_h +0,tm23ts23,1,1,23,23,21,0.333,0.333,1 +1,tm28ts26,1,1,26,28,20,0.333,0.333,1 +2,tm26ts26,1,1,26,26,20,0.333,0.333,1 diff --git a/message_ix_buildings/data/chilled/version/ALPS2024/runs.csv b/message_ix_buildings/data/chilled/version/ALPS2024/runs.csv new file mode 100755 index 0000000..813cc1e --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024/runs.csv @@ -0,0 +1,11 @@ +id,scen,year,clim +1,ssp2,2015,2015 +2,ssp2,2020,2020 +3,ssp2,2030,2030 +4,ssp2,2040,2040 +5,ssp2,2050,2050 +6,ssp2,2060,2060 +7,ssp2,2070,2070 +8,ssp2,2080,2080 +9,ssp2,2090,2090 +10,ssp2,2100,2100 From 5fa2514c59918589214149e04cdb69cf39da2331 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 10:44:48 +0100 Subject: [PATCH 26/53] Turn on both cooling and heating in config as default --- message_ix_buildings/chilled/util/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/util/config.py b/message_ix_buildings/chilled/util/config.py index d3c0b67..d50fd04 100644 --- a/message_ix_buildings/chilled/util/config.py +++ b/message_ix_buildings/chilled/util/config.py @@ -105,7 +105,7 @@ class Config: #: #: 1 = calculate #: 0 = skip - heat: Literal[0, 1] = 0 + heat: Literal[0, 1] = 1 #: Select solar gain calculation. One of: #: From 19a3dd84599ef95cf87eaad47d34c3b95901f7c1 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 10:53:43 +0100 Subject: [PATCH 27/53] Replace `config.chunk_size` with `get_paths(config, chunk_size)` --- message_ix_buildings/chilled/core/climate.py | 62 +++++++++++++------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index 884a111..8f2efab 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -125,14 +125,14 @@ def map_calculated_variables(args): if config.rcp == "rcp26": dst = xr.open_mfdataset( filepath, - chunks={"lon": config.chunk_size}, + chunks={"lon": get_paths(config, "chunk_size")}, concat_dim="time", use_cftime=True, ) # Setting for RCP2.6 else: dst = xr.open_mfdataset( filepath, - chunks={"lon": config.chunk_size}, + chunks={"lon": get_paths(config, "chunk_size")}, ) # , concat_dim='time' ) # Setting for RCP6.0 dst_crop = dst.sel(time=slice(years_clim[0], years_clim[1])) @@ -202,7 +202,7 @@ def map_calculated_variables(args): log.info("Stage 3 - Simple HDDCDD - cooling") log.info("Balance temp " + str(bal_temp) + "C") sdd_c = calc_SCDD_m(t_out_ave, bal_temp) - sdd_c = sdd_c.chunk(chunks={"lon": config.chunk_size}) + sdd_c = sdd_c.chunk(chunks={"lon": get_paths(config, "chunk_size")}) log.info("chunked") sdd_c.attrs = { "name": "sdd_c", @@ -235,7 +235,7 @@ def map_calculated_variables(args): log.info("Stage 3 - Simple HDDCDD - heating") log.info("Balance temp " + str(bal_temp) + "C") sdd_h = calc_SHDD_m(t_out_ave, bal_temp) - sdd_h = sdd_h.chunk(chunks={"lon": config.chunk_size}) + sdd_h = sdd_h.chunk(chunks={"lon": get_paths(config, "chunk_size")}) log.info("chunked") sdd_h.attrs = { "name": "sdd_h", @@ -282,7 +282,7 @@ def read_netcdf_files(input_args): dict_netcdf["gl_g"], dict_netcdf["gl_sh"], ) - gn_sol = gn_sol.chunk(chunks={"lon": config.chunk_size}) + gn_sol = gn_sol.chunk(chunks={"lon": get_paths(config, "chunk_size")}) log.info("chunked") gn_sol.attrs = { "name": "gn_sol", @@ -317,7 +317,7 @@ def read_netcdf_files(input_args): dict_netcdf["roof_abs"], dict_netcdf["u_roof"], ) - gn_sol = gn_sol.chunk(chunks={"lon": config.chunk_size}) + gn_sol = gn_sol.chunk(chunks={"lon": get_paths(config, "chunk_size")}) log.info("chunked") gn_sol.attrs = { "name": "gn_sol", @@ -348,7 +348,7 @@ def read_netcdf_files(input_args): dict_netcdf["roof_abs"], dict_netcdf["u_roof"], ) - gn_sol = gn_sol.chunk(chunks={"lon": config.chunk_size}) + gn_sol = gn_sol.chunk(chunks={"lon": get_paths(config, "chunk_size")}) log.info("chunked") gn_sol.attrs = { "name": "gn_sol", @@ -403,7 +403,7 @@ def read_netcdf_files(input_args): t_bal_c = calc_t_bal_c( t_sp_c, dict_netcdf["gn_int"], gn_sol, H_tr, H_v_cl ).astype("float32") # , x_diff0 - t_bal_c = t_bal_c.chunk(chunks={"lon": config.chunk_size}) + t_bal_c = t_bal_c.chunk(chunks={"lon": get_paths(config, "chunk_size")}) log.info("chunked") t_bal_c.attrs = { "name": "t_bal_c", @@ -511,7 +511,9 @@ def read_netcdf_files(input_args): with ProgressBar(): log.info("Calc_vdd_tmax_c") vdd_tmax_c = calc_vdd_tmax_c(t_oa_gbm, t_max_c) - vdd_tmax_c = vdd_tmax_c.chunk(chunks={"lon": config.chunk_size}) + vdd_tmax_c = vdd_tmax_c.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) vdd_tmax_c = ( vdd_tmax_c.groupby("time.month").sum("time") / nyrs_clim ) # <<< divide by years @@ -637,7 +639,7 @@ def read_netcdf_files(input_args): t_bal_h = calc_t_bal_h( t_sp_h, dict_netcdf["gn_int"], gn_sol, H_tr, H_v_cl ).astype("float32") # , x_diff0 - t_bal_h = t_bal_h.chunk(chunks={"lon": config.chunk_size}) + t_bal_h = t_bal_h.chunk(chunks={"lon": get_paths(config, "chunk_size")}) log.info("chunked") t_bal_h.attrs = { "name": "t_bal_h", @@ -665,7 +667,7 @@ def read_netcdf_files(input_args): with ProgressBar(): log.info("calc_vdd_h") vdd_h = calc_vdd_h(t_oa_gbm, t_bal_h) - vdd_h = vdd_h.chunk(chunks={"lon": config.chunk_size}) + vdd_h = vdd_h.chunk(chunks={"lon": get_paths(config, "chunk_size")}) vdd_h = ( vdd_h.groupby("time.month").sum("time") / nyrs_clim ) # <<< divide by years @@ -2217,14 +2219,14 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): if config.rcp == "rcp26": dst = xr.open_mfdataset( filepath, - chunks={"lon": config.chunk_size}, + chunks={"lon": get_paths(config, "chunk_size")}, concat_dim="time", use_cftime=True, ) # Setting for RCP2.6 else: dst = xr.open_mfdataset( filepath, - chunks={"lon": config.chunk_size}, + chunks={"lon": get_paths(config, "chunk_size")}, ) # , concat_dim='time' ) # Setting for RCP6.0 dst_crop = dst.sel(time=slice(years_clim[0], years_clim[1])) @@ -2331,7 +2333,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): log.info("Stage 3 - Simple HDDCDD - cooling") log.info("Balance temp " + str(bal_temp) + "C") sdd_c = calc_SCDD_m(t_out_ave, bal_temp) - sdd_c = sdd_c.chunk(chunks={"lon": config.chunk_size}) + sdd_c = sdd_c.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) log.info("chunked") sdd_c.attrs = { "name": "sdd_c", @@ -2363,7 +2367,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): log.info("Stage 3 - Simple HDDCDD - heating") log.info("Balance temp " + str(bal_temp) + "C") sdd_h = calc_SHDD_m(t_out_ave, bal_temp) - sdd_h = sdd_h.chunk(chunks={"lon": config.chunk_size}) + sdd_h = sdd_h.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) log.info("chunked") sdd_h.attrs = { "name": "sdd_h", @@ -2443,7 +2449,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): with ProgressBar(): log.info("Stage 3 - calc gn_sol") gn_sol = calc_gn_sol(i_sol_v, gl_perc, gl_g, gl_sh) - gn_sol = gn_sol.chunk(chunks={"lon": config.chunk_size}) + gn_sol = gn_sol.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) log.info("chunked") gn_sol.attrs = { "name": "gn_sol", @@ -2485,7 +2493,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): roof_abs, u_roof, ) - gn_sol = gn_sol.chunk(chunks={"lon": config.chunk_size}) + gn_sol = gn_sol.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) log.info("chunked") gn_sol.attrs = { "name": "gn_sol", @@ -2518,7 +2528,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): with ProgressBar(): log.info("Stage 3 - calc gn_sol") gn_sol = calc_gn_sol_h(i_sol_h, roof_area, roof_abs, u_roof) - gn_sol = gn_sol.chunk(chunks={"lon": config.chunk_size}) + gn_sol = gn_sol.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) log.info("chunked") gn_sol.attrs = { "name": "gn_sol", @@ -2633,7 +2645,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): t_bal_c = calc_t_bal_c( t_sp_c, gn_int, gn_sol, H_tr, H_v_cl ).astype("float32") # , x_diff0 - t_bal_c = t_bal_c.chunk(chunks={"lon": config.chunk_size}) + t_bal_c = t_bal_c.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) log.info("chunked") t_bal_c.attrs = { "name": "t_bal_c", @@ -2759,7 +2773,7 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): log.info("Calc_vdd_tmax_c") vdd_tmax_c = calc_vdd_tmax_c(t_oa_gbm, t_max_c) vdd_tmax_c = vdd_tmax_c.chunk( - chunks={"lon": config.chunk_size} + chunks={"lon": get_paths(config, "chunk_size")} ) vdd_tmax_c = ( vdd_tmax_c.groupby("time.month").sum("time") / nyrs_clim @@ -2919,7 +2933,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): t_bal_h = calc_t_bal_h( t_sp_h, gn_int, gn_sol, H_tr, H_v_cl ).astype("float32") # , x_diff0 - t_bal_h = t_bal_h.chunk(chunks={"lon": config.chunk_size}) + t_bal_h = t_bal_h.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) log.info("chunked") t_bal_h.attrs = { "name": "t_bal_h", @@ -2954,7 +2970,9 @@ def create_climate_outputs(config: "Config", start_time: datetime.datetime): with ProgressBar(): log.info("calc_vdd_h") vdd_h = calc_vdd_h(t_oa_gbm, t_bal_h) - vdd_h = vdd_h.chunk(chunks={"lon": config.chunk_size}) + vdd_h = vdd_h.chunk( + chunks={"lon": get_paths(config, "chunk_size")} + ) vdd_h = ( vdd_h.groupby("time.month").sum("time") / nyrs_clim ) # <<< divide by years From fd2b17f4dcaf0c824716bd935cfa3ee03eeb00f2 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 12:00:01 +0100 Subject: [PATCH 28/53] Change path that preprocess rasters are saved to --- message_ix_buildings/chilled/preprocess/archetypes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/message_ix_buildings/chilled/preprocess/archetypes.py b/message_ix_buildings/chilled/preprocess/archetypes.py index adef491..d7479f3 100644 --- a/message_ix_buildings/chilled/preprocess/archetypes.py +++ b/message_ix_buildings/chilled/preprocess/archetypes.py @@ -24,7 +24,7 @@ def create_archetypes(config: "Config"): - project_path = get_paths(config, "dle_path") + project_path = get_paths(config, "project_path") out_path = os.path.join(project_path, "out", "version") archetype_path = os.path.join(out_path, config.vstr, "rasters") @@ -104,7 +104,7 @@ def create_archetypes(config: "Config"): def create_archetype_variables(config: "Config"): - project_path = get_paths(config, "dle_path") + project_path = get_paths(config, "project_path") out_path = os.path.join(project_path, "out", "version") archetype_path = os.path.join(out_path, config.vstr, "rasters") From 772dd438ce278874ad508e5c40fa1ecd34ed99fa Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 13:02:32 +0100 Subject: [PATCH 29/53] Add input data for ALPS2024 version with only heating --- .../version/ALPS2024_heat/arch_input_reg.csv | 45 +++++++++++++++++++ .../version/ALPS2024_heat/arch_regions.csv | 23 ++++++++++ .../chilled/version/ALPS2024_heat/par_var.csv | 4 ++ .../chilled/version/ALPS2024_heat/runs.csv | 11 +++++ 4 files changed, 83 insertions(+) create mode 100644 message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_input_reg.csv create mode 100644 message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_regions.csv create mode 100755 message_ix_buildings/data/chilled/version/ALPS2024_heat/par_var.csv create mode 100755 message_ix_buildings/data/chilled/version/ALPS2024_heat/runs.csv diff --git a/message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_input_reg.csv b/message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_input_reg.csv new file mode 100644 index 0000000..a140e91 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_input_reg.csv @@ -0,0 +1,45 @@ +id,name,urt,arch,permanent,area_env,gl_perc,vol,fl_cnd,u_val,ach_cl,ach_op,gn_int,gl_g,gl_sh,roof_area,roof_abs,u_roof +0,AFR_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +1,AFR_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +2,CPA_r_new,rur,new,1,3.7,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,1,0.6,0.7 +3,CPA_u_new,urb,new,1,1.52,0.125,3,1,1.525,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.7 +4,EEU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +5,EEU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +6,FSU_r_new,rur,new,1,3.7,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,1,0.6,0.23 +7,FSU_u_new,urb,new,1,1.52,0.125,3,1,0.705,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.23 +8,LAC_r_new,rur,new,1,3.7,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,1,0.6,1.6 +9,LAC_u_new,urb,new,1,1.52,0.125,3,1,2.65,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.6 +10,MEA_r_new,rur,new,1,3.7,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,1,0.6,1 +11,MEA_r_new,urb,new,1,1.52,0.125,3,1,2.5,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1 +12,NAM_r_new,rur,new,1,3.7,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,1,0.6,0.34 +13,NAM_u_new,urb,new,1,1.52,0.125,3,1,1.39,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.34 +14,PAO_r_new,rur,new,1,3.7,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,1,0.6,0.35 +15,PAO_u_new,urb,new,1,1.52,0.125,3,1,0.940,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.35 +16,PAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +17,PAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +18,SAS_r_new,rur,new,1,3.7,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,1,0.6,2.7 +19,SAS_u_new,urb,new,1,1.52,0.125,3,1,3.025,0.5,1.5,2.14,0.85,0.8,0.25,0.6,2.7 +20,WEU_r_new,rur,new,1,3.7,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,1,0.6,0.2 +21,WEU_u_new,urb,new,1,1.52,0.125,3,1,0.57875,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.2 +22,AFR_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +23,AFR_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +24,CPA_r_new,rur,exist,1,3.7,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,1,0.6,0.900 +25,CPA_u_new,urb,exist,1,1.52,0.125,3,1,1.925,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.900 +26,EEU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +27,EEU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +28,FSU_r_new,rur,exist,1,3.7,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,1,0.6,0.800 +29,FSU_u_new,urb,exist,1,1.52,0.125,3,1,1.288,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.800 +30,LAC_r_new,rur,exist,1,3.7,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +31,LAC_u_new,urb,exist,1,1.52,0.125,3,1,2.763,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +32,MEA_r_new,rur,exist,1,3.7,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,1,0.6,1.750 +33,MEA_r_new,urb,exist,1,1.52,0.125,3,1,2.863,0.5,1.5,2.14,0.85,0.8,0.25,0.6,1.750 +34,NAM_r_new,rur,exist,1,3.7,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,1,0.6,0.369 +35,NAM_u_new,urb,exist,1,1.52,0.125,3,1,1.560,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.369 +36,PAO_r_new,rur,exist,1,3.7,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,1,0.6,0.700 +37,PAO_u_new,urb,exist,1,1.52,0.125,3,1,1.330,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.700 +38,PAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +39,PAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +40,SAS_r_new,rur,exist,1,3.7,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,1,0.6,3.300 +41,SAS_u_new,urb,exist,1,1.52,0.125,3,1,3.475,0.5,1.5,2.14,0.85,0.8,0.25,0.6,3.300 +42,WEU_r_new,rur,exist,1,3.7,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,1,0.6,0.697 +43,WEU_u_new,urb,exist,1,1.52,0.125,3,1,1.103,0.5,1.5,2.14,0.85,0.8,0.25,0.6,0.697 \ No newline at end of file diff --git a/message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_regions.csv b/message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_regions.csv new file mode 100644 index 0000000..15a8b74 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024_heat/arch_regions.csv @@ -0,0 +1,23 @@ +REGION_GEA,RegNum,arch,rural,urban +AFR,1,new,0,1 +CPA,2,new,2,3 +EEU,3,new,4,5 +FSU,4,new,6,7 +LAC,5,new,8,9 +MEA,6,new,10,11 +NAM,7,new,12,13 +PAO,8,new,14,15 +PAS,9,new,16,17 +SAS,10,new,18,19 +WEU,11,new,20,21 +AFR,1,exist,22,23 +CPA,2,exist,24,25 +EEU,3,exist,26,27 +FSU,4,exist,28,29 +LAC,5,exist,30,31 +MEA,6,exist,32,33 +NAM,7,exist,34,35 +PAO,8,exist,36,37 +PAS,9,exist,38,39 +SAS,10,exist,40,41 +WEU,11,exist,42,43 \ No newline at end of file diff --git a/message_ix_buildings/data/chilled/version/ALPS2024_heat/par_var.csv b/message_ix_buildings/data/chilled/version/ALPS2024_heat/par_var.csv new file mode 100755 index 0000000..adb40a3 --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024_heat/par_var.csv @@ -0,0 +1,4 @@ +id_run,name_run,cop,eff,t_sp_c,t_sp_c_max,t_sp_h,f_c,f_f,f_h +0,tm23ts23,1,1,23,23,21,0.333,0.333,1 +1,tm28ts26,1,1,26,28,20,0.333,0.333,1 +2,tm26ts26,1,1,26,26,20,0.333,0.333,1 diff --git a/message_ix_buildings/data/chilled/version/ALPS2024_heat/runs.csv b/message_ix_buildings/data/chilled/version/ALPS2024_heat/runs.csv new file mode 100755 index 0000000..813cc1e --- /dev/null +++ b/message_ix_buildings/data/chilled/version/ALPS2024_heat/runs.csv @@ -0,0 +1,11 @@ +id,scen,year,clim +1,ssp2,2015,2015 +2,ssp2,2020,2020 +3,ssp2,2030,2030 +4,ssp2,2040,2040 +5,ssp2,2050,2050 +6,ssp2,2060,2060 +7,ssp2,2070,2070 +8,ssp2,2080,2080 +9,ssp2,2090,2090 +10,ssp2,2100,2100 From a4a95435c8b8eb863a23692e2f63ef481931fade Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 13:02:44 +0100 Subject: [PATCH 30/53] Add script to run just heating --- message_ix_buildings/chilled/run_heat.py | 115 +++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 message_ix_buildings/chilled/run_heat.py diff --git a/message_ix_buildings/chilled/run_heat.py b/message_ix_buildings/chilled/run_heat.py new file mode 100644 index 0000000..1c69cec --- /dev/null +++ b/message_ix_buildings/chilled/run_heat.py @@ -0,0 +1,115 @@ +import datetime +import sys +from argparse import ArgumentParser + +from rich.progress import track # type: ignore + +from message_ix_buildings.chilled.core.climate import ( + aggregate_urban_rural_files, + create_climate_variables_maps, + make_vdd_total_maps, + process_construction_shares, + process_country_maps, + process_final_maps, + process_floor_area_maps, + process_iso_tables, +) +from message_ix_buildings.chilled.util.common import get_logger +from message_ix_buildings.chilled.util.config import Config # type: ignore + +log = get_logger(__name__) + + +def parse_arguments(arguments): + """ + + :return: + """ + parser = ArgumentParser(add_help=True) + + parser.add_argument( + "-version", + "--version", + default="ALPS2023", + help="Version of inputs to run. Default: ALPS2023.", + ) + parser.add_argument( + "-gcm", + "--gcm", + default="GFDL-ESM4", + help="GCM to run. Options: GFDL-ESM4, IPSL-CM6A-LR, MPI-ESM1-2-HR, MRI-ESM2-0, \ + UKESM1-0-LL. Default: GFDL-ESM4.", + ) + parser.add_argument( + "-rcp", + "--rcp", + default="baseline", + help="RCP to run. Options: ssp126, ssp370, ssp585, baseline. \ + Default: baseline.", + ) + + # Parse arguments + parsed_arguments = parser.parse_known_args(args=arguments)[0] + + return parsed_arguments + + +def print_arguments(parsed_arguments): + """ + :param parsed_arguments: + + """ + + # Print arguments + log.info( + "\n" + + "---------- Parsed arguments ------------" + + "\n" + + "Selected version: " + + parsed_arguments.version + + "\n" + + "Selected GCM: " + + parsed_arguments.gcm + + "\n" + + "Selected RCP scenario: " + + parsed_arguments.rcp + ) + + +# create climate outputs +def create_config(parsed_arguments): + cfg = Config( + vstr=parsed_arguments.version, + gcm=parsed_arguments.gcm, + rcp=parsed_arguments.rcp, + cool=0, + heat=1, + ) + + return cfg + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + parsed_args = parse_arguments(arguments=args) + + # Run the core functions + start = datetime.datetime.now() + print_arguments(parsed_arguments=parsed_args) + cfg = create_config(parsed_arguments=parsed_args) + + for step in track([cfg], description="Running core functions..."): + (create_climate_variables_maps(step, start),) + (aggregate_urban_rural_files(step),) + (make_vdd_total_maps(step),) + (process_construction_shares(step),) + (process_floor_area_maps(step),) + (process_country_maps(step),) + (process_final_maps(step),) + (process_iso_tables(step),) + + +if __name__ == "__main__": + main() From dfcff62213e8131d09dc7fef837358490f649e87 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 14:17:46 +0100 Subject: [PATCH 31/53] Bring back variables lost to linting --- message_ix_buildings/chilled/core/climate.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index 8f2efab..f41319f 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -959,7 +959,9 @@ def make_map( E_c_ac_in = xr.open_dataarray( os.path.join(output_path_vdd, suff + "_0_E_c_ac_" + urt + ".nc") ).load() - (E_c_ac_in.sum(dim="month") * 0.2777778) # Yearly total in kWh/m2 + E_c_ac_year = ( + E_c_ac_in.sum(dim="month") * 0.2777778 + ) # Yearly total in kWh/m2 if config.heat == 1: vdd_h_in = xr.open_dataarray( @@ -969,7 +971,9 @@ def make_map( E_h_in = xr.open_dataarray( os.path.join(output_path_vdd, suff + "_0_E_h_" + urt + ".nc") ).load() - (E_h_in.sum(dim="month") * 0.2777778) # Yearly total in kWh/m2 + E_h_year = ( + E_h_in.sum(dim="month") * 0.2777778 + ) # Yearly total in kWh/m2 cbloc = [ 0.86, From af716288484d35946d3397f54040ad0afcf4d522 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 14:19:52 +0100 Subject: [PATCH 32/53] Add script to only process ISO tables --- message_ix_buildings/chilled/core/run_iso.py | 97 ++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 message_ix_buildings/chilled/core/run_iso.py diff --git a/message_ix_buildings/chilled/core/run_iso.py b/message_ix_buildings/chilled/core/run_iso.py new file mode 100644 index 0000000..33f0f71 --- /dev/null +++ b/message_ix_buildings/chilled/core/run_iso.py @@ -0,0 +1,97 @@ +import datetime +import sys +from argparse import ArgumentParser + +from rich.progress import track # type: ignore + +from message_ix_buildings.chilled.core.climate import process_iso_tables +from message_ix_buildings.chilled.util.common import get_logger +from message_ix_buildings.chilled.util.config import Config # type: ignore + +log = get_logger(__name__) + + +def parse_arguments(arguments): + """ + + :return: + """ + parser = ArgumentParser(add_help=True) + + parser.add_argument( + "-version", + "--version", + default="ALPS2023", + help="Version of inputs to run. Default: ALPS2023.", + ) + parser.add_argument( + "-gcm", + "--gcm", + default="GFDL-ESM4", + help="GCM to run. Options: GFDL-ESM4, IPSL-CM6A-LR, MPI-ESM1-2-HR, MRI-ESM2-0, \ + UKESM1-0-LL. Default: GFDL-ESM4.", + ) + parser.add_argument( + "-rcp", + "--rcp", + default="baseline", + help="RCP to run. Options: ssp126, ssp370, ssp585, baseline. \ + Default: baseline.", + ) + + # Parse arguments + parsed_arguments = parser.parse_known_args(args=arguments)[0] + + return parsed_arguments + + +def print_arguments(parsed_arguments): + """ + :param parsed_arguments: + + """ + + # Print arguments + log.info( + "\n" + + "---------- Parsed arguments ------------" + + "\n" + + "Selected version: " + + parsed_arguments.version + + "\n" + + "Selected GCM: " + + parsed_arguments.gcm + + "\n" + + "Selected RCP scenario: " + + parsed_arguments.rcp + ) + + +# create climate outputs +def create_config(parsed_arguments): + cfg = Config( + vstr=parsed_arguments.version, + gcm=parsed_arguments.gcm, + rcp=parsed_arguments.rcp, + ) + + return cfg + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + parsed_args = parse_arguments(arguments=args) + + # Run the core functions + start = datetime.datetime.now() + print_arguments(parsed_arguments=parsed_args) + cfg = create_config(parsed_arguments=parsed_args) + + for step in track([cfg], description="Running core functions..."): + (process_iso_tables(step),) + + +if __name__ == "__main__": + main() From 1165ba9b647451dc7505865abb17698276a75441 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 14:21:31 +0100 Subject: [PATCH 33/53] Add other functions back --- message_ix_buildings/chilled/core/run_iso.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/core/run_iso.py b/message_ix_buildings/chilled/core/run_iso.py index 33f0f71..1f334fc 100644 --- a/message_ix_buildings/chilled/core/run_iso.py +++ b/message_ix_buildings/chilled/core/run_iso.py @@ -4,7 +4,14 @@ from rich.progress import track # type: ignore -from message_ix_buildings.chilled.core.climate import process_iso_tables +from message_ix_buildings.chilled.core.climate import ( + make_vdd_total_maps, + process_construction_shares, + process_country_maps, + process_final_maps, + process_floor_area_maps, + process_iso_tables, +) from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore @@ -90,6 +97,11 @@ def main(args=None): cfg = create_config(parsed_arguments=parsed_args) for step in track([cfg], description="Running core functions..."): + (make_vdd_total_maps(step),) + (process_construction_shares(step),) + (process_floor_area_maps(step),) + (process_country_maps(step),) + (process_final_maps(step),) (process_iso_tables(step),) From 1537281b06b66d3e2e281dba32da3ac7eea39754 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 14:24:29 +0100 Subject: [PATCH 34/53] Move run_iso.py file --- message_ix_buildings/chilled/{core => }/run_iso.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename message_ix_buildings/chilled/{core => }/run_iso.py (100%) diff --git a/message_ix_buildings/chilled/core/run_iso.py b/message_ix_buildings/chilled/run_iso.py similarity index 100% rename from message_ix_buildings/chilled/core/run_iso.py rename to message_ix_buildings/chilled/run_iso.py From 3589696fab89d5166253c9d1e1264233642f7474 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 14:34:39 +0100 Subject: [PATCH 35/53] Turn off cooling in run_iso.py --- message_ix_buildings/chilled/run_iso.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/message_ix_buildings/chilled/run_iso.py b/message_ix_buildings/chilled/run_iso.py index 1f334fc..c757296 100644 --- a/message_ix_buildings/chilled/run_iso.py +++ b/message_ix_buildings/chilled/run_iso.py @@ -80,6 +80,8 @@ def create_config(parsed_arguments): vstr=parsed_arguments.version, gcm=parsed_arguments.gcm, rcp=parsed_arguments.rcp, + cool=0, + heat=1, ) return cfg From 92e6b83a509240e1b583223c8adfbe8336226e7d Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Thu, 19 Dec 2024 16:46:33 +0100 Subject: [PATCH 36/53] Remove Nd filter from calculation of E_h Nd is cooling-specific only and therefore is not read in or calculating when heating is switched on. Thus the code crashes here since the Nd files are missing if only heating is run. --- message_ix_buildings/chilled/core/climate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index f41319f..2ff9e95 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -1665,8 +1665,8 @@ def process_final_maps(config: "Config"): vdd_path, suff1 + "_" + str(parset.Index) + "_E_h" + "ALL.nc", ) - ).where(Nd1 >= 0) - ).load() # ****************************** + ) + ).load() vdd_h_in = xr.open_dataarray( os.path.join( vdd_path, From 7f72a153ff6a6a442218244cd23238d41d6d1cfb Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Fri, 20 Dec 2024 10:40:01 +0100 Subject: [PATCH 37/53] Fix issue with df_cool being needed when heat == 1 --- message_ix_buildings/chilled/core/climate.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/message_ix_buildings/chilled/core/climate.py b/message_ix_buildings/chilled/core/climate.py index 2ff9e95..0bd605a 100644 --- a/message_ix_buildings/chilled/core/climate.py +++ b/message_ix_buildings/chilled/core/climate.py @@ -2079,7 +2079,7 @@ def aggregate_ncfile(args: tuple) -> xr.Dataset: if config.cool == 1: list_cool = list(map(aggregate_ncfile, inputs_cool)) - df_agg = ( + df_cool = ( pd.concat(list_cool) .reset_index(drop=True) .merge(dfd, left_on="gaul_lvl0", right_on="ISONUM") @@ -2091,8 +2091,15 @@ def aggregate_ncfile(args: tuple) -> xr.Dataset: .reset_index(drop=True) .merge(dfd, left_on="gaul_lvl0", right_on="ISONUM") ) - # Add df_heat to df_agg - df_agg = df_agg.append(df_heat, ignore_index=True) + + # if only cool or only heat is selected, df_agg = df_cool or df_heat + # if both cool and heat are selected, df_agg = df_cool + df_heat (concatenated) + if (config.cool == 1) and (config.heat == 0): + df_agg = df_cool + elif (config.cool == 0) and (config.heat == 1): + df_agg = df_heat + elif (config.cool == 1) and (config.heat == 1): + df_agg = pd.concat([df_cool, df_heat], ignore_index=True) log.info("Completed aggregating raster data! Now processing and saving...") From acd58612a3cb4a804b394d939117671e7d583385 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Fri, 20 Dec 2024 10:41:13 +0100 Subject: [PATCH 38/53] Only run `process_iso_tables()` function --- message_ix_buildings/chilled/run_iso.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/message_ix_buildings/chilled/run_iso.py b/message_ix_buildings/chilled/run_iso.py index c757296..dc475e9 100644 --- a/message_ix_buildings/chilled/run_iso.py +++ b/message_ix_buildings/chilled/run_iso.py @@ -4,14 +4,7 @@ from rich.progress import track # type: ignore -from message_ix_buildings.chilled.core.climate import ( - make_vdd_total_maps, - process_construction_shares, - process_country_maps, - process_final_maps, - process_floor_area_maps, - process_iso_tables, -) +from message_ix_buildings.chilled.core.climate import process_iso_tables from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore @@ -99,11 +92,11 @@ def main(args=None): cfg = create_config(parsed_arguments=parsed_args) for step in track([cfg], description="Running core functions..."): - (make_vdd_total_maps(step),) - (process_construction_shares(step),) - (process_floor_area_maps(step),) - (process_country_maps(step),) - (process_final_maps(step),) + # (make_vdd_total_maps(step),) + # (process_construction_shares(step),) + # (process_floor_area_maps(step),) + # (process_country_maps(step),) + # (process_final_maps(step),) (process_iso_tables(step),) From 3e5cec006c9330cfdcfb7a8d858faa4bc3600e0f Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:11:59 +0100 Subject: [PATCH 39/53] Update functions to aggregate all GCM-RCP data --- .../chilled/analysis/aggregate.py | 246 ++++++++++++------ 1 file changed, 169 insertions(+), 77 deletions(-) diff --git a/message_ix_buildings/chilled/analysis/aggregate.py b/message_ix_buildings/chilled/analysis/aggregate.py index 9e6edbe..0ebd777 100644 --- a/message_ix_buildings/chilled/analysis/aggregate.py +++ b/message_ix_buildings/chilled/analysis/aggregate.py @@ -2,106 +2,192 @@ import os import pandas as pd +import pyam # type: ignore from sklearn.utils.fixes import parse_version, sp_version # type: ignore -from message_ix_buildings.chilled.variable_dicts import SCENARIO_NAMES +from message_ix_buildings.chilled.functions.variable_dicts import SCENARIO_NAMES +from message_ix_buildings.chilled.util.base import get_paths +from message_ix_buildings.chilled.util.common import get_logger +from message_ix_buildings.chilled.util.config import Config # type: ignore # This is line is to avoid incompatibility if older SciPy version. # You should use `solver="highs"` with recent version of SciPy. solver = "highs" if sp_version >= parse_version("1.6.0") else "interior-point" -# from message_ix_buildings.chilled.config import Config +# load logger +log = get_logger(__name__) -# cfg = Config() -# dle_path = cfg.dle_path -# version_name = cfg.vstr +# Function to calculate cumulative carbon emissions +def calculate_cumulative_carbon_emissions(config: "Config"): + """Calculate cumulative carbon emissions -# model = "MESS-CHILL-URM" + Adapted from `y7_process_results_to_CumCarb_table.py` -# main_path = os.path.join(dle_path, f"output_data_{version_name}") + """ -# version_output_path = os.path.join(dle_path, f"output_data_{version_name}", "output") + project_path = get_paths(config, "project_path") + out_path = os.path.join(project_path, "out", "version", config.vstr, "output") + snapshot_file = get_paths(config, "ar6_snapshot_file") -# files = glob.glob( -# os.path.join(main_path, "**/*/" + "ISO_agg_data_" + version_name + ".csv"), -# recursive=True, -# ) + log.info("Calculating cumulative carbon emissions...") -# print("Reading files....") -# data = pd.concat((pd.read_csv(f) for f in files), ignore_index=True).rename( -# columns={"REGION_GEA": "region"} -# ) + varins = [ + "Emissions|CO2", + "AR6 climate diagnostics|Surface Temperature (GSAT)|MAGICCv7.5.3|50.0th Percentile", + "AR6 climate diagnostics|Infilled|Emissions|CO2", + ] + msdic = { + "IMAGE 3.0.1": "SSP1-26", + "AIM/CGE 2.0": "SSP3-Baseline", + "REMIND-MAgPIE 1.5": "SSP5-Baseline", + } -# data_sub.query( -# "gcm == 'IPSL-CM6A-LR' and scenario == 'ssp126' and year == 2015 and region == 'LAC' and urt == 'total' and arch == 'exist' and par_var == 0" -# ).sort_values(by=["ISO"], ascending=False) + log.info("Reading in AR6 snapshot file...") + dfar6 = pyam.IamDataFrame(snapshot_file) + log.info("...AR6 snapshot file read.") -# data_sub.query("E_c_ac_popwei == 0") + log.info("Filtering AR6 data...") + a = dfar6.filter(scenario="SSP*") + ndf = a.filter(model="xxx") + for m, s in msdic.items(): + ndf.append(a.filter(model=m, scenario=s, variable=varins), inplace=True) + log.info("...AR6 data filtered.") -# data_sub.query( -# "gcm == 'GFDL-ESM4' and year == 2015 and region == 'LAC' and urt == 'total' and arch == 'exist' and par_var == 0" -# ).sort_values(by=["NAME"], ascending=False) + log.info("Interpolating AR6 data...") + ndf.interpolate(range(2000, 2101, 1), inplace=True) + log.info("...AR6 data interpolated.") + # ENGAGE scenarios + scenarios = ["EN_NPi2020_300f", "EN_NPi2020_1400f", "EN_NPi2100"] -# gb.query( -# "scenario == 'ssp126' and year == 2015 and arch == 'exist' and urt == 'total' and par_var == 0 and region == 'LAC'" -# ) -# data_new_pop.query( -# "scenario == 'ssp126' and year == 2015 and arch == 'exist' and urt == 'total' and par_var == 0 and region == 'LAC'" -# ).sort_values(by=["popsum"], ascending=False) + log.info("Selected scenarios: " + str(scenarios)) -# # count how many countries in LAC under each gcm -# data_new_pop.query( -# "scenario == 'ssp126' and year == 2015 and arch == 'exist' and urt == 'total' and par_var == 0 and region == 'LAC'" -# ).groupby(["gcm"])["ISO"].count() + log.info("Filtering for ENGAGE data...") + engage = dfar6.filter(model="MESSAGE*", scenario=scenarios, variable=varins) + log.info("...ENGAGE data filtered.") + # Calculate Cumulative CO2 emissions + unit = "Gt CO2" -# # count how many countries in LAC under each gcm -# data_new_pop.groupby(["gcm"])["ISO"].count() + ts_engage = ( + engage.filter(variable="Emissions|CO2", year=range(2015, 2101)) + .convert_unit( + "Mt CO2/yr", + "Gt CO2/yr", + ) + .timeseries() + ) + ts_native = ( + ndf.filter(variable="Emissions|CO2", year=range(2015, 2101)) + .convert_unit( + "Mt CO2/yr", + "Gt CO2/yr", + ) + .timeseries() + ) + ts_infilled = ( + ndf.filter( + variable="AR6 climate diagnostics|Infilled|Emissions|CO2", + year=range(2015, 2101), + ) + .convert_unit( + "Mt CO2/yr", + "Gt CO2/yr", + ) + .timeseries() + ) -# # list unique countries in GFDL-ESM4 gcm -# iso_gfdl = data_new_pop.query( -# "gcm == 'GFDL-ESM4' and scenario == 'ssp126' and year == 2015 and arch == 'exist' and urt == 'total' and par_var == 0 and region == 'LAC'" -# ).ISO.unique() + engage_cumCO2 = pd.DataFrame() + for year in config.yeardic.keys(): + int_year = int(year) -# # list unique countries in UKESM1-0-LL gcm -# iso_uk = data_new_pop.query( -# "gcm == 'UKESM1-0-LL' and scenario == 'ssp126' and year == 2015 and arch == 'exist' and urt == 'total' and par_var == 0 and region == 'LAC'" -# ).ISO.unique() + df = ( + ts_engage.apply( + pyam.cumulative, raw=False, axis=1, first_year=2015, last_year=int_year + ) + .to_frame() + .reset_index() + ) + df["year"] = int_year + df["variable"] = f"Cumulative CO2 infilled 2015-{int_year}, Gt CO2" + df.rename(columns={0: "value"}, inplace=True) + engage_cumCO2 = pd.concat([engage_cumCO2, df]) + engage_cumCO2["unit"] = unit + + engage.append(engage_cumCO2, inplace=True) + + df_cumCO2 = pd.DataFrame() + for year in config.yeardic.keys(): + int_year = int(year) + + df = ( + ts_native.apply( + pyam.cumulative, raw=False, axis=1, first_year=2015, last_year=int_year + ) + .to_frame() + .reset_index() + ) + df["year"] = int_year + df["variable"] = f"Cumulative CO2 native 2015-{int_year}, Gt CO2" + df.rename(columns={0: "value"}, inplace=True) + df_cumCO2 = pd.concat([df_cumCO2, df]) + + df = ( + ts_infilled.apply( + pyam.cumulative, raw=False, axis=1, first_year=2015, last_year=int_year + ) + .to_frame() + .reset_index() + ) + df["year"] = int_year + df["variable"] = f"Cumulative CO2 infilled 2015-{year}, Gt CO2" + df.rename(columns={0: "value"}, inplace=True) -# list countries that are in GFSL-ESM4 but not UKESM1-0-LL -# iso_gfdl_not_uk = [x for x in iso_gfdl if x not in iso_uk] -# iso_gfdl_not_uk + df_cumCO2 = pd.concat([df_cumCO2, df]) -# gb.query( -# "scenario == 'ssp126' and year == 2050 and arch == 'exist' and urt == 'urban' and par_var == 0 and region == 'NAM'" -# ) -# gb.query( -# "scenario == 'ssp126' and year == 2050 and arch == 'exist' and urt == 'total' and par_var == 0 and region == 'NAM'" -# ) + df_cumCO2["unit"] = unit + ndf.append(df_cumCO2, inplace=True) -def aggregate_ISO_tables_to_regions(dle_path, version_name): - model = "MESS-CHILL-URM" + log.info("Writing out cumulative carbon emissions to " + out_path + "...") - main_path = os.path.join(dle_path, f"output_data_{version_name}") + engage.to_excel(os.path.join(out_path, "engage_emissions_tempAR6_cumCO2.xlsx")) + log.info( + "...Saved: " + os.path.join(out_path, "engage_emissions_tempAR6_cumCO2.xlsx") + ) - version_output_path = os.path.join( - dle_path, f"output_data_{version_name}", "output" + engage_cumCO2.to_csv(os.path.join(out_path, "engage_cumCO2.csv"), index=False) + log.info("...Saved: " + os.path.join(out_path, "engage_cumCO2.csv")) + + ndf.to_excel(os.path.join(out_path, "isimip3b_emissions_tempAR6_cumCO2.xlsx")) + log.info( + "...Saved: " + os.path.join(out_path, "isimip3b_emissions_tempAR6_cumCO2.xlsx") ) + df_cumCO2.to_csv(os.path.join(out_path, "isimip3b_cumCO2.csv"), index=False) + log.info("...Saved: " + os.path.join(out_path, "isimip3b_cumCO2.csv")) + + +def aggregate_ISO_tables_to_regions(config: "Config"): + project_path = get_paths(config, "project_path") + version_path = os.path.join(project_path, "out", "version", config.vstr) + out_path = os.path.join(version_path, "output") + + model = "MESS-CHILL-URM" + files = glob.glob( - os.path.join(main_path, "**/*/" + "ISO_agg_data_" + version_name + ".csv"), + os.path.join(version_path, "**/*/" + "ISO_agg_data_" + config.vstr + ".csv"), recursive=True, ) - print("Reading files....") + log.info("Reading ISO table files....") data = pd.concat((pd.read_csv(f) for f in files), ignore_index=True).rename( columns={"REGION_GEA": "region"} ) + log.info("...ISO table files read.") # get population data from UKESM1-0-LL gcm and get unique combinations of population pop_uk = ( @@ -238,9 +324,11 @@ def aggregate_ISO_tables_to_regions(dle_path, version_name): gb = pd.concat([gb_region, gb_world]) # calculate EI_ac_m2 assuming 10m2 per person + log.info("Calculating EI_ac_m2 assuming 10m2 per person...") gb = gb.assign( EI_ac_m2=lambda x: x.E_c_ac_popwei / (x.popsum * 10) ) # 10 because 10m2 per person assumed + log.info("...EI_ac_m2 calculated.") # gb = ( # data_new_pop.groupby( @@ -264,9 +352,9 @@ def aggregate_ISO_tables_to_regions(dle_path, version_name): # ) # 10 because 10m2 per person assumed # ) - gb.to_csv(os.path.join(version_output_path, "region_agg_EI_ac_m2.csv"), index=False) + gb.to_csv(os.path.join(out_path, "region_agg_EI_ac_m2.csv"), index=False) - print("Saved: " + os.path.join(version_output_path, "region_agg_EI_ac_m2.csv")) + log.info("Saved: " + os.path.join(out_path, "region_agg_EI_ac_m2.csv")) pop_only = ( gb.reindex( @@ -292,37 +380,41 @@ def aggregate_ISO_tables_to_regions(dle_path, version_name): # ) ) - pop_only.to_csv( - os.path.join(version_output_path, "population_by_region.csv"), index=False - ) + pop_only.to_csv(os.path.join(out_path, "population_by_region.csv"), index=False) - print("Saved: " + os.path.join(version_output_path, "population_by_region.csv")) + log.info("Saved: " + os.path.join(out_path, "population_by_region.csv")) -def create_prereg_data(dle_path, version_name): - version_output_path = os.path.join( - dle_path, f"output_data_{version_name}", "output" - ) +def create_prereg_data(config: "Config"): + project_path = get_paths(config, "project_path") + version_path = os.path.join(project_path, "out", "version", config.vstr) + out_path = os.path.join(version_path, "output") + + log.info("Read in isimip3b_cumCO2.csv...") + df_cumCO2 = pd.read_csv(os.path.join(out_path, "isimip3b_cumCO2.csv")) + log.info("...isimip3b_cumCO2.csv read.") - df_cumCO2 = pd.read_csv(os.path.join(version_output_path, "isimip3b_cumCO2.csv")) df_cumCO2.scenario.replace(SCENARIO_NAMES, inplace=True) df_cumCO2 = df_cumCO2.loc[df_cumCO2.variable.str.contains("infilled")] - df_ei = pd.read_csv(os.path.join(version_output_path, "region_agg_EI_ac_m2.csv")) + log.info("Read in region_agg_EI_ac_m2.csv...") + df_ei = pd.read_csv(os.path.join(out_path, "region_agg_EI_ac_m2.csv")) + log.info("...region_agg_EI_ac_m2.csv read.") + log.info("Combine EI_ac_m2 and cumCO2 data...") ei_cumCO2 = pd.merge( df_ei, df_cumCO2.reindex(["scenario", "year", "value"], axis=1), on=["scenario", "year"], how="left", ).rename(columns={"value": "cumCO2"}) + log.info("...EI_ac_m2 and cumCO2 data combined.") + log.info("Saving pre-regress data...") ei_cumCO2.to_csv( - os.path.join(version_output_path, "region_EI_cumCO2_pre-regress.csv"), + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv"), index=False, ) - - print( - "Saved: " - + os.path.join(version_output_path, "region_EI_cumCO2_pre-regress.csv") - ) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) From 7516491947b5da394f146e488f7b75aed4b4a7a3 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:14:26 +0100 Subject: [PATCH 40/53] Move aggregate functions --- message_ix_buildings/chilled/{analysis => core}/aggregate.py | 1 + 1 file changed, 1 insertion(+) rename message_ix_buildings/chilled/{analysis => core}/aggregate.py (99%) diff --git a/message_ix_buildings/chilled/analysis/aggregate.py b/message_ix_buildings/chilled/core/aggregate.py similarity index 99% rename from message_ix_buildings/chilled/analysis/aggregate.py rename to message_ix_buildings/chilled/core/aggregate.py index 0ebd777..7c4283c 100644 --- a/message_ix_buildings/chilled/analysis/aggregate.py +++ b/message_ix_buildings/chilled/core/aggregate.py @@ -418,3 +418,4 @@ def create_prereg_data(config: "Config"): log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) From faf9d04c785755f0b2bbec5471dbb4b6e9a71196 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:16:00 +0100 Subject: [PATCH 41/53] Change `run_agg.py` to be run after all GCM-RCP combos --- message_ix_buildings/chilled/run_agg.py | 56 +++++-------------------- 1 file changed, 10 insertions(+), 46 deletions(-) diff --git a/message_ix_buildings/chilled/run_agg.py b/message_ix_buildings/chilled/run_agg.py index ec3f6cb..9797f6c 100644 --- a/message_ix_buildings/chilled/run_agg.py +++ b/message_ix_buildings/chilled/run_agg.py @@ -1,14 +1,10 @@ import sys from argparse import ArgumentParser -from message_ix_buildings.chilled.core.climate import ( - aggregate_urban_rural_files, - make_vdd_total_maps, - process_construction_shares, - process_country_maps, - process_final_maps, - process_floor_area_maps, - process_iso_tables, +from message_ix_buildings.chilled.core.aggregate import ( + aggregate_ISO_tables_to_regions, + calculate_cumulative_carbon_emissions, + create_prereg_data, ) from message_ix_buildings.chilled.util.common import get_logger from message_ix_buildings.chilled.util.config import Config # type: ignore @@ -29,18 +25,6 @@ def parse_arguments(arguments): default="ALPS2023", help="Version of inputs to run. Default: ALPS2023.", ) - parser.add_argument( - "-gcm", - "--gcm", - default="GFDL-ESM4", - help="GCM to run. Options: GFDL-ESM4, IPSL-CM6A-LR, MPI-ESM1-2-HR, MRI-ESM2-0, UKESM1-0-LL. Default: GFDL-ESM4.", - ) - parser.add_argument( - "-rcp", - "--rcp", - default="baseline", - help="RCP to run. Options: ssp126, ssp370, ssp585, baseline. Default: baseline.", - ) # Parse arguments parsed_arguments = parser.parse_known_args(args=arguments)[0] @@ -61,20 +45,12 @@ def print_arguments(parsed_arguments): + "\n" + "Selected version: " + parsed_arguments.version - + "\n" - + "Selected GCM: " - + parsed_arguments.gcm - + "\n" - + "Selected RCP scenario: " - + parsed_arguments.rcp ) def create_config(parsed_arguments): cfg = Config( vstr=parsed_arguments.version, - gcm=parsed_arguments.gcm, - rcp=parsed_arguments.rcp, ) return cfg @@ -90,26 +66,14 @@ def main(args=None): print_arguments(parsed_arguments=parsed_args) cfg = create_config(parsed_arguments=parsed_args) - log.info("RUNNING aggregate_urban_rural_files()........") - aggregate_urban_rural_files(cfg) - - log.info("RUNNING make_vdd_total_maps()........") - make_vdd_total_maps(cfg) - - log.info("RUNNING process_construction_shares()........") - process_construction_shares(cfg) - - log.info("RUNNING process_floor_area_maps()........") - process_floor_area_maps(cfg) - - log.info("RUNNING process_country_maps()........") - process_country_maps(cfg) + log.info("RUNNING calculate_cumulative_carbon_emissions()........") + calculate_cumulative_carbon_emissions(cfg) - log.info("RUNNING process_final_maps()........") - process_final_maps(cfg) + log.info("RUNNING aggregate_ISO_tables_to_regions()........") + aggregate_ISO_tables_to_regions(cfg) - log.info("RUNNING process_iso_tables()........") - process_iso_tables(cfg) + log.info("RUNNING create_prereg_data()........") + create_prereg_data(cfg) if __name__ == "__main__": From 7226ed3eeea4863777c68ca1fe6ac73f3ce2e20f Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:24:43 +0100 Subject: [PATCH 42/53] Replace `pyam.cumulative` with `pyam.timeseries.cumulative` --- .../chilled/core/aggregate.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/message_ix_buildings/chilled/core/aggregate.py b/message_ix_buildings/chilled/core/aggregate.py index 7c4283c..8f15506 100644 --- a/message_ix_buildings/chilled/core/aggregate.py +++ b/message_ix_buildings/chilled/core/aggregate.py @@ -106,7 +106,11 @@ def calculate_cumulative_carbon_emissions(config: "Config"): df = ( ts_engage.apply( - pyam.cumulative, raw=False, axis=1, first_year=2015, last_year=int_year + pyam.timeseries.cumulative, + raw=False, + axis=1, + first_year=2015, + last_year=int_year, ) .to_frame() .reset_index() @@ -125,7 +129,11 @@ def calculate_cumulative_carbon_emissions(config: "Config"): df = ( ts_native.apply( - pyam.cumulative, raw=False, axis=1, first_year=2015, last_year=int_year + pyam.timeseries.cumulative, + raw=False, + axis=1, + first_year=2015, + last_year=int_year, ) .to_frame() .reset_index() @@ -137,7 +145,11 @@ def calculate_cumulative_carbon_emissions(config: "Config"): df = ( ts_infilled.apply( - pyam.cumulative, raw=False, axis=1, first_year=2015, last_year=int_year + pyam.timeseries.cumulative, + raw=False, + axis=1, + first_year=2015, + last_year=int_year, ) .to_frame() .reset_index() @@ -419,3 +431,5 @@ def create_prereg_data(config: "Config"): log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) From bd4c6d3269ecb23734f6306b5a81823927bb9836 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:27:56 +0100 Subject: [PATCH 43/53] Create output paths if they do not exist already --- .../chilled/core/aggregate.py | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/message_ix_buildings/chilled/core/aggregate.py b/message_ix_buildings/chilled/core/aggregate.py index 8f15506..b99bf3c 100644 --- a/message_ix_buildings/chilled/core/aggregate.py +++ b/message_ix_buildings/chilled/core/aggregate.py @@ -25,10 +25,13 @@ def calculate_cumulative_carbon_emissions(config: "Config"): Adapted from `y7_process_results_to_CumCarb_table.py` """ - + snapshot_file = get_paths(config, "ar6_snapshot_file") project_path = get_paths(config, "project_path") out_path = os.path.join(project_path, "out", "version", config.vstr, "output") - snapshot_file = get_paths(config, "ar6_snapshot_file") + + # if out_path does not exist, create it + if not os.path.exists(out_path): + os.makedirs(out_path) log.info("Calculating cumulative carbon emissions...") @@ -188,6 +191,10 @@ def aggregate_ISO_tables_to_regions(config: "Config"): version_path = os.path.join(project_path, "out", "version", config.vstr) out_path = os.path.join(version_path, "output") + # if out_path does not exist, create it + if not os.path.exists(out_path): + os.makedirs(out_path) + model = "MESS-CHILL-URM" files = glob.glob( @@ -402,6 +409,10 @@ def create_prereg_data(config: "Config"): version_path = os.path.join(project_path, "out", "version", config.vstr) out_path = os.path.join(version_path, "output") + # if out_path does not exist, create it + if not os.path.exists(out_path): + os.makedirs(out_path) + log.info("Read in isimip3b_cumCO2.csv...") df_cumCO2 = pd.read_csv(os.path.join(out_path, "isimip3b_cumCO2.csv")) log.info("...isimip3b_cumCO2.csv read.") @@ -433,3 +444,8 @@ def create_prereg_data(config: "Config"): log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) From 9644f0efe739aab0cc4150ca9d6857bd1918c551 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:44:19 +0100 Subject: [PATCH 44/53] Run prereg data for cooling and heating separately --- .../chilled/core/aggregate.py | 396 ++++++++++++------ 1 file changed, 264 insertions(+), 132 deletions(-) diff --git a/message_ix_buildings/chilled/core/aggregate.py b/message_ix_buildings/chilled/core/aggregate.py index b99bf3c..d7cfc07 100644 --- a/message_ix_buildings/chilled/core/aggregate.py +++ b/message_ix_buildings/chilled/core/aggregate.py @@ -230,151 +230,291 @@ def aggregate_ISO_tables_to_regions(config: "Config"): .drop_duplicates() ) - # drop population from data and get unique combinations of data - # NOTE: there are some countries in LAC ssp126 that have multiple E_c_ac_popwei values - # and one of them is 0. so I've decided to choose the maximum value for E_c_ac_popwei - data_sub = ( - data.drop( - columns=[ - "E_c_ac_gap", - "E_c_ac_wAccess", - "E_c_fan_gap", - "E_c_fan_popwei", - "E_c_fan_wAccess", - "E_c_gap", - "E_c_perpix", - "E_c_popwei", - "E_c_wAccess", - "Nd", - "Nf", - "P_c_ac_gap", - "P_c_ac_potential", - "P_c_fanNoAC", - "P_c_fan_gap", - "vdd_c_popwei", - "vdd_c_avg", - "population_scenario", - "popsum", + if config.cool == 1: + log.info("COOLING: Calculating EI_ac_m2 assuming 10m2 per person...") + # drop population from data and get unique combinations of data + # NOTE: there are some countries in LAC ssp126 that have multiple E_c_ac_popwei values + # and one of them is 0. so I've decided to choose the maximum value for E_c_ac_popwei + data_sub = ( + data[ + [ + "id", + "NAME", + "ISO", + "GLOBAL_SOUTH", + "region", + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + "E_c_ac_popwei", + ] ] + .drop_duplicates() + .groupby( + [ + "id", + "NAME", + "ISO", + "GLOBAL_SOUTH", + "region", + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + ] + )[["E_c_ac_popwei"]] + .max() + .reset_index() ) - .drop_duplicates() - .groupby( - [ + + # merge with UKESM1-0-LL population data so that all gcms use the same population data + data_new_pop = pd.merge( + data_sub, + pop_uk, + on=[ "id", "NAME", "ISO", - "GLOBAL_SOUTH", "region", - "gcm", - "scenario", - "scen", - "year", "clim", "arch", "urt", "par_var", "name_run", - ] - )[["E_c_ac_popwei"]] - .max() - .reset_index() - ) + "year", + ], + how="left", + ) - # merge with UKESM1-0-LL population data so that all gcms use the same population data - data_new_pop = pd.merge( - data_sub, - pop_uk, - on=[ - "id", - "NAME", - "ISO", - "region", - "clim", - "arch", - "urt", - "par_var", - "name_run", - "year", - ], - how="left", - ) + # aggregate popsum and E_c_ac_popwei to the region level + gb_region = ( + data_new_pop.groupby( + [ + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + "region", + ] + )[["popsum", "E_c_ac_popwei"]] + .sum() + .reset_index() + ) - # aggregate popsum and E_c_ac_popwei to the region level - gb_region = ( - data_new_pop.groupby( - [ - "gcm", - "scenario", - "scen", - "year", - "clim", - "arch", - "urt", - "par_var", - "name_run", - "region", + # aggregate popsum and E_c_ac_popwei to the global level and assign a new region == "World" + gb_world = ( + data_new_pop.groupby( + [ + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + ] + )[["popsum", "E_c_ac_popwei"]] + .sum() + .reset_index() + .assign(region="World") + ) + + # concatenate region and world data + gb = pd.concat([gb_region, gb_world]) + + # calculate EI_ac_m2 assuming 10m2 per person + log.info("Calculating EI_ac_m2 assuming 10m2 per person...") + gb = gb.assign( + EI_ac_m2=lambda x: x.E_c_ac_popwei / (x.popsum * 10) + ) # 10 because 10m2 per person assumed + log.info("...EI_ac_m2 calculated.") + + # gb = ( + # data_new_pop.groupby( + # [ + # "gcm", + # "scenario", + # "scen", + # "year", + # "clim", + # "arch", + # "urt", + # "par_var", + # "name_run", + # "region", + # ] + # )[["popsum", "E_c_ac_popwei"]] + # .sum() + # .reset_index() + # .assign( + # EI_ac_m2=lambda x: x.E_c_ac_popwei / (x.popsum * 10) + # ) # 10 because 10m2 per person assumed + # ) + + gb.to_csv(os.path.join(out_path, "region_agg_EI_ac_m2.csv"), index=False) + + log.info("Saved: " + os.path.join(out_path, "region_agg_EI_ac_m2.csv")) + + if config.heat == 1: + log.info("HEATING: Calculating EI_h_m2 assuming 10m2 per person...") + # drop population from data and get unique combinations of data + data_sub = ( + data[ + [ + "id", + "NAME", + "ISO", + "GLOBAL_SOUTH", + "region", + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + "E_c_ac_popwei", + ] ] - )[["popsum", "E_c_ac_popwei"]] - .sum() - .reset_index() - ) + .drop_duplicates() + .groupby( + [ + "id", + "NAME", + "ISO", + "GLOBAL_SOUTH", + "region", + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + ] + )[["E_h_popwei"]] + .max() + .reset_index() + ) - # aggregate popsum and E_c_ac_popwei to the global level and assign a new region == "World" - gb_world = ( - data_new_pop.groupby( - [ - "gcm", - "scenario", - "scen", - "year", + # merge with UKESM1-0-LL population data so that all gcms use the same population data + data_new_pop = pd.merge( + data_sub, + pop_uk, + on=[ + "id", + "NAME", + "ISO", + "region", "clim", "arch", "urt", "par_var", "name_run", - ] - )[["popsum", "E_c_ac_popwei"]] - .sum() - .reset_index() - .assign(region="World") - ) + "year", + ], + how="left", + ) - # concatenate region and world data - gb = pd.concat([gb_region, gb_world]) - - # calculate EI_ac_m2 assuming 10m2 per person - log.info("Calculating EI_ac_m2 assuming 10m2 per person...") - gb = gb.assign( - EI_ac_m2=lambda x: x.E_c_ac_popwei / (x.popsum * 10) - ) # 10 because 10m2 per person assumed - log.info("...EI_ac_m2 calculated.") - - # gb = ( - # data_new_pop.groupby( - # [ - # "gcm", - # "scenario", - # "scen", - # "year", - # "clim", - # "arch", - # "urt", - # "par_var", - # "name_run", - # "region", - # ] - # )[["popsum", "E_c_ac_popwei"]] - # .sum() - # .reset_index() - # .assign( - # EI_ac_m2=lambda x: x.E_c_ac_popwei / (x.popsum * 10) - # ) # 10 because 10m2 per person assumed - # ) - - gb.to_csv(os.path.join(out_path, "region_agg_EI_ac_m2.csv"), index=False) - - log.info("Saved: " + os.path.join(out_path, "region_agg_EI_ac_m2.csv")) + # aggregate popsum and E_h_popwei to the region level + gb_region = ( + data_new_pop.groupby( + [ + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + "region", + ] + )[["popsum", "E_h_popwei"]] + .sum() + .reset_index() + ) + # aggregate popsum and E_h_popwei to the global level and assign a new region == "World" + gb_world = ( + data_new_pop.groupby( + [ + "gcm", + "scenario", + "scen", + "year", + "clim", + "arch", + "urt", + "par_var", + "name_run", + ] + )[["popsum", "E_h_popwei"]] + .sum() + .reset_index() + .assign(region="World") + ) + + # concatenate region and world data + gb = pd.concat([gb_region, gb_world]) + + # calculate EI_h_m2 assuming 10m2 per person + log.info("Calculating EI_h_m2 assuming 10m2 per person...") + gb = gb.assign( + EI_h_m2=lambda x: x.E_h_popwei / (x.popsum * 10) + ) # 10 because 10m2 per person assumed + log.info("...EI_h_m2 calculated.") + + # gb = ( + # data_new_pop.groupby( + # [ + # "gcm", + # "scenario", + # "scen", + # "year", + # "clim", + # "arch", + # "urt", + # "par_var", + # "name_run", + # "region", + # ] + # )[["popsum", "E_c_ac_popwei"]] + # .sum() + # .reset_index() + # .assign( + # EI_ac_m2=lambda x: x.E_c_ac_popwei / (x.popsum * 10) + # ) # 10 because 10m2 per person assumed + # ) + + gb.to_csv(os.path.join(out_path, "region_agg_EI_h_m2.csv"), index=False) + + log.info("Saved: " + os.path.join(out_path, "region_agg_EI_h_m2.csv")) + + log.info("Calculating population by region...") pop_only = ( gb.reindex( [ @@ -434,18 +574,10 @@ def create_prereg_data(config: "Config"): log.info("...EI_ac_m2 and cumCO2 data combined.") log.info("Saving pre-regress data...") + ei_cumCO2.to_csv( os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv"), index=False, ) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) From d1126b1de924b220bff81c65f600f194378f6045 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:46:55 +0100 Subject: [PATCH 45/53] Set cool = 0 and heat = 1 --- message_ix_buildings/chilled/run_agg.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/message_ix_buildings/chilled/run_agg.py b/message_ix_buildings/chilled/run_agg.py index 9797f6c..e328480 100644 --- a/message_ix_buildings/chilled/run_agg.py +++ b/message_ix_buildings/chilled/run_agg.py @@ -51,6 +51,8 @@ def print_arguments(parsed_arguments): def create_config(parsed_arguments): cfg = Config( vstr=parsed_arguments.version, + cool=0, + heat=1, ) return cfg From 7b39daa44e80b19b75f5a574a0405cc7bcb479aa Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:49:16 +0100 Subject: [PATCH 46/53] Fix bug of E_c_ac_popwei being in heating --- .../chilled/core/aggregate.py | 25 ++----------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/message_ix_buildings/chilled/core/aggregate.py b/message_ix_buildings/chilled/core/aggregate.py index d7cfc07..d9303df 100644 --- a/message_ix_buildings/chilled/core/aggregate.py +++ b/message_ix_buildings/chilled/core/aggregate.py @@ -393,7 +393,7 @@ def aggregate_ISO_tables_to_regions(config: "Config"): "urt", "par_var", "name_run", - "E_c_ac_popwei", + "E_h_popwei", ] ] .drop_duplicates() @@ -488,28 +488,6 @@ def aggregate_ISO_tables_to_regions(config: "Config"): ) # 10 because 10m2 per person assumed log.info("...EI_h_m2 calculated.") - # gb = ( - # data_new_pop.groupby( - # [ - # "gcm", - # "scenario", - # "scen", - # "year", - # "clim", - # "arch", - # "urt", - # "par_var", - # "name_run", - # "region", - # ] - # )[["popsum", "E_c_ac_popwei"]] - # .sum() - # .reset_index() - # .assign( - # EI_ac_m2=lambda x: x.E_c_ac_popwei / (x.popsum * 10) - # ) # 10 because 10m2 per person assumed - # ) - gb.to_csv(os.path.join(out_path, "region_agg_EI_h_m2.csv"), index=False) log.info("Saved: " + os.path.join(out_path, "region_agg_EI_h_m2.csv")) @@ -581,3 +559,4 @@ def create_prereg_data(config: "Config"): ) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) From 2bd5994913657aaf267f1c29c2d5eb120a5c1291 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Tue, 7 Jan 2025 13:55:45 +0100 Subject: [PATCH 47/53] Separate creating prereg data into cooling and heating --- .../chilled/core/aggregate.py | 71 +++++++++++++------ 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/message_ix_buildings/chilled/core/aggregate.py b/message_ix_buildings/chilled/core/aggregate.py index d9303df..6350afd 100644 --- a/message_ix_buildings/chilled/core/aggregate.py +++ b/message_ix_buildings/chilled/core/aggregate.py @@ -538,25 +538,52 @@ def create_prereg_data(config: "Config"): df_cumCO2.scenario.replace(SCENARIO_NAMES, inplace=True) df_cumCO2 = df_cumCO2.loc[df_cumCO2.variable.str.contains("infilled")] - log.info("Read in region_agg_EI_ac_m2.csv...") - df_ei = pd.read_csv(os.path.join(out_path, "region_agg_EI_ac_m2.csv")) - log.info("...region_agg_EI_ac_m2.csv read.") - - log.info("Combine EI_ac_m2 and cumCO2 data...") - ei_cumCO2 = pd.merge( - df_ei, - df_cumCO2.reindex(["scenario", "year", "value"], axis=1), - on=["scenario", "year"], - how="left", - ).rename(columns={"value": "cumCO2"}) - log.info("...EI_ac_m2 and cumCO2 data combined.") - - log.info("Saving pre-regress data...") - - ei_cumCO2.to_csv( - os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv"), - index=False, - ) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) - log.info("Saved: " + os.path.join(out_path, "region_EI_cumCO2_pre-regress.csv")) + if config.cool == 1: + log.info("COOLING: Create pre-regress data for cooling") + log.info("Read in region_agg_EI_ac_m2.csv...") + df_ei = pd.read_csv(os.path.join(out_path, "region_agg_EI_ac_m2.csv")) + log.info("...region_agg_EI_ac_m2.csv read.") + + log.info("Combine EI_ac_m2 and cumCO2 data...") + ei_cumCO2 = pd.merge( + df_ei, + df_cumCO2.reindex(["scenario", "year", "value"], axis=1), + on=["scenario", "year"], + how="left", + ).rename(columns={"value": "cumCO2"}) + log.info("...EI_ac_m2 and cumCO2 data combined.") + + log.info("Saving pre-regress data...") + + ei_cumCO2.to_csv( + os.path.join(out_path, "region_EI_cool_cumCO2_pre-regress.csv"), + index=False, + ) + log.info( + "Saved: " + os.path.join(out_path, "region_EI_cool_cumCO2_pre-regress.csv") + ) + + if config.heat == 1: + log.info("HEATING: Create pre-regress data for heating") + log.info("Read in region_agg_EI_h_m2.csv...") + df_ei = pd.read_csv(os.path.join(out_path, "region_agg_EI_h_m2.csv")) + log.info("...region_agg_EI_h_m2.csv read.") + + log.info("Combine EI_h_m2 and cumCO2 data...") + ei_cumCO2 = pd.merge( + df_ei, + df_cumCO2.reindex(["scenario", "year", "value"], axis=1), + on=["scenario", "year"], + how="left", + ).rename(columns={"value": "cumCO2"}) + log.info("...EI_h_m2 and cumCO2 data combined.") + + log.info("Saving pre-regress data...") + + ei_cumCO2.to_csv( + os.path.join(out_path, "region_EI_heat_cumCO2_pre-regress.csv"), + index=False, + ) + log.info( + "Saved: " + os.path.join(out_path, "region_EI_heat_cumCO2_pre-regress.csv") + ) From 8e86bce3cdbc0eb01ed2c940606b48b83cb8e803 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Mon, 13 Jan 2025 16:11:09 +0100 Subject: [PATCH 48/53] Add example script for extracting city data from rasters --- .../chilled/cities/example_coords.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 message_ix_buildings/chilled/cities/example_coords.py diff --git a/message_ix_buildings/chilled/cities/example_coords.py b/message_ix_buildings/chilled/cities/example_coords.py new file mode 100644 index 0000000..88ec7c4 --- /dev/null +++ b/message_ix_buildings/chilled/cities/example_coords.py @@ -0,0 +1,51 @@ +import numpy as np +import pandas as pd +import xarray as xr + +# Load example temperature data +temp_file = "/Volumes/mengm.pdrv/watxene/ISIMIP/ISIMIP3b/InputData/climate_updated/bias-adjusted/ssp126/GFDL-ESM4/gfdl-esm4_r1i1p1f1_w5e5_ssp126_tas_global_daily_2015_2020.nc" + +# Read the temperature data +temp = xr.open_dataarray(temp_file) + +# Example: List of city coordinates (lat, lon) +city_coords = [ + (51.5074, -0.1278), # London + (40.7128, -74.0060), # New York + (35.6895, 139.6917), # Tokyo +] + +# Convert to a pandas DataFrame for clarity +city_df = pd.DataFrame(city_coords, columns=["lat", "lon"]) + +# Step 1: Stack lat and lon into a single dimension 'locations' +stacked_temp = temp.stack(locations=("lat", "lon")) + +# Step 2: Find the nearest indices manually by calculating the distances +selected_points = [] +for _, row in city_df.iterrows(): + lat, lon = row["lat"], row["lon"] + print("city: " + str(lat) + ", " + str(lon)) + + # Find the nearest index by calculating the distance between each point + # and the given coordinates + dist = np.sqrt((stacked_temp.lat - lat) ** 2 + (stacked_temp.lon - lon) ** 2) + nearest_idx = dist.argmin() # index of the nearest point + + # Select the nearest point based on the index + nearest_point = stacked_temp.isel(locations=nearest_idx) + + # Add lat, lon as coordinates as city_lat, city_lon + nearest_point["city_location"] = "(" + str(lat) + ", " + str(lon) + ")" + nearest_point["city_lat"] = lat + nearest_point["city_lon"] = lon + + # Append the selected point to the list + selected_points.append(nearest_point) + +# Step 3: Concatenate the selected points into a single 1D xarray +selected_vector = xr.concat(selected_points, dim="locations") + +# Display results as a 1D array or convert to pandas DataFrame if preferred +df = selected_vector.to_dataframe().reset_index() +print(df) From d2fdae8e084a2896a84a552d83d6f00b1f2cb70a Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 15 Jan 2025 12:34:32 +0100 Subject: [PATCH 49/53] Add script to apply emulation Adapted from regression.py (which will be removed after this) --- message_ix_buildings/chilled/core/emulator.py | 306 ++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 message_ix_buildings/chilled/core/emulator.py diff --git a/message_ix_buildings/chilled/core/emulator.py b/message_ix_buildings/chilled/core/emulator.py new file mode 100644 index 0000000..61169cf --- /dev/null +++ b/message_ix_buildings/chilled/core/emulator.py @@ -0,0 +1,306 @@ +import os + +import pandas as pd +import pyam # type: ignore +import statsmodels.formula.api as smf # type: ignore + +from message_ix_buildings.chilled.util.base import get_paths +from message_ix_buildings.chilled.util.common import get_logger +from message_ix_buildings.chilled.util.config import Config + +log = get_logger(__name__) + + +def apply_ols_and_quantile_reg(df, var: str): + quantiles = [0.05, 0.25, 0.5, 0.75, 0.95] + df = df.query("cumCO2.notnull()") + + log.info("Create quantile regression model... ") + mod = smf.quantreg(f"{var} ~ cumCO2", df) + # res = mod.fit(q=0.5) + log.info("...Finished creating quantile regression model") + + def fit_model(q): + res = mod.fit(q=q) + return [ + q, + res.params["Intercept"], + res.params["cumCO2"], + ] + res.conf_int().loc["cumCO2"].tolist() + + log.info("Fitting quantile regression model... ") + models = [fit_model(x) for x in quantiles] + log.info("...Finished fitting quantile regression model") + + log.info("Creating DataFrame from quantile regression model... ") + models = pd.DataFrame(models, columns=["q", "a", "b", "lb", "ub"]) + log.info("...Finished creating DataFrame from quantile regression model") + + log.info("Create OLS model... ") + ols = smf.ols(f"{var} ~ cumCO2", df).fit() + log.info("...Finished creating OLS model") + + log.info("Calculating OLS confidence interval... ") + ols_ci = ols.conf_int().loc["cumCO2"].tolist() + log.info("...Finished calculating OLS confidence interval") + + log.info("Creating OLS DataFrame... ") + ols = dict( + q="ols", + a=ols.params["Intercept"], + b=ols.params["cumCO2"], + lb=ols_ci[0], + ub=ols_ci[1], + ) + ols = pd.DataFrame(ols, index=[0]) + log.info("...Finished creating OLS DataFrame") + + # concat quantile regression and ols + log.info("Concatenating quantile regression and OLS DataFrames... ") + models_ols = pd.concat([models, ols]).reset_index(drop=True) + log.info("...Finished concatenating quantile regression and OLS DataFrames") + + # keep unique columns of df: region, name_run, urt, arch + un_df = df.reindex(["region", "name_run", "urt", "arch"], axis=1).drop_duplicates() + + # merge unique columns with all_res + res = pd.merge(un_df.assign(key="z"), models_ols.assign(key="z"), on="key").drop( + columns="key" + ) + + return res + + +def quantile_regression(reg_data, var: str): + regr_data = reg_data.query("cumCO2.notnull()").query( + "scenario.str.startswith('ssp')" + ) + + grouped_ei_cumCO2 = regr_data.groupby(["region", "name_run", "urt", "arch"]) + list_df_group = [g for _, g in grouped_ei_cumCO2] + + log.info("Applying apply_ols_and_quantile_reg()... ") + reg = pd.Series(list_df_group).apply(lambda df: apply_ols_and_quantile_reg(df, var)) + log.info("...Finished applying apply_ols_and_quantile_reg()") + + reg = pd.concat(reg.tolist()).reset_index(drop=True) + + log.info("Calculating IQR... ") + # calculate iqr + iqr_b = ( + reg.query("q == 0.25 or q == 0.75") + .pivot_table( + values="b", index=["region", "name_run", "urt", "arch"], columns="q" + ) + .reset_index() + .assign(iqr_b=lambda x: x[0.75] - x[0.25]) + .drop(columns=[0.25, 0.75]) + ) + + iqr_a = ( + reg.query("q == 0.25 or q == 0.75") + .pivot_table( + values="a", index=["region", "name_run", "urt", "arch"], columns="q" + ) + .reset_index() + .assign(iqr_a=lambda x: x[0.75] - x[0.25]) + .drop(columns=[0.25, 0.75]) + ) + + df_iqr = pd.merge(iqr_a, iqr_b, on=["region", "name_run", "urt", "arch"]) + log.info("...Finished calculating IQR") + + log.info("Merging regression parameters with IQR... ") + out = pd.merge(reg, df_iqr, on=["region", "name_run", "urt", "arch"]) + log.info("...Finished merging regression parameters with IQR") + + return out + + +def produce_regression_files( + variable: str, + save_path: str, + cumco2_file: str, + file_str: str, + variable_str: str, + scenarios: list, +): + log.info("Reading in EI vs cumCO2 data... ") + # Load EI vs cumCO2 data + EI_cumCO2 = pd.read_csv(os.path.join(save_path, cumco2_file)) + log.info("...Finished reading in EI vs cumCO2 data") + + log.info("Reading in engage emissions... ") + # Load engage emissions + engage_cumCO2 = ( + pyam.IamDataFrame( + os.path.join(save_path, "engage_emissions_tempAR6_cumCO2.xlsx") + ) + .filter(variable="Cumulative CO2 infilled*") + .as_pandas() + .assign(variable="Cumulative Emissions|CO2") + ) + log.info("...Finished reading in engage emissions") + + log.info("Applying quantile_regression()... ") + regr_params = quantile_regression(EI_cumCO2, variable) + log.info("...Finished applying quantile_regression()") + + # join engage emissions with regression parameters to calculate climate change EI + log.info("Join engage emissions w/ regression parameters to calculate CC EI... ") + df_cc = ( + pd.merge( + regr_params.assign(key="z"), + engage_cumCO2.assign(key="z").drop(columns=["exclude", "region"]), + on="key", + ) + .drop(columns="key") + .rename(columns={"value": "cumCO2"}) + .assign( + value=lambda x: x.b * x.cumCO2 + x.a, + model="MESS-CHILL-URM", + variable=lambda x: variable_str + x.arch, + unit="MJ / m2 / yr", + ) + .reindex( + [ + "model", + "scenario", + "name_run", + "urt", + "arch", + "q", + "region", + "year", + "cumCO2", + "variable", + "unit", + "value", + ], + axis=1, + ) + ) + log.info( + "...Finished joining engage emissions w/ regression parameters to calculate CC EI" + ) + + # calculate no climate change EI + # take median across GCMs + log.info("Calculating no climate change EI... ") + single_nocc = ( + EI_cumCO2.query("scenario == 'baseline'") + .reindex( + ["name_run", "urt", "arch", "clim", "region", "year", variable], + axis=1, + ) + .groupby(["name_run", "urt", "arch", "clim", "region", "year"]) + .median() + .reset_index() + ) + log.info("...Finished calculating no climate change EI") + + # Repeat single_cc for each scenario + log.info("Repeating single_cc for each scenario... ") + single_nocc_list = [] + for s in scenarios: + log.info(f"...Repeating single_cc for scenario: {s}") + single_noccnew = single_nocc.assign(scenario=s) + single_nocc_list.append(single_noccnew) + log.info("...Finished repeating single_cc for each scenario") + + log.info("Creating DataFrame for no climate change EI... ") + df_nocc = ( + pd.concat(single_nocc_list) + .assign( + q="baseline", + model="MESS-CHILL-URM", + variable=lambda x: variable_str + x.arch, + unit="MJ / m2 / yr", + ) + .rename(columns={variable: "value"}) + .reindex( + [ + "model", + "scenario", + "name_run", + "urt", + "arch", + "q", + "region", + "year", + "cumCO2", + "variable", + "unit", + "value", + ], + axis=1, + ) + ) + log.info("...Finished creating DataFrame for no climate change EI") + + log.info("Saving files... ") + regr_params.to_csv( + os.path.join(save_path, "regression_results_{file_str}.csv"), index=False + ) + + log.info("Saved: " + os.path.join(save_path, "regression_results_{file_str}.csv")) + + df_cc.to_csv( + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_cc_long_{file_str}.csv"), + index=False, + ) + + log.info( + "Saved: " + + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_cc_long_{file_str}.csv") + ) + + df_nocc.to_csv( + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_nocc_long_{file_str}.csv"), + index=False, + ) + + log.info( + "Saved: " + + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_nocc_long_{file_str}.csv") + ) + + +def apply_emulator( + config: "Config", +): + project_path = get_paths(config, "project_path") + version_path = os.path.join(project_path, "out", "version", config.vstr) + out_path = os.path.join(version_path, "output") + + # % Add regional populations + scenarios = ["EN_NPi2020_300f", "EN_NPi2020_1400f", "EN_NPi2100"] + log.info("Selected scenarios: " + ", ".join(scenarios)) + + log.info("Reading in population data... ") + popdata = pyam.IamDataFrame(os.path.join(out_path, "population_by_region.csv")) + for scenario in scenarios: + popnew = popdata.rename({"scenario": {"SSP2": scenario}}) + popdata.append(popnew.filter(scenario=scenario), inplace=True) + popdata.filter(scenario="SSP2", keep=False, inplace=True) + log.info("...Finished reading in population data") + + if config.cool == 1: + produce_regression_files( + variable="EI_ac_m2", + save_path=out_path, + cumco2_file="region_EI_cool_cumCO2_pre-regress.csv", + file_str="cool", + variable_str="Elec_Intensity|AC|", + scenarios=scenarios, + ) + + if config.heat == 1: + produce_regression_files( + variable="EI_h_m2", + save_path=out_path, + cumco2_file="region_EI_heat_cumCO2_pre-regress.csv", + file_str="heat", + variable_str="Elec_Intensity|Heat|", + scenarios=scenarios, + ) From 74dc389786efaa0cb6ce556481fbaa5576d93f8f Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 15 Jan 2025 12:35:03 +0100 Subject: [PATCH 50/53] Add script to run emulator --- message_ix_buildings/chilled/run_emulator.py | 72 ++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 message_ix_buildings/chilled/run_emulator.py diff --git a/message_ix_buildings/chilled/run_emulator.py b/message_ix_buildings/chilled/run_emulator.py new file mode 100644 index 0000000..36bab7b --- /dev/null +++ b/message_ix_buildings/chilled/run_emulator.py @@ -0,0 +1,72 @@ +import sys +from argparse import ArgumentParser + +from message_ix_buildings.chilled.core.emulator import apply_emulator +from message_ix_buildings.chilled.util.common import get_logger +from message_ix_buildings.chilled.util.config import Config # type: ignore + +log = get_logger(__name__) + + +def parse_arguments(arguments): + """ + + :return: + """ + parser = ArgumentParser(add_help=True) + + parser.add_argument( + "-version", + "--version", + default="ALPS2023", + help="Version of inputs to run. Default: ALPS2023.", + ) + + # Parse arguments + parsed_arguments = parser.parse_known_args(args=arguments)[0] + + return parsed_arguments + + +def print_arguments(parsed_arguments): + """ + :param parsed_arguments: + + """ + + # Print arguments + log.info( + "\n" + + "---------- Parsed arguments ------------" + + "\n" + + "Selected version: " + + parsed_arguments.version + ) + + +def create_config(parsed_arguments): + cfg = Config( + vstr=parsed_arguments.version, + cool=0, + heat=1, + ) + + return cfg + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + parsed_args = parse_arguments(arguments=args) + + # Run the main function + print_arguments(parsed_arguments=parsed_args) + cfg = create_config(parsed_arguments=parsed_args) + + log.info("RUNNING apply_emulator()........") + apply_emulator(cfg) + + +if __name__ == "__main__": + main() From 2f1582f91e5dd8b2090f77b69e06c353a0154611 Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 15 Jan 2025 12:45:55 +0100 Subject: [PATCH 51/53] Comment out logs --- message_ix_buildings/chilled/core/emulator.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/message_ix_buildings/chilled/core/emulator.py b/message_ix_buildings/chilled/core/emulator.py index 61169cf..d5e0344 100644 --- a/message_ix_buildings/chilled/core/emulator.py +++ b/message_ix_buildings/chilled/core/emulator.py @@ -15,10 +15,10 @@ def apply_ols_and_quantile_reg(df, var: str): quantiles = [0.05, 0.25, 0.5, 0.75, 0.95] df = df.query("cumCO2.notnull()") - log.info("Create quantile regression model... ") + # log.info("Create quantile regression model... ") mod = smf.quantreg(f"{var} ~ cumCO2", df) # res = mod.fit(q=0.5) - log.info("...Finished creating quantile regression model") + # log.info("...Finished creating quantile regression model") def fit_model(q): res = mod.fit(q=q) @@ -28,23 +28,23 @@ def fit_model(q): res.params["cumCO2"], ] + res.conf_int().loc["cumCO2"].tolist() - log.info("Fitting quantile regression model... ") + # log.info("Fitting quantile regression model... ") models = [fit_model(x) for x in quantiles] - log.info("...Finished fitting quantile regression model") + # log.info("...Finished fitting quantile regression model") - log.info("Creating DataFrame from quantile regression model... ") + # log.info("Creating DataFrame from quantile regression model... ") models = pd.DataFrame(models, columns=["q", "a", "b", "lb", "ub"]) - log.info("...Finished creating DataFrame from quantile regression model") + # log.info("...Finished creating DataFrame from quantile regression model") - log.info("Create OLS model... ") + # log.info("Create OLS model... ") ols = smf.ols(f"{var} ~ cumCO2", df).fit() - log.info("...Finished creating OLS model") + # log.info("...Finished creating OLS model") - log.info("Calculating OLS confidence interval... ") + # log.info("Calculating OLS confidence interval... ") ols_ci = ols.conf_int().loc["cumCO2"].tolist() - log.info("...Finished calculating OLS confidence interval") + # log.info("...Finished calculating OLS confidence interval") - log.info("Creating OLS DataFrame... ") + # log.info("Creating OLS DataFrame... ") ols = dict( q="ols", a=ols.params["Intercept"], @@ -53,12 +53,12 @@ def fit_model(q): ub=ols_ci[1], ) ols = pd.DataFrame(ols, index=[0]) - log.info("...Finished creating OLS DataFrame") + # log.info("...Finished creating OLS DataFrame") # concat quantile regression and ols - log.info("Concatenating quantile regression and OLS DataFrames... ") + # log.info("Concatenating quantile regression and OLS DataFrames... ") models_ols = pd.concat([models, ols]).reset_index(drop=True) - log.info("...Finished concatenating quantile regression and OLS DataFrames") + # log.info("...Finished concatenating quantile regression and OLS DataFrames") # keep unique columns of df: region, name_run, urt, arch un_df = df.reindex(["region", "name_run", "urt", "arch"], axis=1).drop_duplicates() From 54f02f826ffc492573d1b13f56855202bad700fe Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 15 Jan 2025 12:47:00 +0100 Subject: [PATCH 52/53] Remove `exclude` column --- message_ix_buildings/chilled/core/emulator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix_buildings/chilled/core/emulator.py b/message_ix_buildings/chilled/core/emulator.py index d5e0344..5c27b86 100644 --- a/message_ix_buildings/chilled/core/emulator.py +++ b/message_ix_buildings/chilled/core/emulator.py @@ -151,7 +151,7 @@ def produce_regression_files( df_cc = ( pd.merge( regr_params.assign(key="z"), - engage_cumCO2.assign(key="z").drop(columns=["exclude", "region"]), + engage_cumCO2.assign(key="z").drop(columns=["region"]), on="key", ) .drop(columns="key") From 63ebca46cde1f0eb63de965cef29c9cea788b30d Mon Sep 17 00:00:00 2001 From: Measrainsey Meng Date: Wed, 15 Jan 2025 12:49:49 +0100 Subject: [PATCH 53/53] Fix `file_str` being used in filenames --- message_ix_buildings/chilled/core/emulator.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/message_ix_buildings/chilled/core/emulator.py b/message_ix_buildings/chilled/core/emulator.py index 5c27b86..5bbee24 100644 --- a/message_ix_buildings/chilled/core/emulator.py +++ b/message_ix_buildings/chilled/core/emulator.py @@ -240,29 +240,31 @@ def produce_regression_files( log.info("Saving files... ") regr_params.to_csv( - os.path.join(save_path, "regression_results_{file_str}.csv"), index=False + os.path.join(save_path, "regression_results_" + file_str + ".csv"), index=False ) - log.info("Saved: " + os.path.join(save_path, "regression_results_{file_str}.csv")) + log.info( + "Saved: " + os.path.join(save_path, "regression_results_" + file_str + ".csv") + ) df_cc.to_csv( - os.path.join(save_path, "REGIONAL_EI_PATHWAYS_cc_long_{file_str}.csv"), + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_cc_long_" + file_str + ".csv"), index=False, ) log.info( "Saved: " - + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_cc_long_{file_str}.csv") + + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_cc_long_" + file_str + ".csv") ) df_nocc.to_csv( - os.path.join(save_path, "REGIONAL_EI_PATHWAYS_nocc_long_{file_str}.csv"), + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_nocc_long_" + file_str + ".csv"), index=False, ) log.info( "Saved: " - + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_nocc_long_{file_str}.csv") + + os.path.join(save_path, "REGIONAL_EI_PATHWAYS_nocc_long_" + file_str + ".csv") )