有没有办法修复python 3中的最大递归级别?

时间:2019-07-15 18:41:07

标签: python json recursion bokeh

我正在尝试为十年间的数据构建状态图,并使用滑块选择显示在地图上的年份。用户可以选择的一种显示方式,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

3 个答案:

答案 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个小时,希望对您有所帮助。