Lab 1: 清华周边美食指南数据分析实战

课程:数据库技术与应用:AI时代的基石数据技能
授课教师:王健楠 (计算机科学与技术系)
学期:2026年(春季)

实验说明与注意事项

1. 考察知识点: 本次 Lab 主要考察 Python 语言的核心基础知识,包括但不限于:

2. 重要提醒:严禁使用外部库 本实验的核心目的是巩固对 Python 原生语言特性的掌握程度。因此,在完成本次 Lab 的所有任务时,只能使用 Python 标准库提供的数据结构和内置函数,严禁导入和使用任何外部第三方库(如 pandas, numpy 等)。 如果在代码中发现使用违规库,该项任务将会被判定为 0 分。

3. 关于测试与评分机制的说明: Notebook 中每个任务下方提供的 assert 测试单元格,仅仅是作为基础的辅助检查,用来帮助大家快速排查低级错误或拼写问题。通过了 Notebook 中的可见测试,绝对不代表你的代码逻辑100%正确,也不保证能拿满分。 在最终提交评测时,我们会使用一套包含更多边界情况、异常值和隐藏数据集assert 测试脚本进行自动化打分。请大家务必在写代码时自行考虑逻辑的严密性和代码的健壮性。


实验背景

欢迎加入本学期的实战项目!在这个 Lab 中,你将扮演「THU Eats 校园美食指南」项目组的数据分析师(Data Scientist)。我们的目标是开发一款专为清华学子打造的美食推荐引擎,帮助大家更高效地探索周边美食。

作为团队的核心技术骨干,你需要利用 Python 处理从真实点评平台上获取的餐厅数据,完成从基础数据统计、商业市场分析到核心推荐算法的开发。

准备好开启你的数据科学之旅了吗?


评分规则: 共 100 分(9 道编程题)。 通关提示: 每道题都要求你在代码块中写出完整的逻辑。请删除 raise NotImplementedError() 并填入你的代码。运行测试块,如果没有报错即代表基础步骤通过测试。

第 0 步:数据加载与环境准备

首先,我们将项目组采集到的结构化数据加载到内存中。请直接运行下面的代码块,无需修改。


开发任务大厅

任务 1:项目概况简报 (变量与基本运算,10 分)

项目启动会上,产品负责人需要一份整体的“校园周边餐饮宏观数据”。你需要帮团队快速计算出核心指标。

请编写代码,完成以下计算:

  1. 计算所有餐厅的平均人均消费,赋值给变量 avg_price(浮点数)
  2. 找出评分最高的餐厅名称,赋值给变量 best_restaurant(字符串)
  3. 统计支持外卖的餐厅数量,赋值给变量 delivery_count(整数)
  4. 用 f-string 创建一条供汇报的汇总句子,格式为 "共X家餐厅,平均消费Y元,其中Z家支持外卖",赋值给变量 summary
    • 注意:其中的平均消费 Y 需要保留1位小数

提示: Python 的内置函数 sum(), len(), max() 将非常有帮助。

任务 2:运营标签系统建设 (条件判断,10 分)

为了给不同预算预期的同学提供精准推荐,运营团队需要为数据库中的餐厅增加消费分级标签。

请编写一个代码块,遍历 restaurants 列表,为每家餐厅生成一个分类标签,规则如下:

预期输出:

  1. 将结果存为一个字典的列表,赋值给变量 classified,每个字典包含两个键:"name": 餐厅名称, "level": 分类标签
    • 示例:[{"name": "海底捞(五道口店)", "level": "高档"}, ...]
  2. 高档餐厅的数量赋值给变量 high_count
  3. 平价餐厅的数量赋值给变量 budget_count

任务 3:探索频道功能开发 (循环控制,15 分)

产品经理提出了三个 App 首页“探索频道”的特色功能需求。你需要通过基础逻辑来实现它们。

请编写代码,严格使用循环结构(for / while)完成以下任务:

  1. “高分人气榜”: 找出所有评分 ≥ 4.3 且 评论数 ≥ 1000 的餐厅,将它们的名称存入列表 popular
  2. “探索线下门店”: 为了鼓励大家多去线下体验,请找一家不支持外卖的店。使用 while 循环,从列表开头开始查找,遇到第一家不支持外卖的店即停止,将其名称赋值给 first_no_delivery
  3. “前端排版测试”: 前端工程师需要提取部分数据进行界面轮播图测试,请使用 enumerate 遍历餐厅列表,提取所有索引为偶数(0, 2, 4...)的餐厅名称,存入列表 even_index_names

