填空题

省略代码片段以及多行代码,让练习者补全代码,使得代码能够完成题目要求的工作。

填空题标准示例

习题名称

除了使用“课程名字-内容”之外,对于嗨客挑战中的练习题,务必加上“嗨客挑战”字样,并且加上序号1、2、3等表示嗨客挑战的第几道练习题,这样方便后续将嗨客挑战中的几道题由前到后布置为连续的作业或者考试,如

大数据分析的Python基础-嗨客挑战第一关-1-统计品质数量

题目说明

填空题的题目说明由题目背景(可以看成是已知条件)、作答部分、提示(可选)、正误判定说明四个部分组成,主要使用Markdown撰写。

题目背景

题目的背景描述部分,将已知条件告诉练习者。不需要缩进

现已使用Pandas读取整个数据集nba_rookie.csv

作答部分

练习者需要完成的代码补全任务,以及实现的目标。通过项目符号列表阐述单个或多个任务,多个任务紧凑的排列在一起,无须空行,并使用“请”开头进行阐述。

  • 请观察哪些样本是重复的,总共有多少个样本?

  • 请去重:只保留重复样本中的一个,将最后得到的DataFrame存为data_filtered

  • 请观察去重后哪些名字是重复的(实际上在NBA,重名的现象挺常见的)?

提示

数据嗨客是一个在线实训平台,大多数用户是初学者,所以总会对学习过的知识有所遗忘,我们在设计练习题时,需要有一种包容的态度。对于一些较难的知识点,应当给予练习者一定的温馨提示信息。通过项目符号列表阐述单个或多个提示。

  • 提示:使用duplicated()时,指定keep=False,可以得到使得所有重复的样本为True,而非其中的第一个样本;通过指定subset可以只根据部分列进行重复样本判定。

其余需要用户注意的信息也应该放入提示信息中。

  • 提示:新版本的Pandas已经弃用panel数据类型

正误判定说明

在收到许多用户的吐槽之后,我们决定将最后正误判定的内容直接告知用户,使得用户做题更有针对性。同时,正误判定说明应与判定代码中的实际判定变量或目标一致。根据判定的内容不同,有以下两种书写格式:

  • 如果判定的内容为单个或多个变量,应该以“正误判定变量:”开头,并使用中文符号顿号隔开多个变量,倒数第二个变量与最后一个变量中间应插入“和”字,所有文字加粗且句尾不加任何符号

正误判定变量:data_filtereddata_transformeddata_cleaned

  • 如果判定的内容为除变量的单个或多个目标,应该以“正误判定目标:”开头,并使用中文符号顿号隔开多个目标,倒数第二个目标与最后一个目标中间应插入“和”字,所有文字加粗且句尾不加任何符号

正误判定目标:weak_clfs[0]['alpha']

或使用如下的叙述方式:

正误判定目标:traintest的样本数,且允许两个样本数的误差

默认代码

MagicFrame中默认显示的代码,是练习者待补全的代码,也是练习者第一次打开填空题看到的代码。

MagicFrame中的默认代码示例

整个默认代码可以看做两个部分,前半部分为已知代码,不希望练习者修改的部分。后半部分是需要练习者补全的代码部分,且使用四个短下划线____表示需要练习者补全的代码部分,____部分实际意味着需要练习者补全某个函数的参数、一行代码、多行代码等等多种情况。

已知部分和待补全部分可以使用一行注释# 请在下方作答 #作为明显的界限,以避免练习者修改已知部分导致提交不通过,是否一定需要这个界限,可参考FAQ

import pandas as pd
raw_data = pd.read_csv('nba_rookie.csv')

针对性与考察目标清晰

数据嗨客的所有练习题都必须要有针对性,尤其是对于插入课程中的练习题,需要与所讲述的知识点紧密结合,填空部分应该是考察知识点的关键代码,而不是已经练习过的部分。

预设代码

练习题的某些已知部分,为了避免干扰练习者,且浪费时间阅读这部分代码,我们不希望练习者在默认代码看到这一部分。比如一个需要多行代码完成的数据预处理过程,我们只需要练习者利用预处理后的数据进行作答,那么我们就可以完全将这个预处理的代码放到预设代码中。

参考代码

import pandas as pd
raw_data = pd.read_csv('nba_rookie.csv')

