使用admin1时,CLIMADA中的“GeoDataFrame”对象没有属性“assign_centroids”

2024-04-29 02:10:45 发布

您现在位置: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\u 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'
```

Tags: andnamefromimportselfifastc
1条回答
网友
1楼 · 发布于 2024-04-29 02:10:45

调用行exp = exp[exp['admin1'] == 'Florida']时发生错误。这会将曝光对象转换为GeoPandas对象。如果在这一行之后运行exp.check(),它将失败

解决方法是将其重新转换为曝光。由于exp中仍然包含所有信息,因此这很容易

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

我认为这是继承类在Python中工作方式的一个影响

相关问题 更多 >