任务 4:高性价比美食专区 (列表操作,15 分)

平台计划上线“高性价比专区”,帮助同学们在保证体验的同时合理控制花销。我们需要通过列表切片和推导式技术来处理数据。

  1. 优质精选榜: 将所有餐厅按评分(rating从高到低排序(如果评分相同,保持原列表的默认顺序即可),切片取出排名前5的餐厅名称,存入列表 top5_names
  2. 数据抽样校验: 截取 restaurants 列表中第3到第7家(即索引 2 到 6,含两端)的餐厅,将它们的人均消费单独提取出来,存入列表 prices_slice
  3. 平价外卖直达(列表推导式): 使用一行代码,生成一个列表 affordable_delivery,包含所有 人均消费 < 50 且支持外卖 的餐厅名称。

提示: sorted() 函数可以通过 key=lambda ...reverse=True 参数轻松完成自定义的高阶排序。

任务 5:餐饮品类商业分析 (字典应用,10 分)

商业分析师(Business Analyst)正在撰写周边餐饮环境调研报告,需要了解目前市场的主流菜系和品类均价。

请使用字典(Dictionary)进行数据聚合计算:

  1. 菜系分布统计: 创建字典 cuisine_count,记录每种菜系有多少家餐厅(例:{"火锅": 2, "日料": 1})。
  2. 品类价格指数: 创建字典 cuisine_avg_price,计算出每种菜系的平均人均消费
  3. 主流品类: 找出餐厅数量最多的那一种菜系名称,赋值给变量 most_common_cuisine

任务 6:区域餐饮生态对比 (集合运算,10 分)

战略规划部需要对比“五道口(社会餐饮为主)”和“清华校内(食堂为主)”的餐饮生态差异,为未来的推荐算法添加区域权重属性。

这正是 Python 集合(Set) 大显身手的时候!请计算:

  1. 创建集合 wudaokou_cuisines,提取五道口区域所有不重复的菜系。
  2. 创建集合 campus_cuisines,提取清华校内区域所有不重复的菜系。
  3. 区域特色: 计算五道口但清华校内没有的菜系,赋值给 only_wudaokou
  4. 区域共性: 计算两个区域共同拥有的菜系,赋值给 shared_cuisines
  5. 全域品类: 计算这两个区域覆盖的所有菜系总和(并集),赋值给 all_cuisines

任务 7:核心查询组件开发 (函数封装,10 分)

为了支撑后续更复杂的功能,我们需要将常用的查询逻辑封装成稳定可靠的函数 (Functions),构建后端 API 的基础组件。

请定义以下两个组件:

组件 1: 筛选引擎 filter_restaurants(data, min_rating=4.0, max_price=100, cuisine=None)

组件 2: 统计面板 restaurant_summary(data)

任务 8:数据导出与模型对接 (文件 IO,10 分)

AI 算法团队计划引入机器学习模型进行深度偏好分析,他们的训练管道需要 .csv 格式的结构化数据。你需要负责将内存中的数据持久化存储。

第一段管线:写入导出restaurants 数据写入文件 restaurants_export.csv,要求:

第二段管线:读取校验 请读取刚生成的 restaurants_export.csv 进行数据完整性验证:

任务 9:智能推荐引擎构建 (综合题,10 分)

这是本期 Lab 的最终挑战!你需要综合运用前面的知识,构建推荐系统的核心逻辑模块。

请编写函数 recommend(data, budget, preferences, top_n=3),根据用户的多维度需求进行精准匹配:

  1. 预算硬约束: 过滤掉所有 price > budget 的餐厅。
  2. 偏好特征匹配: 依次检查字典 preferences。如果传入了 "cuisine""delivery""district" 特征(可能部分缺失),则餐厅必须同时满足这些提供的条件(即取交集),不符合的直接筛选掉。
  3. 质量排序: 将剩余的备选餐厅按评分 rating 从高到低 进行排序。
  4. 结果输出: 返回排名前 top_n 的餐厅名称列表(若符合条件的数量不足 top_n,则返回全部符合条件的列表)。

Lab 顺利完成!

恭喜你完成了本次数据分析与系统构建的挑战!通过这个项目,你已经将 Python 的基础语法成功应用到了实际的工程与业务场景中。

提交前的最终检查: