Shapelets平台出现TypeError: unhashable type: 'dict'错误求助
排查Shapelets DataApp中
TypeError: unhashable type: 'dict'错误 我正在开发一个展示巴黎所有骚乱事件的项目,用于分析区域安全性。使用Shapelets平台DataApp绘制数据图表时,出现了TypeError: unhashable type: 'dict'错误,以下是我的代码,恳请帮忙排查问题:
import pandas as pd from pandas import DataFrame import shapelets as sh session = sh.sandbox() riot = session.from_csv("riots.csv") def build_map(riot:Dataframe,start_date:float,end_date:float)->Image: # 此函数接收包含巴黎所有骚乱事件的Dataframe,并用Plotly绘制地图 import plotly.express as px from matplotlib import pyplot as plt # 提取用户指定日期范围内的骚乱数据 riot_in_range = riot[(riot['date'] >= start_date) & (riot['date'] <= end_date)] # 用Plotly Express构建地图可视化 fig = px.scatter_mapbox(riot_in_range, lat="Latitud", lon="Longitud", color_discrete_sequence=["brown"], zoom=9.4) fig.update_layout(mapbox_style="open-street-map") fig.update_layout( autosize=True, hovermode='closest', mapbox=dict( bearing=0, center=dict( lat=48.8566, lon=2.3522 ), pitch=0, zoom=9.4 ), ) # 创建Matplotlib画布并显示图片 fig, ax = plt.subplots() ax.imshow(img) return Image(fig)
错误原因及修复方案
1. 核心错误:数据类型不兼容
session.from_csv()返回的是Shapelets原生DataFrame对象,而非Pandas DataFrame。直接用Pandas的布尔索引语法筛选数据,会返回字典结构的结果,而Plotly要求输入可哈希的表格型数据,这直接触发unhashable type: 'dict'错误。
2. 其他代码问题
- 类型注解拼写错误:
Dataframe应为DataFrame(Pandas类名首字母大写);Image未正确导入,需使用Shapelets提供的sh.Image。 - 变量未定义:
ax.imshow(img)中的img未声明,且此处完全没必要混用Matplotlib和Plotly,属于冗余代码。 - 变量重复定义:先创建了Plotly的
fig,后续又用plt.subplots()重新赋值,覆盖了原有图表对象。
修正后的代码
import pandas as pd from pandas import DataFrame import shapelets as sh import plotly.express as px session = sh.sandbox() # 将Shapelets DataFrame转换为Pandas DataFrame,兼容Plotly riot = session.from_csv("riots.csv").to_pandas() def build_map(riot: DataFrame, start_date: float, end_date: float) -> sh.Image: # 筛选指定日期范围内的数据 riot_in_range = riot[(riot['date'] >= start_date) & (riot['date'] <= end_date)] # 构建Plotly地图 fig = px.scatter_mapbox(riot_in_range, lat="Latitud", lon="Longitud", color_discrete_sequence=["brown"], zoom=9.4) fig.update_layout(mapbox_style="open-street-map") fig.update_layout( autosize=True, hovermode='closest', mapbox=dict( bearing=0, center=dict( lat=48.8566, lon=2.3522 ), pitch=0, zoom=9.4 ), ) # 将Plotly图表转为Shapelets Image返回 return sh.Image(fig.to_image(format="png"))
关键修复点说明
- 用
to_pandas()将Shapelets数据转换为Pandas DataFrame,确保Plotly能正常解析数据结构。 - 移除冗余的Matplotlib代码,直接通过
fig.to_image()将Plotly图表转为图片,再用sh.Image包装返回。 - 修正所有类型注解和导入问题,确保语法合规。
内容的提问来源于stack exchange,提问作者Amelia Patel
相关产品推荐
相关产品推荐

