尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

在 Django 中使用 pandas 构建考试成绩分段 API 接口

发布时间:2026/9/29 5:42:22

资讯中心
01
ARTICLE

在 Django 中使用 pandas 构建考试成绩分段 API 接口

在 Django 中使用 pandas 构建考试成绩分段 API 接口
在 Django 项目中需要基于 ORM 构建一个数据接口用于统计学生不同学科的成绩分段情况并返回 JSON 格式数据以支持数据可视化。具体需求包括支持多个学科的分数分段统计按照班级分组计算不同分数区间内的学生数量并以结构化数据形式返回以便前端图表库使用。解决方案通过 Django REST framework (DRF) 定义ExaminationAnalyzeBasicDescriptionViewSet视图集并提供segmented_scoreAPI 端点专门用于获取学生成绩的分段统计数据。该视图允许GET请求根据查询参数score_subject确定目标学科并基于 Pandas 对查询结果进行数据处理。数据转换后系统按照预定义的分数分段范围如 1 分、2 分、3 分、5 分等对成绩进行分组统计每个班级在各个区间内的学生人数并返回结构化 JSON 数据。视图集的segmented_score方法通过filter_queryset()获取未删除的考试成绩数据并转换为 Pandas DataFrame以便进行后续处理。在获取score_subject参数后系统首先验证该参数是否合法确保其属于预定义的学科列表否则返回错误响应。数据过滤后仅保留行政班级和目标学科的成绩列并根据多个分段标准计算分数范围。分段的逻辑基于pd.cut()首先计算该学科的最小值和最大值再根据不同的分数步长生成bins分段区间和labels区间标签确保每个区间都能正确覆盖数据范围。数据分组统计时使用 Pandas 的groupby()方法以class_administrative作为分组依据并计算每个班级在各个分段内的学生数量。结果转换为unstack(fill_value0)以确保数据整齐最终构建 JSON 结构包含title分段粒度、x分段标签、aseries班级统计数据和bseries总人数统计并返回序列化后的 JSON 数据。importpandasaspdfromrest_framework.responseimportResponsefromrest_framework.decoratorsimportactionfromrest_frameworkimportstatusclassExaminationAnalyzeBasicDescriptionViewSet(CustomModelViewSet):action(detailFalse,methods[get])defsegmented_score(self,request):filtered_querysetself.filter_queryset(self.get_queryset())score_subjectrequest.query_params.get(score_subject,None)ifnotscore_subject:returnResponse({error:score_subject parameter is required},status400)dfpd.DataFrame(list(filtered_queryset.values()))valid_subjects[total_score,score_politics,score_geography,score_history,score_chemistry,score_physics,score_english,score_biology,score_math,score_chinese]ifscore_subjectnotinvalid_subjects:returnResponse({error:fSubject{score_subject}does not exist in data},status400)dfdf[[class_administrative,score_subject]]segmented_score_list[1,2,3,5,10,20,30,50]bins_dict,labels_dict{},{}min_score,max_scoredf[score_subject].min(),df[score_subject].max()forsegmentinsegmented_score_list:binslist(range(min_score,max_scoresegment,segment))bins[-1]max_score1labels[f{bins[i]}-{bins[i1]-1}foriinrange(len(bins)-1)]bins_dict[segment],labels_dict[segment]bins,labels table_data[]forsegmentinsegmented_score_list:df[fscore_segment_{segment}]pd.cut(df[score_subject],binsbins_dict[segment],labelslabels_dict[segment],rightFalse)summarydf.groupby([class_administrative,fscore_segment_{segment}]).size().unstack(fill_value0)table_data.append({title:f{segment}分,x:labels_dict[segment],aseries:[{name:class_adm,data:summary.loc[class_adm].tolist()}forclass_adminsummary.index],bseries:summary.sum().tolist()})serializerBasicDescriptionSegmentedScoreSerializer(table_data,manyTrue)returnResponse(serializer.data,statusstatus.HTTP_200_OK)数据的返回格式需要符合前端可视化的要求因此在segmented_score方法中除了对数据进行统计计算外还定义了一个数据序列化类BasicDescriptionSegmentedScoreSerializer。该序列化类用于格式化 API 响应确保返回的 JSON 结构清晰易读。为了让 API 端点返回的数据结构化定义了 DRF 的Serializer包含ASeriesSerializer存储各班级数据和TableDataSerializer存储整体分段数据最终用于序列化 JSON 响应。fromrest_frameworkimportserializersclassASeriesSerializer(serializers.Serializer):nameserializers.CharField(max_length50)dataserializers.ListField(childserializers.IntegerField())classTableDataSerializer(serializers.Serializer):titleserializers.CharField(max_length20)xserializers.ListField(childserializers.CharField(max_length20))aseriesASeriesSerializer(manyTrue)bseriesserializers.ListField(childserializers.IntegerField())执行 API 端点后返回的 JSON 数据结构如下包含各班级的分段数据以及总计数据以便前端进行可视化展示[{title:5分,x:[0-4,5-9,10-14,...],aseries:[{name:Class A,data:[3,5,2,1]},{name:Class B,data:[4,3,6,2]}],bseries:[7,8,8,3]},{title:10分,x:[0-9,10-19,20-29,...],aseries:[{name:Class A,data:[8,2,1]},{name:Class B,data:[6,4,3]}],bseries:[14,6,4]}]基于 Django ORM 和 Pandas 提供了一个高效的 API能够动态统计不同学科的成绩分布并以不同粒度进行分段计算。该方法适用于数据可视化需求能够对接 ECharts 或 Highcharts 等前端图表库提升数据的直观性。代码结构清晰查询高效可进一步优化查询方式以提升性能。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。