END-TO-END IMPACT CALCULATION#

Goal of this tutorial#

The goal of this tutorial is to show a full end-to-end impact computation. Note that this tutorial exemplifies the work flow, but does not explore all possible features.

What is an Impact?#

The impact is the combined effect of hazard events on a set of exposures mediated by a set of impact functions. By computing the impact for each event (historical and synthetic) and for each exposure value at each geographical location, the Impact class provides different risk measures, such as the expected annual impact per exposure, the probable maximum impact for different return periods, and the total average annual impact.

Impact class data structure#

The impact class does not require any attributes to be defined by the user. All attributes are set by the method ImpactCalc.impact(). This method requires three attributes: an Exposure, a Hazard, and an ImpactFuncSet. After calling ImpactCalc(Exposure, ImpactFuncSet, Hazard).impact(save_mat=False), the Impact object has the following attributes:

Attributes from input

Data Type

Description

event_id

list(int)

id (>0) of each hazard event (Hazard.event_id)

event_name

(list(str))

name of each event (Hazard.event_name)

date

np.array

date of events (Hazard.date)

coord_exp

np.array

exposures coordinates [lat, lon] (in degrees) (Exposure.latidue, Exposure.longitude)

frequency

np.array

frequency of events (Hazard.frequency)

frequency_unit

str

unit of event frequency, by default ‘1/year’, i.e., annual (Hazard.frequency_unit)

unit

str

value unit used (Exposure.value_unit)

csr

str

unit system for Exposure and Hazard geographical data (Exposure.csr)



Computed attributes

Data Type

Description

at_event

np.array

impact for each hazard event summed over all locations

eai_exp

np.array

expected annual impact for each locations, summed over all events weigthed by frequency

aai_agg

float

total annual average aggregated impact value (summed over events and locations)

impt_mat

sparse.csr_matrix

This is the impact matrix. This matrix has the events as rows and the exposure points as columns (num_events X num_exp). It will only be filled with impact values if save_mat is True.

tot_value

float

total exposure value affected (sum of value all exposures locations affected by at least one hazard event)

All other methods compute values from the attributes set by ImpactCalc.impact(). For example, one can compute the frequency exceedance curve, plot impact data, or compute traditional risk transfer over impact.

How do I compute an impact in CLIMADA?#

In CLIMADA, impacts are computed using the Impact class. The computation of the impact requires an Exposure , an ImpactFuncSet, and a Hazard object. For details about how to define Exposures , Hazard, Impact Functions see the respective tutorials.

The steps of an impact caculations are typically:

  • Set exposure

  • Set hazard and hazard centroids

  • Set impact functions in impact function set

  • Compute impact

  • Visualize, save, use impact output

Hints: Before computing the impact of a given Exposure and Hazard, it is important to correctly match the Exposures coordinates with the Hazard Centroids. Try to have similar resolutions in Exposures and Hazard. By the impact calculation the nearest neighbor for each Exposure to the Hazard's Centroids is searched.

Hint: Set first the Exposures and use its coordinates information to set a matching Hazard.

Hint: The configuration value max_matrix_size controls the maximum matrix size contained in a chunk. By default it is set to 1e9 in the default config file. A high value makes the computation fast at the cost of increased memory consumption. You can decrease its value if you are having memory issues with the ImpactCalc.impact() method. (See the config guide on how to set configuration values).

Detailed Impact calculation - LitPop + TropCyclone#

We present a detailed example for the hazard Tropical Cyclones and the exposures from LitPop .

Define the exposure#

Exposures contain a geopandas dataframe with a geometry column, and a ‘value’ column of exposures (e.g. monetary value, population count etc.). They are either defined as a series of (latitude/longitude) points or as a raster of (latitude/longitude) points. Fundamentally, this changes nothing for the impact computations. Note that for larger number of points, consider using a raster which might be more efficient (computationally). For a low number of points, avoid using a raster if this adds a lot of exposures values equal to 0.

We shall here use a raster example.

Reminder: The exposures must be defined according to your problem either using CLIMADA exposures such as BlackMarble, LitPop, OSM, extracted from external sources (imported via csv, excel, api, …) or directly user defined.

For impact calculations, for each exposure values of the corresponding impact function to use (defined by the column impf_) and the associated hazard centroids must be defined. This is done after defining the impact function(s) and the hazard(s).

See tutorials on Exposures , Hazard, ImpactFuncSet for more details.

