我正在尝试构建十年数据的州地图,并使用滑块选择地图上显示的年份。用户可以选择 2014 年的显示方式,地图将显示 2014 年的数据。
我将要显示的数据与适当的形状文件合并。我最终得到 733 行和 5 列 - 每个县多达 9 行具有相同的县名称和坐标。
一切似乎都很好,直到我尝试构建地图。返回此错误信息:
溢出错误:达到最大递归级别
我尝试使用
sys.setrecursionlimit
重置递归限制,但无法克服该错误。
我一直无法找到我理解的答案,所以我希望有人能指出我正确的方向。
我使用 bokeh 和 json 来构建地图。我尝试过使用
sys.setrecursionlimit
但无论我走多高,我都会收到相同的错误消息。
我上周使用了相同的代码,但无法获取不同年份的数据进行显示,因为我使用的是数据的子集。现在我已经解决了这个问题,但我仍然停留在这个错误消息上。
def json_data(selectedYear):
yr = selectedYear
murders = murder[murder['Year'] == yr]
merged = mergedfinal
merged.fillna('0', inplace = True)
merged_json = json.loads(merged.to_json())
json_data = json.dumps(merged_json)
return json_data
geosource = GeoJSONDataSource(geojson = json_data(2018))
palette=brewer['YlOrRd'][9]
palette = palette[::-1]
color_mapper = LinearColorMapper(palette = palette, low = 0, high = 60, nan_color = '#d9d9d9')
hover = HoverTool(tooltips = [ ('County/City','@NAME'),('Victims', '@Victims')])
color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 30,
border_line_color=None,location = (0,0),
orientation = 'horizontal')
p = figure(title = 'Firearm Murders in Virginia', plot_height = 600 , plot_width = 950, toolbar_location = None, tools = [hover])
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
p.xaxis.visible=False
p.yaxis.visible=False
p.patches('xs','ys', source = geosource,fill_color = {'field' :'Victims', 'transform' : color_mapper},
line_color = 'black', line_width = 0.25, fill_alpha = 1)
p.add_layout(color_bar, 'below')
def update_plot(attr, old, new):
year = Slider.value
new_data = json_data(year)
geosource.geojson = new_data
p.title.text = 'Firearm Murders in VA'
slider = Slider(title = 'Year', start = 2009, end = 2018, step = 1, value = 2018)
slider.on_change('value', update_plot)
layout = column(p,widgetbox(slider))
curdoc().add_root(layout)
output_notebook()
show(layout)
当我使用更有限的数据集时,相同的代码运行得足够好。以下是错误消息的完整上下文:
OverflowError Traceback (most recent call last)
<ipython-input-50-efd821491ac3> in <module>()
8 return json_data
9
---> 10 geosource = GeoJSONDataSource(geojson = json_data(2018))
11
12 palette=brewer['YlOrRd'][9]
<ipython-input-50-efd821491ac3> in json_data(selectedYear)
4 merged = mergedfinal
5 merged.fillna('0', inplace = True)
----> 6 merged_json = json.loads(merged.to_json())
7 json_data = json.dumps(merged_json)
8 return json_data
/Users/mcuddy/anaconda/lib/python3.6/site-packages/pandas/core/generic.py in to_json(self, path_or_buf, orient, date_format, double_precision, force_ascii, date_unit, default_handler, lines)
1087 force_ascii=force_ascii, date_unit=date_unit,
1088 default_handler=default_handler,
-> 1089 lines=lines)
1090
1091 def to_hdf(self, path_or_buf, key, **kwargs):
/Users/mcuddy/anaconda/lib/python3.6/site-packages/pandas/io/json.py in to_json(path_or_buf, obj, orient, date_format, double_precision, force_ascii, date_unit, default_handler, lines)
37 obj, orient=orient, date_format=date_format,
38 double_precision=double_precision, ensure_ascii=force_ascii,
---> 39 date_unit=date_unit, default_handler=default_handler).write()
40 else:
41 raise NotImplementedError("'obj' should be a Series or a DataFrame")
/Users/mcuddy/anaconda/lib/python3.6/site-packages/pandas/io/json.py in write(self)
83 date_unit=self.date_unit,
84 iso_dates=self.date_format == 'iso',
---> 85 default_handler=self.default_handler)
86
87
OverflowError: Maximum recursion level reached
我也有类似的问题!
我将问题范围缩小到
.to_json
步骤。由于某种原因,当我在右侧合并我的 geopandas 文件时:
Neighbourhoods_merged = df_2016.merge(gdf_neighbourhoods, how = "left", on = "Neighbourhood#")
我遇到了递归错误。我通过切换两者找到了成功:
Neighbourhoods_merged = gdf_neighbourhoods.merge(df_2016, how = "left", on = "Neighbourhood#")
这对我有用。令人愤怒的是,我不知道为什么会这样,但我希望这可以帮助其他有同样错误的人!
我通过改变合并方向解决了这个问题。
所以,如果你想合并两个数据帧A和B,并且A的类型为“geopandas.geodataframe.GeoDataFrame”,B的类型为“pandas.core.frame.DataFrame” ',你应该用 pd.merge(A,B,on="some column') 合并它们,而不是相反的方向。
我认为当您对其中包含 POLYGON 类型的 pandas 数据帧类型执行 .to_json() 方法时,会出现最大递归错误。
当您更改合并方向并将类型更改为 GeoDataFrame 时,即使其中有 POLYGON 类型列,.to_json() 也会毫无问题地执行。
我花了2个小时完成这个,希望对你有帮助。
如果需要更高的递归深度,可以使用sys设置:
import sys
sys.setrecursionlimit(1500)
话虽如此,您的错误很可能是无限递归的结果,如果增加深度不能解决问题,则可能是这种情况。
在尝试显示闪亮的 pandas 数据透视表时,我遇到了类似的问题。我认为问题在于列数据类型不是字符串。通过将列名转换为字符串解决了我的问题:
df.columns = df.columns.astype(str)