Skip to content

Commit ec8a14e

Browse files
authored
Merge pull request #1 from ClimateImpactLab/functions
PR for functions branch
2 parents 06a6eac + 4b69d6d commit ec8a14e

File tree

23,928 files changed

+2948
-3889
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

23,928 files changed

+2948
-3889
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import xarray as xr
2+
import pandas as pd
3+
import os, sys, yaml
4+
5+
USER = os.getenv("USER")
6+
from dscim.utils.functions import get_model_weights, US_territories
7+
from impactlab_tools.utils.weighting import weighted_quantile_xr
8+
import numpy as np
9+
import matplotlib.pyplot as plt
10+
11+
12+
def income_boxplot(
13+
damages,
14+
delta_var,
15+
socioec,
16+
quantile,
17+
sector,
18+
rcp,
19+
ssp,
20+
model,
21+
year,
22+
USA,
23+
output,
24+
):
25+
26+
if quantile == "quintile":
27+
bin_breaks = np.linspace(0, 1, 6)
28+
elif quantile == "decile":
29+
bin_breaks = np.linspace(0, 1, 11)
30+
31+
# open files and select relevant data
32+
socioec = xr.open_zarr(socioec).sel(ssp=ssp, model=model)
33+
mean_damages = xr.open_zarr(damages).sel(ssp=ssp, model=model, year=year, rcp=rcp)[
34+
delta_var
35+
]
36+
37+
if USA == True:
38+
# subset US data
39+
US_IRs = [
40+
i for i in socioec.region.values if any(j in i for j in US_territories())
41+
]
42+
socioec = socioec.sel(region=US_IRs)
43+
mean_damages = mean_damages.sel(region=US_IRs)
44+
45+
if "CAMEL" not in sector:
46+
# reduce damages for non-CAMEL sectors (CAMEL is generated differently and is thus pre-collapsed)
47+
weights = get_model_weights(rcp)
48+
mean_damages = mean_damages.mean("batch").weighted(weights).mean("gcm")
49+
50+
# get damages as a share of income
51+
damages_inc_share = (
52+
mean_damages
53+
/ socioec.gdppc.sel(year=2020).rename("damages_inc_share").to_dataset()
54+
)
55+
damages_inc_share["present_gdppc"] = socioec.gdppc.sel(year=2020)
56+
damages_inc_share["present_pop"] = socioec["pop"].sel(year=2020)
57+
damages_inc_share = damages_inc_share.dropna("region")
58+
59+
# pop-weighted gdppc quantiles (determine the bin cutoffs)
60+
bins = weighted_quantile_xr(
61+
damages_inc_share.present_gdppc,
62+
bin_breaks,
63+
damages_inc_share.present_pop,
64+
"region",
65+
).values
66+
67+
groupby = damages_inc_share.groupby_bins("present_gdppc", bins)
68+
69+
plot_bins = []
70+
quantiles = [0.05, 0.25, 0.5, 0.75, 0.95]
71+
72+
# get quantiles of damages_inc_share for each gdppc bin
73+
for i, j in groupby:
74+
75+
bin_no = [round(i, 1) for i in bins].index(round(i.left, 1))
76+
77+
values = list(
78+
weighted_quantile_xr(
79+
j.damages_inc_share, quantiles, j.present_pop, "region"
80+
).values
81+
)
82+
83+
values.append(j.damages_inc_share.weighted(j.present_pop).mean())
84+
85+
plot_bins.append((bin_no + 1, values))
86+
87+
# plot them
88+
fig, ax = plt.subplots(figsize=(15, 10), sharey=True)
89+
90+
stats = []
91+
92+
for bin, s in sorted(plot_bins):
93+
94+
stats.append(
95+
{
96+
"label": bin,
97+
"mean": s[5],
98+
"med": s[2],
99+
"q1": s[1],
100+
"q3": s[3],
101+
"whislo": s[0],
102+
"whishi": s[4],
103+
"fliers": [],
104+
}
105+
)
106+
107+
bxp = ax.bxp(stats, showmeans=True, meanline=False)
108+
ax.set_ylabel(f"{year} damages as a share of present-day GDP")
109+
ax.set_xlabel("Decile of present-day GDP per capita")
110+
ax.spines["top"].set_visible(False)
111+
ax.spines["right"].set_visible(False)
112+
113+
os.makedirs(output, exist_ok=True)
114+
plt.savefig(
115+
f"{output}/boxplot_{sector}_domestic-{USA}_{rcp}_{ssp}_{model}_{quantile}_{year}.png",
116+
bbox_inches="tight",
117+
dpi=300,
118+
)

