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
相关产品推荐
相关产品推荐

