You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:35:10