# Exposure from the module Litpop
# Note that the file gpw_v4_population_count_rev11_2015_30_sec.tif must be downloaded (do not forget to unzip) if
# you want to execute this cell on your computer. If you haven't downloaded it before, please have a look at the section
# "population count" of the LitPop tutorial.

%matplotlib inline
import numpy as np
from climada.entity import LitPop

# Cuba with resolution 10km and financial_mode = income group.
exp_lp = LitPop.from_countries(
    countries=["CUB"], res_arcsec=300, fin_mode="income_group"
)
exp_lp.check()
2025-09-25 13:45:59,293 - climada.entity.exposures.litpop.litpop - INFO - 
 LitPop: Init Exposure for country: CUB (192)...

2025-09-25 13:45:59,323 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,323 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,333 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,333 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,345 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,345 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,380 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,380 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,389 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,390 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,394 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,394 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,394 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,399 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,399 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,400 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,406 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,407 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,408 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,414 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,414 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,414 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,425 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,425 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,432 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,432 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,439 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,440 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,448 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,448 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,451 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,452 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,452 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,461 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,461 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,471 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,472 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,481 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,482 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,673 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,674 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,680 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,681 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,684 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,684 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,685 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,699 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,699 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,708 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,708 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,717 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,718 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,725 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,726 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,731 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,731 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,732 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,737 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,737 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,737 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,748 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,748 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,757 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,758 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,781 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,782 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,785 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,785 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,786 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,788 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,789 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,789 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,797 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,797 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,801 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:45:59,802 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,802 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,811 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,812 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,820 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,821 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,836 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,836 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,852 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,852 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,863 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,864 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,879 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,879 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,892 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:45:59,892 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:45:59,897 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:46:00,283 - climada.util.finance - INFO - GDP CUB 2018: 1.001e+11.
2025-09-25 13:46:00,313 - climada.util.finance - INFO - Income group CUB 2018: 3.
2025-09-25 13:46:00,320 - climada.entity.exposures.base - INFO - Hazard type not set in impf_
2025-09-25 13:46:00,321 - climada.entity.exposures.base - INFO - category_id not set.
2025-09-25 13:46:00,321 - climada.entity.exposures.base - INFO - cover not set.
2025-09-25 13:46:00,321 - climada.entity.exposures.base - INFO - deductible not set.
2025-09-25 13:46:00,321 - climada.entity.exposures.base - INFO - centr_ not set.
2025-09-25 13:46:00,322 - climada.entity.exposures.base - INFO - Hazard type not set in impf_
2025-09-25 13:46:00,322 - climada.entity.exposures.base - INFO - category_id not set.
2025-09-25 13:46:00,322 - climada.entity.exposures.base - INFO - cover not set.
2025-09-25 13:46:00,322 - climada.entity.exposures.base - INFO - deductible not set.
2025-09-25 13:46:00,322 - climada.entity.exposures.base - INFO - centr_ not set.
/Users/shuelsen/climada_install/climada_python/climada/util/finance.py:294: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  dfr_wb = dfr_wb.replace(
exp_lp.gdf.head()
value region_id impf_ geometry
0 1.077368e+05 192 1 POINT (-81.375 21.70833)
1 1.671874e+06 192 1 POINT (-81.54167 21.625)
2 3.421209e+06 192 1 POINT (-82.95833 21.875)
3 1.546590e+07 192 1 POINT (-82.875 21.875)
4 7.168308e+07 192 1 POINT (-82.79167 21.875)
# not needed for impact calculations
# visualize the define exposure
exp_lp.plot_raster()
print("\n Raster properties exposures:", exp_lp.meta)
2023-01-26 11:57:18,777 - climada.util.coordinates - INFO - Raster from resolution 0.08333332999999854 to 0.08333332999999854.

 Raster properties exposures: {'width': 129, 'height': 41, 'crs': <Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- undefined
Datum: World Geodetic System 1984
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich
, 'transform': Affine(0.08333333000000209, 0.0, -84.91666666500001,
       0.0, -0.08333332999999854, 23.249999994999996)}
../_images/f8e2132624ed8a6b66a7391e432d77758caffac8b7af48d53ca4e53541c4e967.png

Define the hazard#

Let us define a tropical cyclone hazard using the TropCyclone and TCTracks modules.

from climada.hazard import TCTracks, TropCyclone, Centroids

# Load histrocial tropical cyclone tracks from ibtracs over the North Atlantic basin between 2010-2012
ibtracks_na = TCTracks.from_ibtracs_netcdf(
    provider="usa", basin="NA", year_range=(2010, 2012), correct_pres=True
)
print("num tracks hist:", ibtracks_na.size)

ibtracks_na.equal_timestep(
    0.5
)  # Interpolation to make the track smooth and to allow applying calc_perturbed_trajectories
# Add randomly generated tracks using the calc_perturbed_trajectories method (1 per historical track)
ibtracks_na.calc_perturbed_trajectories(nb_synth_tracks=1)
print("num tracks hist+syn:", ibtracks_na.size)
2025-09-25 13:46:15,137 - climada.hazard.tc_tracks - WARNING - `correct_pres` is deprecated. Use `estimate_missing` instead.
2025-09-25 13:46:16,551 - climada.hazard.tc_tracks - INFO - Progress: 10%
2025-09-25 13:46:16,581 - climada.hazard.tc_tracks - INFO - Progress: 20%
2025-09-25 13:46:16,608 - climada.hazard.tc_tracks - INFO - Progress: 30%
2025-09-25 13:46:16,636 - climada.hazard.tc_tracks - INFO - Progress: 40%
2025-09-25 13:46:16,664 - climada.hazard.tc_tracks - INFO - Progress: 50%
2025-09-25 13:46:16,692 - climada.hazard.tc_tracks - INFO - Progress: 60%
2025-09-25 13:46:16,720 - climada.hazard.tc_tracks - INFO - Progress: 70%
2025-09-25 13:46:16,748 - climada.hazard.tc_tracks - INFO - Progress: 80%
2025-09-25 13:46:16,779 - climada.hazard.tc_tracks - INFO - Progress: 90%
2025-09-25 13:46:16,807 - climada.hazard.tc_tracks - INFO - Progress: 100%
num tracks hist: 60
2025-09-25 13:46:16,819 - climada.hazard.tc_tracks - INFO - Interpolating 60 tracks to 0.5h time steps.
2025-09-25 13:46:17,452 - climada.hazard.tc_tracks_synth - INFO - Computing 60 synthetic tracks.
num tracks hist+syn: 120
# not needed for calculations
# visualize tracks
ax = ibtracks_na.plot()
ax.get_legend()._loc = 2
../_images/68b13ae1d216d60b8584b6cb6d7cb60ba5c8f7e43f4f117b48a35a9c32fb2c8f.png

From the tracks, we generate the hazards (the tracks are only the coordinates of the center of the cyclones, the full cyclones however affects a region around the tracks).

First thing we define the set of centroids which are geographical points where the hazard has a defined value. In our case, we want to define windspeeds from the tracks.

Remember: In the impact computations, for each exposure geographical point, one must assign a centroid from the hazard. By default, each exposure is assigned to the closest centroid from the hazard. But one can also define manually which centroid is assigned to which exposure point.

Examples:

  • Define the exposures from a given source (e.g., raster of asset values from LitPop). Define the hazard centroids from the exposures’ geolocations (e.g. compute Tropical Cyclone windspeed at each raster point and assign centroid to each raster point).

  • Define the exposures from a given source (e.g. houses position and value). Define the hazard from a given source (e.g. where lanslides occur). Use a metric to assign to each exposures point a hazard centroid (all houses in a radius of 5km around the lanslide are assigned to this centroid, if a house is within 5km of two landslides, choose the closest one).

  • Define a geographical raster. Define the exposures value on this raster. Define the hazard centroids on the geographical raster.

We shall pursue with the first case (Litpop + TropicalCyclone)

Hint: computing the wind speeds in many locations for many tc tracks is a computationally costly operation. Thus, we should define centroids only where we also have an exposure.

Hint: The operation of computing the windspeed in different location is in general computationally expensive. Hence, if you have a lot of tropical cyclone tracks, you should first make sure that all your tropical cyclones actually affect your exposure (remove those that don’t). Then, be careful when defining the centroids. For a large country like China, there is no need for centroids 500km inland (no tropical cyclones gets so far).

# Define the centroids from the exposures position
centrs = Centroids.from_exposures(exp_lp)
# Using the tracks, compute the windspeed at the location of the centroids
tc = TropCyclone.from_tracks(ibtracks_na, centroids=centrs)
tc.check()
2025-09-25 13:46:31,179 - climada.util.coordinates - INFO - Sampling from /Users/shuelsen/climada/data/GMT_intermediate_coast_distance_01d.tif
2025-09-25 13:46:31,209 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Mapping 120 tracks to 1388 coastal centroids.
2025-09-25 13:46:31,357 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 10%
2025-09-25 13:46:31,430 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 20%
2025-09-25 13:46:31,604 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 30%
2025-09-25 13:46:31,742 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 40%
2025-09-25 13:46:31,942 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 50%
2025-09-25 13:46:32,010 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 60%
2025-09-25 13:46:32,107 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 70%
2025-09-25 13:46:32,178 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 80%
2025-09-25 13:46:32,468 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 90%
2025-09-25 13:46:32,639 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 100%

Impact function#

For Tropical Cyclones, some calibrated default impact functions exist. Here we will use the one from Emanuel (2011).

from climada.entity import ImpactFuncSet, ImpfTropCyclone

# impact function TC
impf_tc = ImpfTropCyclone.from_emanuel_usa()

# add the impact function to an Impact function set
impf_set = ImpactFuncSet([impf_tc])
impf_set.check()

Recall that the exposures, hazards and impact functions must be matched in the impact calculations. Here it is simple, since there is a single impact function for all the hazards. We must simply make sure that the exposure is assigned this impact function through renaming the impf\_ column from the hazard type of the impact function in the impact function set and set the values of the column to the id of the impact function.

# Get the hazard type and hazard id
[haz_type] = impf_set.get_hazard_types()
[haz_id] = impf_set.get_ids()[haz_type]
print(f"hazard type: {haz_type}, hazard id: {haz_id}")
hazard type: TC, hazard id: 1
# Exposures: rename column and assign id
exp_lp.gdf.rename(columns={"impf_": "impf_" + haz_type}, inplace=True)
exp_lp.gdf["impf_" + haz_type] = haz_id
exp_lp.check()
exp_lp.gdf.head()
2025-09-25 13:47:11,759 - climada.entity.exposures.base - INFO - category_id not set.
2025-09-25 13:47:11,760 - climada.entity.exposures.base - INFO - cover not set.
2025-09-25 13:47:11,760 - climada.entity.exposures.base - INFO - deductible not set.
2025-09-25 13:47:11,760 - climada.entity.exposures.base - INFO - centr_ not set.
value region_id impf_TC geometry
0 1.077368e+05 192 1 POINT (-81.375 21.70833)
1 1.671874e+06 192 1 POINT (-81.54167 21.625)
2 3.421209e+06 192 1 POINT (-82.95833 21.875)
3 1.546590e+07 192 1 POINT (-82.875 21.875)
4 7.168308e+07 192 1 POINT (-82.79167 21.875)

Impact computation#

We are finally ready for the impact computation. This is the simplest step. Just give the exposure, impact function and hazard to the ImpactCalc.impact() method.

Note: we did not define an Entity in this impact calculations. Recall that Entity is a container class for Exposures, Impact Functions, Discount Rates and Measures. Since we had only one Exposure and one Impact Function, the container would not have added any value, but for more complex projects, the Entity class is very useful.

Assigning centroids manually#

It is best to create centroids from exposures directly as we have done above, to ensure Hazard and Exposure are matching well. However, sometimes you may have pre-defined Hazard and Exposure data. In those cases, it can make sense to manually match Centroids and Exposure.

The matching could then look like this:

exp_lp.assign_centroids(tc, distance="euclidean", threshold=0.1) # assign centroids manually

The threshold argument defines the maximum distance of the nearest neighbor in the units of the Exposure crs. Setting threshold to 0 disables nearest neighbor matching and enforces exact matching. By default twice the highest resolution of the hazard centroids is chosen.

When assigning Centroids manually, make sure to pass assign_centroids=False to the impact calculation, so that the assignment is not lost:

imp = ImpactCalc(exp_lp, impf_set, tc).impact(
    save_mat=False,
    assign_centroids=False, # false, since we assign centroids manually
)  

Assigning centroids automatically#

If we do not specifically assign centroids to the exposures. Hence, the default (i.e. assign_centroids=True) is used - each exposure is associated with the closest centroids. Since we defined the centroids from the exposures above, this is a one-to-one mapping.

# Compute impact
from climada.engine import ImpactCalc

imp = ImpactCalc(exp_lp, impf_set, tc).impact(
    save_mat=False
)  # Do not save the results geographically resolved (only aggregate values)
2025-09-25 13:47:28,593 - climada.entity.exposures.base - INFO - Matching 1388 exposures with 1388 centroids.
2025-09-25 13:47:28,596 - climada.engine.impact_calc - INFO - Calculating impact for 4164 assets (>0) and 120 events.
exp_lp.gdf
value region_id impf_TC geometry centr_TC
0 1.077368e+05 192 1 POINT (-81.375 21.70833) 0
1 1.671874e+06 192 1 POINT (-81.54167 21.625) 1
2 3.421209e+06 192 1 POINT (-82.95833 21.875) 2
3 1.546590e+07 192 1 POINT (-82.875 21.875) 3
4 7.168308e+07 192 1 POINT (-82.79167 21.875) 4
... ... ... ... ... ...
1383 1.496798e+06 192 1 POINT (-78.625 22.54167) 1383
1384 5.387837e+07 192 1 POINT (-78.375 22.54167) 1384
1385 4.077095e+06 192 1 POINT (-78.45833 22.45833) 1385
1386 2.249377e+07 192 1 POINT (-78.375 22.45833) 1386
1387 6.191984e+06 192 1 POINT (-78.29167 22.45833) 1387

1388 rows × 5 columns

For example we can now obtain the aggregated average annual impact or plot the average annual impact in each exposure location.

print(f"Aggregated average annual impact: {round(imp.aai_agg,0)} $")
Aggregated average annual impact: 257456287.0 $
imp.plot_hexbin_eai_exposure(buffer=1);
../_images/d923230b2a6f53dc6178bc9ab0274b11efc1adecc5328b1b0518139d0aa6b4e9.png
# Compute exceedance frequency curve
freq_curve = imp.calc_freq_curve()
freq_curve.plot();
../_images/1aae80662f39924c84f1a0d5512c445a720f4eb47333c87796e8e7d60edbad7d.png

Impact concatenation#

There can be cases in which an impact function for a given hazard type is not constant throughout the year. This is for example the case in the context of agriculture. For example, if a crop is already harvested the impact of a certain weather event can be much lower or even zero. For such situations of two or more different impact functions for the same hazard and exposure type, it can be useful to split the events into subsets and compute impacts separately. In order to then analyze the total impact, the different impact subsets can be concatenated using the Impact.concat method. This is done here for the hypothetical example using LitPop as exposure and TCs as hazard. For illustration purposes, we misuse the LitPop exposure in this case as exposure of a certain crop. We assume a constant harvest day (17 October) after which the impact function is reduced by a factor of 10.

First, we prepare the hazard subsets.

from datetime import datetime, date
import pandas as pd

# set a harvest date
harvest_DOY = 290  # 17 October

# loop over all events an check if they happened before or after harvest
event_ids_post_harvest = []
event_ids_pre_harvest = []
for event_id in tc.event_id:
    event_date = tc.date[np.where(tc.event_id == event_id)[0][0]]
    day_of_year = (
        event_date - date(datetime.fromordinal(event_date).year, 1, 1).toordinal() + 1
    )

    if day_of_year > harvest_DOY:
        event_ids_post_harvest.append(event_id)
    else:
        event_ids_pre_harvest.append(event_id)

tc_post_harvest = tc.select(event_id=event_ids_post_harvest)
tc_pre_harvest = tc.select(event_id=event_ids_pre_harvest)
# print('pre-harvest:', tc_pre_harvest.event_name)
# print('post-harvest:', tc_post_harvest.event_name)

Now we get two different impact functions, one valid for the exposed crop before harvest and one after harvest. Then, we compute the impacts for both phases separately.

from climada.engine import Impact

# impact function TC
impf_tc = ImpfTropCyclone.from_emanuel_usa()
# impact function TC after harvest is by factor 0.5 smaller
impf_tc_posth = ImpfTropCyclone.from_emanuel_usa()
impf_tc_posth.mdd = impf_tc.mdd * 0.1
# add the impact function to an Impact function set
impf_set = ImpactFuncSet([impf_tc])
impf_set_posth = ImpactFuncSet([impf_tc_posth])
impf_set.check()
impf_set_posth.check()

# plot
impf_set.plot()
impf_set_posth.plot()

# Compute impacts
imp_preh = ImpactCalc(exp_lp, impf_set, tc_pre_harvest).impact(save_mat=True)
imp_posth = ImpactCalc(exp_lp, impf_set_posth, tc_post_harvest).impact(save_mat=True)
2025-09-25 13:48:30,543 - climada.entity.exposures.base - INFO - Exposures matching centroids already found for TC
2025-09-25 13:48:30,544 - climada.entity.exposures.base - INFO - Existing centroids will be overwritten for TC
2025-09-25 13:48:30,544 - climada.entity.exposures.base - INFO - Matching 1388 exposures with 1388 centroids.
2025-09-25 13:48:30,549 - climada.engine.impact_calc - INFO - Calculating impact for 4164 assets (>0) and 106 events.
2025-09-25 13:48:30,551 - climada.entity.exposures.base - INFO - Exposures matching centroids already found for TC
2025-09-25 13:48:30,551 - climada.entity.exposures.base - INFO - Existing centroids will be overwritten for TC
2025-09-25 13:48:30,552 - climada.entity.exposures.base - INFO - Matching 1388 exposures with 1388 centroids.
2025-09-25 13:48:30,553 - climada.engine.impact_calc - INFO - Calculating impact for 4164 assets (>0) and 14 events.
../_images/c31b3ab8d478b0561f3bfd2683e46905e8819e6daa5648f16ec9c7210804427d.png ../_images/d7c5bbc2ba0983d9d32841b2b53c8172b9dc4d8b9c515c5bd639828cb934b563.png

Now, we can concatenate the impacts again and plot the results

# Concatenate impacts again
imp_tot = Impact.concat([imp_preh, imp_posth])

# plot result
import matplotlib.pyplot as plt

ax = imp_preh.plot_hexbin_eai_exposure(gridsize=100, adapt_fontsize=False)
ax.set_title("Expected annual impact: Pre-Harvest")
ax = imp_posth.plot_hexbin_eai_exposure(gridsize=100, adapt_fontsize=False)
ax.set_title("Expected annual impact: Post-Harvest")
ax = imp_tot.plot_hexbin_eai_exposure(gridsize=100, adapt_fontsize=False)
ax.set_title("Expected annual impact: Total")
2025-09-25 13:48:34,805 - climada.engine.impact - WARNING - The Impact.tot_value attribute is deprecated.Use Exposures.affected_total_value to calculate the affected total exposure value based on a specific hazard intensity threshold
2025-09-25 13:48:34,806 - climada.engine.impact - WARNING - The Impact.tot_value attribute is deprecated.Use Exposures.affected_total_value to calculate the affected total exposure value based on a specific hazard intensity threshold
2025-09-25 13:48:34,807 - climada.engine.impact - WARNING - The Impact.tot_value attribute is deprecated.Use Exposures.affected_total_value to calculate the affected total exposure value based on a specific hazard intensity threshold
Text(0.5, 1.0, 'Expected annual impact: Total')
../_images/d7c5d6b09419304649ccd99682880f2682d09b0bfa46f97eb0001f78d797e3b0.png ../_images/4fee0071d45bdf9dfcfc29ec58801b71675bc0f234629c31631112f261697ec5.png ../_images/aa72f0070c72731bbff905e4f6ab5fc86d41697f0ea6b502ea9e604654456c3c.png

Quick examples - points, raster, custom#

User defined point exposure and Tropical Cyclone hazard#

%matplotlib inline
# EXAMPLE: POINT EXPOSURES WITH POINT HAZARD
import numpy as np
from climada.entity import Exposures, ImpactFuncSet, IFTropCyclone
from climada.hazard import Centroids, TCTracks, TropCyclone
from climada.engine import ImpactCalc

# Set Exposures in points
latitude = np.array([21.899326, 21.960728, 22.220574, 22.298390, 21.787977, 21.981732])
longitude = np.array([88.307422, 88.565362, 88.378337, 87.806356, 88.348835, 89.246521])

values = np.array([1.0e5, 1.2e5, 1.1e5, 2.0e5, 2.5e5, 0.5e5])

exp_pnt = Exposures(
    lat=latitude, lon=longitude, value=values, value_unit="USD", crs="epsg:4326"
)

# plot exposures
exp_pnt.plot_scatter(buffer=0.05)

# Set Hazard in Exposures points
# set centroids from exposures coordinates
centr_pnt = Centroids.from_exposures(exp_pnt)
# compute Hazard in that centroids
tr_pnt = TCTracks.from_ibtracs_netcdf(storm_id="2007314N10093")
tc_pnt = TropCyclone.from_tracks(tr_pnt, centroids=centr_pnt)
tc_pnt.check()
ax_pnt = tc_pnt.centroids.plot(
    c=np.array(tc_pnt.intensity[0, :].todense()).squeeze()
)  # plot intensity per point
ax_pnt.get_figure().colorbar(
    ax_pnt.collections[2], fraction=0.0175, pad=0.08
).set_label(
    "Intensity (m/s)"
)  # add colorbar

# Set impact function
impf_tc = ImpfTropCyclone.from_emanuel_usa()
impf_pnt = ImpactFuncSet([impf_tc])
impf_pnt.check()

# Get the hazard type and hazard id
[haz_type] = impf_set.get_hazard_types()
[haz_id] = impf_set.get_ids()[haz_type]
# Exposures: rename column and assign id
exp_pnt.gdf.rename(columns={"impf_": "impf_" + haz_type}, inplace=True)
exp_pnt.gdf["impf_" + haz_type] = haz_id
exp_pnt.gdf.head()

# Compute Impact
imp_pnt = ImpactCalc(exp_pnt, impf_pnt, tc_pnt).impact()
# nearest neighbor of exposures to centroids gives identity
print(
    "Nearest neighbor hazard.centroids indexes for each exposure:",
    exp_pnt.gdf["centr_TC"].values,
)
imp_pnt.plot_scatter_eai_exposure(ignore_zero=False, buffer=0.05);
2025-11-05 18:03:53,989 - climada.hazard.tc_tracks - WARNING - The cached IBTrACS data set dates from 2024-12-09 21:15:55 (older than 180 days). Very likely, a more recent version is available. Consider manually removing the file /Users/lseverino/climada/data/IBTrACS.ALL.v04r01.nc and re-running this function, which will download the most recent version of the IBTrACS data set from the official URL.
2025-11-05 18:03:55,286 - climada.hazard.tc_tracks - INFO - Progress: 100%
2025-11-05 18:03:55,312 - climada.util.coordinates - INFO - Sampling from /Users/lseverino/climada/data/GMT_intermediate_coast_distance_01d.tif
2025-11-05 18:03:55,318 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Mapping 1 tracks to 6 coastal centroids.
2025-11-05 18:03:55,328 - climada.hazard.trop_cyclone.trop_cyclone - INFO - Progress: 100%
2025-11-05 18:03:55,400 - climada.entity.exposures.base - INFO - Matching 6 exposures with 6 centroids.
2025-11-05 18:03:55,401 - climada.engine.impact_calc - INFO - Calculating impact for 18 assets (>0) and 1 events.
Nearest neighbor hazard.centroids indexes for each exposure: [0 1 2 3 4 5]
../_images/9a183c418862fdab5c8249aabe51538a8ea0ed35842d441f9765f05551c7085a.png ../_images/5c77ca467937c98fa80dd39ad52642d03bc257542a7d69d36f5e4d4eb436fce5.png ../_images/c4ab741a0cbfa05ca068182e3da2453a53f96a15e776b572df091365bada91f8.png

Raster from file#

# EXAMPLE: RASTER EXPOSURES WITH RASTER HAZARD
from rasterio.warp import Resampling
from climada.entity import LitPop, ImpactFuncSet, ImpactFunc
from climada.hazard import Hazard
from climada.engine import Impact
from climada.util.constants import HAZ_DEMO_FL

# Exposures belonging to a raster (the raser information is contained in the meta attribute)
exp_ras = LitPop.from_countries(
    countries=["VEN"], res_arcsec=300, fin_mode="income_group"
)
exp_ras.gdf.reset_index()
exp_ras.check()
exp_ras.plot_raster()

# Initialize hazard object with haz_type = 'FL' (for Flood)
hazard_type = "FL"
# Load a previously generated (either with CLIMADA or other means) hazard
# from file (HAZ_DEMO_FL) and resample the hazard raster to the exposures' ones
# Hint: check how other resampling methods affect to final impact
haz_ras = Hazard.from_raster(
    [HAZ_DEMO_FL],
    haz_type=hazard_type,
    dst_crs=exp_ras.meta["crs"],
    transform=exp_ras.meta["transform"],
    width=exp_ras.meta["width"],
    height=exp_ras.meta["height"],
    resampling=Resampling.nearest,
)
haz_ras.intensity[haz_ras.intensity == -9999] = 0  # correct no data values
haz_ras.check()
haz_ras.plot_intensity(1)

# Set dummy impact function
intensity = np.linspace(0, 10, 100)
mdd = np.linspace(0, 10, 100)
paa = np.ones(intensity.size)
impf_dum = ImpactFunc(hazard_type, haz_id, intensity, mdd, paa, "m", "dummy")
# Add the impact function to the impact function set
impf_ras = ImpactFuncSet([impf_dum])
impf_ras.check()

# Exposures: rename column and assign id
exp_lp.gdf.rename(columns={"impf_": "impf_" + hazard_type}, inplace=True)
exp_lp.gdf["impf_" + haz_type] = haz_id
exp_lp.gdf.head()

# Compute impact
imp_ras = ImpactCalc(exp_ras, impf_ras, haz_ras).impact(save_mat=False)
# nearest neighbor of exposures to centroids is not identity because litpop does not contain data outside the country polygon
print(
    "\n Nearest neighbor hazard.centroids indexes for each exposure:",
    exp_ras.gdf["centr_FL"].values,
)
imp_ras.plot_raster_eai_exposure();
2025-09-25 13:50:45,839 - climada.entity.exposures.litpop.litpop - INFO - 
 LitPop: Init Exposure for country: VEN (862)...

2025-09-25 13:50:46,558 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,560 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,565 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,565 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,566 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,576 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,576 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,595 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,596 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,604 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,604 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,613 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,613 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,621 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,622 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,631 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,631 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,642 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,643 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,646 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,647 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,647 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,650 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,650 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,651 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,653 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,653 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,654 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,657 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,657 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,657 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,660 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,660 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,660 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,663 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,663 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,664 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,684 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,685 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,695 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,695 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,713 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,713 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,735 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,735 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,749 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,750 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,768 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,770 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,786 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,787 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,798 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,799 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,806 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,806 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,806 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,812 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:46,813 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,813 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,823 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,823 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,839 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,839 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,848 - climada.entity.exposures.litpop.gpw_population - WARNING - Reference year: 2018. Using nearest available year for GPW data: 2020
2025-09-25 13:50:46,849 - climada.entity.exposures.litpop.gpw_population - INFO - GPW Version v4.11
2025-09-25 13:50:46,853 - climada.entity.exposures.litpop.litpop - INFO - No data point on destination grid within polygon.
2025-09-25 13:50:47,320 - climada.util.finance - INFO - GDP VEN 2014: 4.824e+11.
2025-09-25 13:50:47,343 - climada.util.finance - INFO - Income group VEN 2018: 3.
2025-09-25 13:50:47,355 - climada.entity.exposures.base - INFO - Hazard type not set in impf_
2025-09-25 13:50:47,356 - climada.entity.exposures.base - INFO - category_id not set.
2025-09-25 13:50:47,356 - climada.entity.exposures.base - INFO - cover not set.
2025-09-25 13:50:47,356 - climada.entity.exposures.base - INFO - deductible not set.
2025-09-25 13:50:47,357 - climada.entity.exposures.base - INFO - centr_ not set.
2025-09-25 13:50:47,357 - climada.entity.exposures.base - INFO - Hazard type not set in impf_
2025-09-25 13:50:47,358 - climada.entity.exposures.base - INFO - category_id not set.
2025-09-25 13:50:47,358 - climada.entity.exposures.base - INFO - cover not set.
2025-09-25 13:50:47,358 - climada.entity.exposures.base - INFO - deductible not set.
2025-09-25 13:50:47,359 - climada.entity.exposures.base - INFO - centr_ not set.
2025-09-25 13:50:47,362 - climada.util.coordinates - INFO - Raster from resolution 0.08333332999999987 to 0.08333332999999987.
2025-09-25 13:50:48,604 - climada.util.coordinates - INFO - Reading /Users/shuelsen/climada/demo/data/SC22000_VE__M1.grd.gz
2025-09-25 13:50:50,098 - climada.util.coordinates - INFO - Reading /Users/shuelsen/climada/demo/data/SC22000_VE__M1.grd.gz
2025-09-25 13:50:52,861 - climada.entity.exposures.base - INFO - No specific impact function column found for hazard FL. Using the anonymous 'impf_' column.
2025-09-25 13:50:52,862 - climada.entity.exposures.base - INFO - Matching 10772 exposures with 22494 centroids.
2025-09-25 13:50:52,867 - climada.util.coordinates - INFO - No exact centroid match found. Reprojecting coordinates to nearest neighbor closer than the threshold = 100
2025-09-25 13:50:52,892 - climada.engine.impact_calc - INFO - Calculating impact for 32310 assets (>0) and 1 events.

 Nearest neighbor hazard.centroids indexes for each exposure: [  39   40   41 ... 3387 3551 2721]
2025-09-25 13:50:52,902 - climada.util.coordinates - INFO - Raster from resolution 0.08333332999999987 to 0.08333332999999987.
../_images/913b43b111af68aaf6faf79e4f03bf804976de5aeb1ea18582b8e0681b0100b5.png ../_images/a4e45a110b82ca2176900c31fa2d701ce03e15ec401ee6c131b6bcada879807b.png ../_images/798791494aa9c2cc26458ceba1926c73970f40d534a4243c6bac8982271797aa.png