Folium TypeError: ufunc 'isnan' not supported for the input types
Folium TypeError: ufunc 'isnan' not supported for the input types
我正在尝试用 folium 创建我的第一张等值线图。
我有一个 pandas 数据框,我已经成功地使用它来提供 folium 圆形地图,所以我非常有信心我对数据内容没有问题。下面的函数很好地生成了我的地图。
def plot_cases(cases_date):
folium_map = folium.Map(location=[40.738, -73.98],
zoom_start=1,
tiles="CartoDB dark_matter",
width='100%')
#add a circle marker for each row in data
for index, row in cases_date.iterrows():
# generate the popup message that is shown on click.
popup_text = "Cases: {}<br> Country: {}<br> Province/State: {}"
popup_text = popup_text.format(row["Cases"], row["Country/Region"], row["Province/State"])
#radius of circle
radius = row["Cases"]/1000
# choose the color of the marker
if row["Cases"] > 0:
color="#E37222" # tangerine
else:
color="#0A8A9F" # teal
# add circle on map
folium.CircleMarker(location=(row["Lat"],
row["Long"]),
radius=radius,
color=color,
popup=popup_text,
fill=True).add_to(folium_map)
return folium_map
现在,当我尝试使用相同的 pandas df 生成等值线时,我介绍的唯一新概念是从 git 存储库中获取世界地图 geoJSON 文件:
#get geoJSON
req = requests.get('https://raw.githubusercontent.com/python-visualization/folium/master/examples/data/world-countries.json')
geofile = req.json()
#instantiate map and enter choropleth params
m = folium.Map(location=[40.738, -73.98],zoom_start=1,tiles="CartoDB dark_matter",width='100%')
choropleth = folium.Choropleth(
geo_data = geofile,
name='choropleth',
data=choro_data,
columns=['Country/Region', 'Cases'],
key_on='feature.properties.name',
fill_color='YlGn',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Cases',
highlight=True,
line_color='black'
).add_to(m)
folium.LayerControl(collapsed=True).add_to(m)
m
上面的等值线代码生成以下追溯:
TypeError Traceback (most recent call last)
<ipython-input-15-27efeb8f5173> in <module>
12 legend_name='Cases',
13 highlight=True,
---> 14 line_color='black'
15 ).add_to(m)
16
~/cases/map/lib/python3.6/site-packages/folium/features.py in __init__(self, geo_data, data, columns, key_on, bins, fill_color, nan_fill_color, fill_opacity, nan_fill_opacity, line_color, line_weight, line_opacity, name, legend_name, overlay, control, show, topojson, smooth_factor, highlight, **kwargs)
1076 if color_data is not None and key_on is not None:
1077 real_values = np.array(list(color_data.values()))
-> 1078 real_values = real_values[~np.isnan(real_values)]
1079 _, bin_edges = np.histogram(real_values, bins=bins)
1080
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
hpaulj 建议 json 有问题。您可以在源代码处查看 json,但我也从 print(geofile)
:
中提取了一个示例
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "Afghanistan"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
61.210817,
35.650072
],
[
62.230651,
35.270664
],
[
62.984662,
35.404041
],
[
63.193538,
35.857166
],
[
63.982896,
36.007957
],
[
64.546479,
36.312073
],
[
64.746105,
37.111818
],
[
65.588948,
37.305217
],
[
65.745631,
37.661164
],
[
66.217385,
37.39379
],
[
66.518607,
37.362784
],
[
67.075782,
37.356144
],
[
67.83,
37.144994
],
[
68.135562,
37.023115
],
[
68.859446,
37.344336
],
[
69.196273,
37.151144
],
[
69.518785,
37.608997
],
[
70.116578,
37.588223
],
[
70.270574,
37.735165
],
[
70.376304,
38.138396
],
[
70.806821,
38.486282
],
[
71.348131,
38.258905
],
[
71.239404,
37.953265
],
[
71.541918,
37.905774
],
[
71.448693,
37.065645
],
[
71.844638,
36.738171
],
[
72.193041,
36.948288
],
[
72.63689,
37.047558
],
[
73.260056,
37.495257
],
[
73.948696,
37.421566
],
[
74.980002,
37.41999
],
[
75.158028,
37.133031
],
[
74.575893,
37.020841
],
[
74.067552,
36.836176
],
[
72.920025,
36.720007
],
[
71.846292,
36.509942
],
[
71.262348,
36.074388
],
[
71.498768,
35.650563
],
[
71.613076,
35.153203
],
[
71.115019,
34.733126
],
[
71.156773,
34.348911
],
[
70.881803,
33.988856
],
[
69.930543,
34.02012
],
[
70.323594,
33.358533
],
[
69.687147,
33.105499
],
[
69.262522,
32.501944
],
[
69.317764,
31.901412
],
[
68.926677,
31.620189
],
[
68.556932,
31.71331
],
[
67.792689,
31.58293
],
[
67.683394,
31.303154
],
[
66.938891,
31.304911
],
[
66.381458,
30.738899
],
[
66.346473,
29.887943
],
[
65.046862,
29.472181
],
[
64.350419,
29.560031
],
[
64.148002,
29.340819
],
[
63.550261,
29.468331
],
[
62.549857,
29.318572
],
[
60.874248,
29.829239
],
[
61.781222,
30.73585
],
[
61.699314,
31.379506
],
[
60.941945,
31.548075
],
[
60.863655,
32.18292
],
[
60.536078,
32.981269
],
[
60.9637,
33.528832
],
[
60.52843,
33.676446
],
[
60.803193,
34.404102
],
[
61.210817,
35.650072
]
]
]
},
"id": "AFG"
}
]
}
好的 - 看起来好像 json 是一个转移注意力的问题。我的脚本中的代码实际上是将错误的数据帧提供给 data=choro_data
,因此有效地 folium 正在接收格式错误的数据集信息并抛出错误。
我正在尝试用 folium 创建我的第一张等值线图。
我有一个 pandas 数据框,我已经成功地使用它来提供 folium 圆形地图,所以我非常有信心我对数据内容没有问题。下面的函数很好地生成了我的地图。
def plot_cases(cases_date):
folium_map = folium.Map(location=[40.738, -73.98],
zoom_start=1,
tiles="CartoDB dark_matter",
width='100%')
#add a circle marker for each row in data
for index, row in cases_date.iterrows():
# generate the popup message that is shown on click.
popup_text = "Cases: {}<br> Country: {}<br> Province/State: {}"
popup_text = popup_text.format(row["Cases"], row["Country/Region"], row["Province/State"])
#radius of circle
radius = row["Cases"]/1000
# choose the color of the marker
if row["Cases"] > 0:
color="#E37222" # tangerine
else:
color="#0A8A9F" # teal
# add circle on map
folium.CircleMarker(location=(row["Lat"],
row["Long"]),
radius=radius,
color=color,
popup=popup_text,
fill=True).add_to(folium_map)
return folium_map
现在,当我尝试使用相同的 pandas df 生成等值线时,我介绍的唯一新概念是从 git 存储库中获取世界地图 geoJSON 文件:
#get geoJSON
req = requests.get('https://raw.githubusercontent.com/python-visualization/folium/master/examples/data/world-countries.json')
geofile = req.json()
#instantiate map and enter choropleth params
m = folium.Map(location=[40.738, -73.98],zoom_start=1,tiles="CartoDB dark_matter",width='100%')
choropleth = folium.Choropleth(
geo_data = geofile,
name='choropleth',
data=choro_data,
columns=['Country/Region', 'Cases'],
key_on='feature.properties.name',
fill_color='YlGn',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Cases',
highlight=True,
line_color='black'
).add_to(m)
folium.LayerControl(collapsed=True).add_to(m)
m
上面的等值线代码生成以下追溯:
TypeError Traceback (most recent call last)
<ipython-input-15-27efeb8f5173> in <module>
12 legend_name='Cases',
13 highlight=True,
---> 14 line_color='black'
15 ).add_to(m)
16
~/cases/map/lib/python3.6/site-packages/folium/features.py in __init__(self, geo_data, data, columns, key_on, bins, fill_color, nan_fill_color, fill_opacity, nan_fill_opacity, line_color, line_weight, line_opacity, name, legend_name, overlay, control, show, topojson, smooth_factor, highlight, **kwargs)
1076 if color_data is not None and key_on is not None:
1077 real_values = np.array(list(color_data.values()))
-> 1078 real_values = real_values[~np.isnan(real_values)]
1079 _, bin_edges = np.histogram(real_values, bins=bins)
1080
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
hpaulj 建议 json 有问题。您可以在源代码处查看 json,但我也从 print(geofile)
:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "Afghanistan"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
61.210817,
35.650072
],
[
62.230651,
35.270664
],
[
62.984662,
35.404041
],
[
63.193538,
35.857166
],
[
63.982896,
36.007957
],
[
64.546479,
36.312073
],
[
64.746105,
37.111818
],
[
65.588948,
37.305217
],
[
65.745631,
37.661164
],
[
66.217385,
37.39379
],
[
66.518607,
37.362784
],
[
67.075782,
37.356144
],
[
67.83,
37.144994
],
[
68.135562,
37.023115
],
[
68.859446,
37.344336
],
[
69.196273,
37.151144
],
[
69.518785,
37.608997
],
[
70.116578,
37.588223
],
[
70.270574,
37.735165
],
[
70.376304,
38.138396
],
[
70.806821,
38.486282
],
[
71.348131,
38.258905
],
[
71.239404,
37.953265
],
[
71.541918,
37.905774
],
[
71.448693,
37.065645
],
[
71.844638,
36.738171
],
[
72.193041,
36.948288
],
[
72.63689,
37.047558
],
[
73.260056,
37.495257
],
[
73.948696,
37.421566
],
[
74.980002,
37.41999
],
[
75.158028,
37.133031
],
[
74.575893,
37.020841
],
[
74.067552,
36.836176
],
[
72.920025,
36.720007
],
[
71.846292,
36.509942
],
[
71.262348,
36.074388
],
[
71.498768,
35.650563
],
[
71.613076,
35.153203
],
[
71.115019,
34.733126
],
[
71.156773,
34.348911
],
[
70.881803,
33.988856
],
[
69.930543,
34.02012
],
[
70.323594,
33.358533
],
[
69.687147,
33.105499
],
[
69.262522,
32.501944
],
[
69.317764,
31.901412
],
[
68.926677,
31.620189
],
[
68.556932,
31.71331
],
[
67.792689,
31.58293
],
[
67.683394,
31.303154
],
[
66.938891,
31.304911
],
[
66.381458,
30.738899
],
[
66.346473,
29.887943
],
[
65.046862,
29.472181
],
[
64.350419,
29.560031
],
[
64.148002,
29.340819
],
[
63.550261,
29.468331
],
[
62.549857,
29.318572
],
[
60.874248,
29.829239
],
[
61.781222,
30.73585
],
[
61.699314,
31.379506
],
[
60.941945,
31.548075
],
[
60.863655,
32.18292
],
[
60.536078,
32.981269
],
[
60.9637,
33.528832
],
[
60.52843,
33.676446
],
[
60.803193,
34.404102
],
[
61.210817,
35.650072
]
]
]
},
"id": "AFG"
}
]
}
好的 - 看起来好像 json 是一个转移注意力的问题。我的脚本中的代码实际上是将错误的数据帧提供给 data=choro_data
,因此有效地 folium 正在接收格式错误的数据集信息并抛出错误。