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

问题描述 投票:0回答:4

我正在尝试构建十年数据的州地图,并使用滑块选择地图上显示的年份。用户可以选择 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
python json recursion bokeh
4个回答
3
投票

我也有类似的问题!

我将问题范围缩小到

.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
投票

我通过改变合并方向解决了这个问题。

所以,如果你想合并两个数据帧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个小时完成这个,希望对你有帮助。


0
投票

如果需要更高的递归深度,可以使用sys设置:

import sys
sys.setrecursionlimit(1500)

话虽如此,您的错误很可能是无限递归的结果,如果增加深度不能解决问题,则可能是这种情况。


0
投票

在尝试显示闪亮的 pandas 数据透视表时,我遇到了类似的问题。我认为问题在于列数据类型不是字符串。通过将列名转换为字符串解决了我的问题:

df.columns = df.columns.astype(str)
© www.soinside.com 2019 - 2024. All rights reserved.