寻找“问题”学生、过滤数据
话接上一回,这个有注册的学生数呀,为1302人;而有记录(学生每天学习的记录)的人数为1237人。这就奇了怪了。难道这些学生还飞了不成?
下面就试试用代码来找找这些“问题学生”:
在《数据分析之旅(一)》中的代码里的函数:
def unique_students(csvlist,keyname):
s = set()
for each in csvlist:
s.add(each[keyname])
return s
可以返回一个CSV文件中所有不重复的学生的集合(集合里的元素是不重复的)。那这就好办了。只要找到 注册的学生集合 与 有记录的学生集合 的差集不就可以了吗?
unique_engagement_students = unique_students(daily_engagement,"account_key")
for enrollment in enrollments:
student = enrollment['account_key']
if student not in unique_engagement_students :
print(enrollment)
break
这里首先取到daily_engagement.csv文件里有记录的学生的集合 unique_engagement_students ,(enrollments = read_csv(‘enrollments.csv’) , 是注册文件的内容,一系列的行)。
对于每一行,先获取学生的account_key,然后如果该学生不在unique_engagement_students 中,就打印出来,并找到一个后就先退出(break)看看数据长啥样。
Output:
可以看到,输出结果中,有问题的地方有几个:
1. join_date 等于 calcel_date ;
2. 由于 1的原因,is_udacity值为False ; (同一天注册以及取消,系统可能不会有记录。纯属个人猜测)
那么,再打印出其他的数据看看?
num_of_problem_stu = 0
unique_engagement_students = unique_students(daily_engagement,"account_key")
for enrollment in enrollments:
student = enrollment['account_key']
if student not in unique_engagement_students and enrollment["join_date"] != enrollment["cancel_date"]:
print(enrollment)
num_of_problem_stu += 1
即可找出注册表中注册时间 > 1天而没有出现在参与表(有记录)中的学生
Output:
看了好久愣是没找出啥问题。。。、
然后回去看视频讲解,才知道这是测试用的账号。。。(ಥ _ ಥ)亏我看了辣么久,不过可以看到这些账户的 is_udacity 值均为True , = =|| 原来这个属性意思是是不是udacity的账户。。。
接下来,就可以把这些测试账号数据过滤掉啦
因为这里有三个文件,所以可以写个函数,下面上代码:
udacity_test_accounts = set() # 创建集合来保存测试的账号
for enrollment in enrollments:
if enrollment['is_udacity']:
udacity_test_accounts.add(enrollment['account_key'])
def remove_udacity_accounts(csvlist):
"""定义函数来从原始数据中过滤掉测试账号 """
non_udacity_data = []
for each in csvlist:
if each['account_key'] not in csvlist:
non_udacity_data.append(each)
return non_udacity_data
remove_udacity_accounts(enrollments)
remove_udacity_accounts(daily_engagement)
remove_udacity_accounts(project_submissions)
遇到的问题及感想
首先是要找出数据里的问题,可以打印出来看一下问题是什么样的—-比如这里是先打印出一个问题数据,发现是同一天注册以及取消,因此在参与表中没有记录;
继而可以深入探究出现问题的原因,亦或者是寻找看看有没有其他问题;
在这些过程中要寻找合适的、充分利用一些数据结构,如set集合,dict字典等。