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

Shapelets平台中AltairChart结合pandas DataFrame出现内部服务器错误

问题:Shapelets平台运行DataApp触发Internal Server Error,报错“Runtime error executing full_bar”

我在Shapelets平台使用shapelets.apps库的AltairChart和DataApp模块创建DataApp,运行代码时出现Internal Server Error,提示“Runtime error executing full_bar”。本地未使用Shapelets时功能正常,数据包含98个以上特征,体量较大。简化版代码如下:

from shapelets.apps import AltairChart, DataApp
import pandas as pd
import altair as alt

# 导入数据
papa_person = pd.read_csv('/root/Papa_johns_last/papa_person1.csv')
papa_person_group = papa_person.groupby("postalCode").mean()

one = papa_person_group.iloc[:,84+10:]
two = papa_person_group.iloc[:,41+10:44+10]
population = papa_person_group.iloc[:,7+10:12+10]
language = papa_person_group.iloc[:,12+10:17+10]
married = papa_person_group.iloc[:,17+10:22+10]
male_female = papa_person_group.iloc[:,4+10:6+10]
household = papa_person_group.iloc[:,22+10:29+10]
income = papa_person_group.iloc[:,29+10:41+10]
education = two.join(one)
employment = papa_person_group.iloc[:,45+10:66+10]
employment_group = papa_person_group.iloc[:,66+10:69+10]
age = papa_person_group.iloc[:,69+10:84+10]
leftover = papa_person_group.iloc[:,0+10:4+10]

cat={
    "Population":population, 
    "Language":language, 
    "Married":married, 
    "Male Female":male_female, 
    "Household":household, 
    "Income":income, 
    "Education":education, 
    "Employement":employment,  # 注意此处拼写错误
    "Employement Group":employment_group, 
    "Age":age, 
    "Leftover":leftover
}

app = DataApp(name= "Data")

def full_bar(cat: dict, selector_cat: str) -> AltairChart:
    cat = cat[selector_cat]
    melted_cat = pd.melt(cat.reset_index(), id_vars=['postalCode'], var_name='Feature', value_name='Count')

    # 创建堆叠柱状图
    chart = alt.Chart(melted_cat).mark_bar().encode(
        x='postalCode:N',
        y='Count:Q',
        color='Feature:N',
        tooltip=['postalCode:N', 'Feature:N', 'Count:Q']
    ).properties(width=600, height=400, title='Bar Chart by Zipcode and Feature').interactive()

    return chart

# 创建选择器
selector = app.selector(title="Select the Postal Code", options=['33122','33125','33126','33127','33128','33129','33130','33131','33132','33133','33134','33135','33136','33137','33138','33139','33140','33141','33142','33143','33144','33145','33146','33147','33148','33149','33150','33151','33152','33153','33155','33156','33157','33161','33162','33165','33166','33167','33168','33169','33170','33172','33173','33174','33175','33176','33177','33178','33179','33180','33181','33182','33183','33184','33185','33186','33187','33188','33189','33190','33193','33194'])
selector_cat = app.selector(title="Select the Categorie", options=['Income', 'Language', 'Population', 'Married', 'Education', 'Male Female', 'Employment', 'Employement Group', 'Age', 'Household', 'Leftover'])

image_full_bar = app.altair_chart()
image_full_bar.bind(full_bar, cat, selector_cat)

app.place(selector_cat)
app.place(image_full_bar)

app.register()

排查方案

1. 修复键名拼写不匹配问题

代码中cat字典的键为"Employement"(拼写错误,多了一个字母e),但选择器selector_cat的选项包含"Employment"(正确拼写)。当用户选择"Employment"时,cat[selector_cat]会触发KeyError,这是最可能的报错原因。

  • 解决:将cat字典中的"Employement"改为"Employment",确保和选择器选项完全一致。

2. 优化数据体量,避免性能溢出

数据包含98+特征,pd.melt后生成的数据集可能超出Shapelets平台的运行内存或超时限制。

  • 解决:
    • 本地测试full_bar函数,传入每个选择器选项,验证数据格式和内存占用;
    • 提前过滤数据:只保留选择器中指定的postalCode数据,减少计算量;
    • 限制单张图表的特征数量,避免一次性渲染过多堆叠条。

3. 调整函数参数传递方式

直接传递大字典cat给绑定函数,可能导致Shapelets序列化失败。建议用Shapelets的state管理数据:

# 将数据存入app的state
app.state.cat = cat

# 修改函数,从state取数据
def full_bar(selector_cat: str) -> AltairChart:
    cat = app.state.cat[selector_cat]
    melted_cat = pd.melt(cat.reset_index(), id_vars=['postalCode'], var_name='Feature', value_name='Count')
    # 后续图表逻辑不变
  • 绑定函数时只需传入选择器:image_full_bar.bind(full_bar, selector_cat)

4. 简化Altair配置,排查序列化问题

部分Altair交互配置可能在Shapelets平台无法正常序列化,先简化图表测试:

  • 暂时去掉.interactive(),测试基础图表是否能渲染;
  • 简化tooltip或title格式,逐步恢复配置定位问题。

5. 验证数据类型合法性

groupby.mean()后的数据可能存在非数值类型,导致Altair无法识别Count:Q(定量)类型:

  • 检查melted_cat['Count']的数据类型,用pd.to_numeric(melted_cat['Count'], errors='coerce')转换为数值型并处理空值。

内容的提问来源于stack exchange,提问作者Willam Singhs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:12:36