我正在尝试为十年间的数据构建状态图,并使用滑块选择显示在地图上的年份。用户可以选择的一种显示方式,2014年,地图将显示2014年的数据。
我将要显示的数据与适当的shapefile合并。我最终得到733行和5列-每个县多达9行,并且具有相同的县名和坐标。
在我尝试构建地图之前,一切似乎都还不错。返回此错误消息:
OverflowError:已达到最大递归级别
我尝试使用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
答案 0 :(得分:0)
如果需要更高的递归深度,则可以使用sys进行设置:
import sys
sys.setrecursionlimit(1500)
话虽如此,您的错误很可能是无限递归的结果,如果增加深度不能解决问题,可能就是这种情况。
答案 1 :(得分:0)
我有类似的问题!
我将问题缩小到.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#")
这对我有用。我真不知道为什么这行得通,但我希望这可以帮助其他人犯同样的错误!
答案 2 :(得分:0)
我通过更改合并方向解决了这个问题。
因此,如果要合并两个数据框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个小时,希望对您有所帮助。