dscim/diagnostics/var_timeseries.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ def get_rff_id(
2424
):
2525

2626
if mask in ["epa_mask", "unmasked"]:
27-
results = f"{results_root}/{sector}/{pulse_year}/unmasked_None/"
27+
pass
2828
elif mask == "gdppc_mask":
29-
results = f"{results_root}/{sector}/{pulse_year}/gdppc_emissions_q0.01_q0.99"
29+
print("gdppc_mask deprecated")
3030

3131
sccs = (
3232
xr.open_dataset(
33-
f"{results}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_sccs.nc4"
33+
f"{results_root}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_sccs.nc4"
3434
)
3535
.sel(
3636
weitzman_parameter="0.5",
@@ -143,11 +143,8 @@ def rff_timeseries(
143143
runid_root,
144144
discrate=0.02,
145145
pulse_year=2020,
146-
results_mask="unmasked_None",
147146
):
148147

149-
results = f"{results_root}/{sector}/{pulse_year}/{results_mask}"
150-
151148
# index
152149
rff_ids = (
153150
pd.read_csv(
@@ -163,7 +160,7 @@ def rff_timeseries(
163160
# sccs
164161
sccs = (
165162
xr.open_dataset(
166-
f"{results}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_sccs.nc4"
163+
f"{results_root}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_sccs.nc4"
167164
)
168165
.sel(
169166
weitzman_parameter="0.5", gas=gas, fair_aggregation="uncollapsed", drop=True
@@ -174,7 +171,7 @@ def rff_timeseries(
174171
# marginal damages
175172
damages = (
176173
xr.open_zarr(
177-
f"{results}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_marginal_damages.zarr"
174+
f"{results_root}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_marginal_damages.zarr"
178175
)
179176
.sel(weitzman_parameter="0.5", gas=gas, drop=True)
180177
.marginal_damages
@@ -183,7 +180,7 @@ def rff_timeseries(
183180
# discount factors
184181
df = (
185182
xr.open_zarr(
186-
f"{results}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_discount_factors.zarr"
183+
f"{results_root}/{recipe}_{disc}_eta{eta}_rho{rho}_uncollapsed_discount_factors.zarr"
187184
)
188185
.sel(weitzman_parameter="0.5", gas=gas, drop=True)
189186
.discount_factor.rename("discount_factors")

dscim/menu/equity.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def ce_cc_calculation(self) -> xr.DataArray:
1717
else:
1818
dims = ["region"]
1919

20-
ce_cc = self.risk_aversion_damages("ce_cc").ce_cc
20+
ce_cc = self.risk_aversion_damages("cc").cc
2121

2222
# reindex to make sure all regions are being calculated
2323
if len(ce_cc.region.values) < len(self.gdppc.region.values):
@@ -32,15 +32,15 @@ def ce_cc_calculation(self) -> xr.DataArray:
3232
eta=self.eta,
3333
)
3434

35-
return ce_array.rename("ce_cc")
35+
return ce_array.rename("cc")
3636

3737
def ce_no_cc_calculation(self) -> xr.DataArray:
3838
if "gwr" in self.discounting_type:
3939
dims = ["ssp", "model", "region"]
4040
else:
4141
dims = ["region"]
4242

43-
ce_no_cc = self.risk_aversion_damages("ce_no_cc").ce_no_cc
43+
ce_no_cc = self.risk_aversion_damages("no_cc").no_cc
4444
# reindex to make sure all regions are being calculated
4545
if len(ce_no_cc.region.values) < len(self.gdppc.region.values):
4646
ce_no_cc = ce_no_cc.reindex({"region": self.gdppc.region.values})
@@ -54,7 +54,7 @@ def ce_no_cc_calculation(self) -> xr.DataArray:
5454
eta=self.eta,
5555
)
5656

57-
return ce_no_cc_array.rename("ce_no_cc")
57+
return ce_no_cc_array.rename("no_cc")
5858

5959
@property
6060
def calculated_damages(self) -> xr.DataArray:

dscim/menu/main_recipe.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ class MainRecipe(StackedDamages, ABC):
7171

7272
def __init__(
7373
self,
74-
sector_path,
75-
save_path,
7674
econ_vars,
7775
climate_vars,
7876
sector,
7977
formula,
78+
sector_path=None,
79+
save_path=None,
8080
rho=0.00461878399,
8181
eta=1.421158116,
8282
fit_type="ols",
@@ -92,7 +92,7 @@ def __init__(
9292
gdppc_bottom_code=39.39265060424805,
9393
scc_quantiles=[0.05, 0.17, 0.25, 0.5, 0.75, 0.83, 0.95],
9494
scenario_dimensions=None,
95-
weitzman_parameter=[0.1],
95+
weitzman_parameter=[0.1, 0.5],
9696
fair_aggregation=["ce", "mean", "gwr_mean", "median", "median_params"],
9797
filename_suffix="",
9898
discrete_discounting=False,

dscim/menu/risk_aversion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def ce_cc_calculation(self) -> xr.DataArray:
1717
-------
1818
xr.DataArray
1919
"""
20-
ce_array = self.risk_aversion_damages("ce_cc").ce_cc
20+
ce_array = self.risk_aversion_damages("cc").cc
2121

2222
# for GWR options, take the CE over growth models
2323
if "gwr" in self.discounting_type:
@@ -32,7 +32,7 @@ def ce_no_cc_calculation(self) -> xr.DataArray:
3232
-------
3333
xr.DataArray
3434
"""
35-
ce_array = self.risk_aversion_damages("ce_no_cc").ce_no_cc
35+
ce_array = self.risk_aversion_damages("no_cc").no_cc
3636

3737
if "gwr" in self.discounting_type:
3838
ce_array = self.ce(ce_array, dims=["ssp", "model"])

dscim/menu/simple_storage.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ def __init__(
4646
gmsl_path,
4747
gmst_fair_path,
4848
damages_pulse_conversion_path,
49+
pulse_year,
4950
gmsl_fair_path=None,
5051
ecs_mask_path=None,
5152
ecs_mask_name=None,
52-
pulse_year=2020,
5353
base_period=[2001, 2010],
5454
emission_scenarios=["ssp119", "ssp126", "ssp245", "ssp460", "ssp370", "ssp585"],
5555
gases=["CO2_Fossil", "CH4", "N2O"],
@@ -388,16 +388,15 @@ def gdppc(self):
388388
def adding_up_damages(self):
389389
"""This property calls pre-calculated adding-up IR-level 'mean' over batches."""
390390

391-
mean_cc = f"{self.ce_path}/adding_up_ce_cc_eta{self.eta}.zarr"
392-
mean_no_cc = f"{self.ce_path}/adding_up_ce_no_cc_eta{self.eta}.zarr"
391+
mean_cc = f"{self.ce_path}/adding_up_cc.zarr"
392+
mean_no_cc = f"{self.ce_path}/adding_up_no_cc.zarr"
393393

394394
if os.path.exists(mean_cc) and os.path.exists(mean_no_cc):
395395
self.logger.info(
396396
f"Adding up aggregated damages found at {mean_cc}, {mean_no_cc}. These are being loaded..."
397397
)
398398
damages = (
399-
(xr.open_zarr(mean_no_cc).ce_no_cc - xr.open_zarr(mean_cc).ce_cc)
400-
* self.pop
399+
(xr.open_zarr(mean_no_cc).no_cc - xr.open_zarr(mean_cc).cc) * self.pop
401400
).sum("region")
402401
else:
403402
raise NotImplementedError(
@@ -410,7 +409,7 @@ def risk_aversion_damages(self, ce_type):
410409
411410
Parameters
412411
----------
413-
ce_type : either `ce_no_cc` or `ce_cc`
412+
ce_type : either `no_cc` or `cc`
414413
415414
Returns
416415
-------

0 commit comments

Comments
 (0)