使用 admin1 时,'GeoDataFrame' 对象在 CLIMADA 中没有属性 'assign_centroids'

'GeoDataFrame' object has no attribute 'assign_centroids' in CLIMADA when using admin1

我正在使用 CLIMADA,它是佛罗里达州热带气旋影响项目的概率自然灾害影响模型。下面的一段代码引发了一个 AttributeError。

import os
import numpy as np
import pandas as pd
import xarray as xr
import netCDF4 as nc
import datetime as dt

# import CLIMADA modules:
from climada.util.constants import SYSTEM_DIR, DATA_DIR # loads default directory paths for data
from climada.engine import Impact
from climada.hazard import TCTracks, Centroids, TropCyclone
from climada.entity import IFTropCyclone, ImpactFuncSet
from climada.entity.exposures.litpop import LitPop
from climada.entity.exposures.litpop import exposure_set_admin1
import climada.util.plot as u_plot
from climada.util.scalebar_plot import scale_bar

# Initiate EXPOSURE:
exp = LitPop()
countries_list = ['USA']
state_list = ['Florida']
exp.set_country(countries_list, admin1_calc = True, res_arcsec=300, reference_year=2014)
exp.set_geometry_points()
exp.set_lat_lon()
exp.check()
exp['if_TC'] = 1
exposure_set_admin1(exp,res_arcsec=300)
exp = exp[exp['admin1'] == 'Florida']

# Initiate TC hazard from tracks and exposure
tc_hazard = TropCyclone()
tc_hazard.set_from_tracks(tracks, centroids=cent)
tc_hazard.check()

# Calculate TC impact from exposure and hazard and creat impact and impact function set (IFS)
# define impact function:
if_tc = IFTropCyclone()
if_tc.haz_type = 'TC'
if_tc.id = 1
if_tc.set_emanuel_usa(v_thresh=25.7, v_half=84.7, scale=1)
IFS = ImpactFuncSet()
IFS.append(if_tc)

# compute impact:
impact = Impact()
impact.calc(exp, IFS, tc_hazard, save_mat=True)

调用代码的最后一行产生: AttributeError: 'GeoDataFrame' 对象没有属性 'assign_centroids'

谁能解决这个错误?

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-e5655feac3c6> in <module>
      1 # compute impact:
      2 impact = Impact()
----> 3 impact.calc(exp, IFS, tc_hazard, save_mat=True)

~/Documents/WCR/CLIMADA_develop/climada_python/climada/engine/impact.py in calc(self, exposures, impact_funcs, hazard, save_mat)
    153         assign_haz = INDICATOR_CENTR + hazard.tag.haz_type
    154         if assign_haz not in exposures:
--> 155             exposures.assign_centroids(hazard)
    156         else:
    157             LOGGER.info('Exposures matching centroids found in %s', assign_haz)

~/opt/anaconda3/envs/climada_env/lib/python3.7/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5065             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5066                 return self[name]
-> 5067             return object.__getattribute__(self, name)
   5068 
   5069     def __setattr__(self, name, value):

AttributeError: 'GeoDataFrame' object has no attribute 'assign_centroids'
```

调用行exp = exp[exp['admin1'] == 'Florida']时出现错误。这会将您的 Exposures 对象转换为 GeoPandas 对象。如果您在此行之后 运行 exp.check() ,它将失败。

解决方案是将其重新转换回曝光。由于所有信息仍包含在 exp 中,这很容易

from climada.entity import Exposures
...
exp = exp[exp['admin1'] == 'Florida']
exp = Exposures(exp)

我认为这是继承 类 在 Python 中的作用。