Skip to content

Commit d62b0c9

Browse files
committed
2 parents 94a4c15 + 9da205e commit d62b0c9

File tree

6 files changed

+528
-85
lines changed

6 files changed

+528
-85
lines changed

climada/engine/cost_benefit.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,17 @@ class CostBenefit():
7676
Value: dict with:
7777
'cost' (float): cost measure,
7878
'risk' (float): risk measurement,
79+
'risk_transf' (float): annual expected risk transfer,
7980
'efc' (ImpactFreqCurve): impact exceedance freq
80-
(optionally) 'impact' (Impact): impact instance
81+
(optional) 'impact' (Impact): impact instance
8182
imp_meas_present (dict): impact of each measure at present.
8283
Key: measure name ('no measure' used for case without measure),
8384
Value: dict with:
8485
'cost' (float): cost measure,
8586
'risk' (float): risk measurement,
87+
'risk_transf' (float): annual expected risk transfer,
8688
'efc' (ImpactFreqCurve): impact exceedance freq
87-
(optionally) 'impact' (Impact): impact instance
89+
(optional) 'impact' (Impact): impact instance
8890
"""
8991

9092
def __init__(self):
@@ -345,20 +347,18 @@ def _calc_impact_measures(self, hazard, exposures, meas_set, imp_fun_set, \
345347
impact_meas['no measure'] = dict()
346348
impact_meas['no measure']['cost'] = 0.0
347349
impact_meas['no measure']['risk'] = risk_func(imp_tmp)
350+
impact_meas['no measure']['risk_transf'] = 0.0
348351
impact_meas['no measure']['efc'] = imp_tmp.calc_freq_curve(DEF_RP)
349352
if save_imp:
350353
impact_meas['no measure']['impact'] = imp_tmp
351354

352355
# compute impact for each measure
353356
for measure in meas_set.get_measure():
354-
new_exp, new_ifs, new_haz = measure.apply(exposures, imp_fun_set,
355-
hazard)
356-
357-
imp_tmp = Impact()
358-
imp_tmp.calc(new_exp, new_ifs, new_haz)
357+
imp_tmp, risk_transf = measure.calc_impact(exposures, imp_fun_set, hazard)
359358
impact_meas[measure.name] = dict()
360359
impact_meas[measure.name]['cost'] = measure.cost
361360
impact_meas[measure.name]['risk'] = risk_func(imp_tmp)
361+
impact_meas[measure.name]['risk_transf'] = risk_transf
362362
impact_meas[measure.name]['efc'] = imp_tmp.calc_freq_curve(DEF_RP)
363363
if save_imp:
364364
impact_meas[measure.name]['impact'] = imp_tmp
@@ -379,8 +379,7 @@ def _calc_cost_benefit(self, disc_rates, imp_time_depen=None):
379379
"""
380380
LOGGER.info('Computing cost benefit from years %s to %s.',
381381
str(self.present_year), str(self.future_year))
382-
# TODO add risk transfer
383-
# TODO add premium
382+
384383
if self.future_year - self.present_year + 1 <= 0:
385384
LOGGER.error('Wrong year range: %s - %s.', str(self.present_year),
386385
str(self.future_year))
@@ -407,18 +406,25 @@ def _calc_cost_benefit(self, disc_rates, imp_time_depen=None):
407406
continue
408407

409408
fut_benefit = self.imp_meas_future['no measure']['risk'] - meas_val['risk']
410-
409+
fut_risk_tr = meas_val['risk_transf']
411410
if self.imp_meas_present:
412411
pres_benefit = self.imp_meas_present['no measure']['risk'] - \
413412
self.imp_meas_present[meas_name]['risk']
414413
meas_ben = pres_benefit + (fut_benefit-pres_benefit) * time_dep
414+
415+
pres_risk_tr = self.imp_meas_present[meas_name]['risk_transf']
416+
risk_tr = pres_risk_tr + (fut_risk_tr-pres_risk_tr) * time_dep
415417
else:
416418
meas_ben = time_dep*fut_benefit
419+
risk_tr = time_dep*fut_risk_tr
417420

421+
# discount
418422
meas_ben = disc_rates.net_present_value(self.present_year,
419423
self.future_year, meas_ben)
424+
risk_tr = disc_rates.net_present_value(self.present_year,
425+
self.future_year, risk_tr)
420426
self.benefit[meas_name] = meas_ben
421-
self.cost_ben_ratio[meas_name] = meas_val['cost']/meas_ben
427+
self.cost_ben_ratio[meas_name] = (meas_val['cost']+risk_tr)/meas_ben
422428

423429
def _time_dependency_array(self, imp_time_depen=None):
424430
""" Construct time dependency array. Each year contains a value in [0,1]

climada/entity/exposures/base.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ def check(self):
133133
for var in self.vars_oblig:
134134
if var == INDICATOR_IF:
135135
found = np.array([var in var_col for var_col in self.columns]).any()
136+
if INDICATOR_IF in self.columns:
137+
LOGGER.warning("Hazard type not set in %s", var)
136138
else:
137139
found = var in self.columns
138140
if not found:
@@ -142,6 +144,8 @@ def check(self):
142144
for var in self.vars_def:
143145
if var == INDICATOR_CENTR:
144146
found = np.array([var in var_col for var_col in self.columns]).any()
147+
if INDICATOR_CENTR in self.columns:
148+
LOGGER.warning("Hazard type not set in %s", var)
145149
else:
146150
found = var in self.columns
147151
if not found:

0 commit comments

Comments
 (0)