使用 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 中的作用。
我正在使用 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 中的作用。