练习题的标准答案,在默认代码基础上完整的可运行的代码。需要保证练习者直接复制所有参考代码到MagicFrame中能够提交通过。仍然包含两个部分:已知部分和补全部分。

判定代码

判断练习者所要求输出的变量是否正确,注意计算答案变量的代码需要放在判定代码部分。假设题目的正误判定变量为result,那么出题者需要在判定代码中使用正确的答案变量result_correct去与练习者作答的result进行比较。正确的答案变量可以由两种方式得到:

  • 重复运行正确的代码,包含预设代码到参考代码的过程,最终得到result_correct

  • 不重复运行正确的代码,直接声明预先知道的result_correct,或是一个值,或是从一个答案数据集中直接读取,见FAQ

同样以Pandas数据分析-嗨客挑战第一关-1-去重这道题为例。该题的正误判定变量为data_filtered,判定代码示例如下:

import pandas as pd
raw_data = pd.read_csv('nba_rookie.csv')

# 请在下方作答 #
# 打印出重复的样本,统计重复样本的个数
print u"重复样本如下:\n", raw_data[raw_data.duplicated(keep=False)]
print raw_data.duplicated(keep=False).value_counts(), "\n"

# 去重
data_filtered = raw_data.drop_duplicates()

# 打印去重后,姓名相同的新秀
duplicated_name = data_filtered.duplicated(subset=['Name'])
print set(data_filtered[duplicated_name].Name)

一旦练习者答案与正确答案变量一致,则在条件判断语句里的主体语句为print "{}",这是数据嗨客后端工程师定义的规则。

严格一致与容忍度

实际上,对于某些题来说,并不要求练习者的作答与正确答案严格相等,或者对应元素严格相等(对于array和dataframe等复杂数据结构而言),我们可以给予一定的容忍度,尤其是对于有乘除加减运算的结果,比如练习者得到的结果是3.7,但是正确答案的值应为3.69743,对于这种保留小数点位数造成的差别,并不是练习者不熟悉相关知识点导致的结果,我们应该放宽判定:

有一定容忍的判定代码
result_correct = 3.69743
if round(result_correct, 2)-0.01<=result<=round(result_correct, 2)+0.01:
    print "{}"

即只要练习者的作答result[3.69, 3.71]之间,我们都判断该题通过。

代码运行的顺序

当练习者点击MagicFrame的提交按钮时,预设代码、MagicFrame填写的代码(或称提交代码)和判定代码将在后台拼接,其运行顺序为:

  • 预设代码

  • MagicFrame填写的代码

  • 判定代码

上传关联数据集合

通过该接口上传本道题所需的数据集。可以上传的文件分为两种:

  • 数据集文件。上传后的文件类型为普通数据集,可供练习者探索,在MagicFrame中读取(以后练习题会有“数据探索”按钮,点击后自动跳转到带有该普通数据集的案例环境)。

  • 答案集文件。上传后的文件类型为答案数据集,练习者无法探索该数据,且不能在MagicFrame中读取,仅供出题者在判定代码中使用。

文件要求:

  • 以字母、数字命名的csv、txt、pickle等格式的数据文件(后续将开放db等格式的数据文件)

  • 大小上限为50M

  • 最多上传10个文件

OAM管理系统录入

带星号*的栏目表示必填项,其余表示选填项。

填空题录入界面(上)
填空题录入界面(中)
填空题录入界面(下)

FAQ

一定需要写“请在下方作答”吗

不一定,需要酌情考虑。若整个默认代码的内容较多,尤其是已知代码部分,那么应该使用# 请在下方作答 #明确的告诉练习者这两部分的界线,避免练习者修改已知代码导致提交不通过。如果整个默认代码在十行以内,那么也可以不需要写这一行注释。

必须在判定代码中重复计算过程才能比较正误吗

不一定。若为了判断正误,需要执行一个耗内存的程序,则尽量提前在线下跑一次这个代码,并将正误判定的变量直接拿到去与练习者的作答进行比较。但是若需要让他经过很复杂的过程得到某个变量result,假设我们预先知道正确的该变量的值为3.7,那么在判定代码中,我们可以直接声明result_correct=3.7,直接该变量去与练习者的result进行比较,而不是在判定代码重复执行一个很复杂的过程;对于一个经过复杂过程得到的DataFrame,也可以提前先存为csv文件,判定时,直接读取即可,以减小内存消耗。

Last updated