Python活动报名表的分析、处理和筛选

        最近比较清闲,部门竞标成功了一个联谊活动,和其他两个女生比例比较高的学院一起承办,我是负责报名表的制作,从13号还是报名到现在(19号凌晨1点)已经有超过670位同学报名参加,男女比例趋向于1比2。

        好像说的有点多,因为是学校实际数据,数据不会公开,报名表通过问卷星制作并下载得到原始数据表格。原始报名表共有8个,第一个姓名必填,第二个性别必选,第三个学历必选,第四个学院必填,第五个手机号码必填,六七八分别为照片、自我介绍和对另一半的要求,为选填项。

        问卷星下载得到的exce格式如下:

0序号 1提交答卷时间 2所用时间 3来源 4来源详情 5来自IP 6姓名 7性别 8学历 9所在学院 10手机号码 11个人照片 12自我介绍

13对另一半的要求

        对于8个问题中的姓名、学院、手机号为非空字符串,性别、学历为数字,分别代表可选项的序号,照片为附件类型,如果上传则显示为照片地址,否则为字符串'(空)',介绍和要求如果填写则为对应字符串,否则为'(空)'。

        首先,对于学院方面,有的喜欢写缩写,有的写全拼,例如对于文化与新闻传播学院,有的填“文新”、“文新学院”、“文化与新闻学院”等等,为了方便统计,需要对他们输入的千姿百态的学院名做出调整。于是手动整理了一个表格college_name.xls:

第一列为全拼,第二列为他们各种填写方式中对应为该学院的关键词的组合,多个间用空格隔开,并且不同学院的关键词不能相同或者包含关系。

 

college_name=xlrd.open_workbook(r'collegename.xls')#打开表格
cn=college_name.sheet_by_index(0)#获得第一张表
dictionary=dict()#字典存放关键词到学院的映射
mapping=dict()#字典存放学院到编号的映射
map_number=0#学院编号
start_row=1;#遍历开始行数 第一行为表头,所以跳过
row=start_row;
while row<cn.nrows:#cn.nrows:cn的行数
    wordset=re.split('  ',cn.cell_value(row,1))#通过split对多个关键词进行分割,放入wordset里
    for word in wordset:   
        dictionary[word]=cn.cell_value(row,0)#将每个关键词到学院全拼的映射存在dictionary字典
    if cn.cell_value(row,0) not in mapping:
        mapping[cn.cell_value(row,0)]=map_number
        map_number=map_number+1#如果学院名不在mapping的key中,则存入,并映射为map_number
    row=row+1

操作完后获得关键词到学院全名的映射和学院全名到编号的映射,之后储存每个学院分别的男女报名人数:

signtable=xlrd.open_workbook(r'联谊活动报名表.xls')#原始表
st=signtable.sheet_by_index(0)
row=start_row;
statistic=np.zeros([len(mapping),6]);#每一行代表一个学院的男生报名数、女生报名数、总报名人数占比、男生占比、女生占比和男女比例 先计算前两列
while row<st.nrows:
    college=st.cell_value(row,9);#或者原始输入的学院名
    find=0;#标记是否找到
    for keyword in dictionary:
        if keyword  in college:#如果dictionary的key中存在关键词是原始输入学院名的子串,则找到
            find=1;#
            statistic[mapping[dictionary[keyword]],int(st.cell_value(row,7)-1)]+=1
            break#将对应学院所在行(mapping映射的值)的第1列或第2列(取决于性别)+1
    if find==0:
        print(college+'can not find')
    row=row+1

然后用plt的饼状图绘制一下饼状图:

import matplotlib.pyplot as plt
labels = [str(i) for i in range((len(mapping)))]
sizes = [(i[0]+i[1])for i in statistic]

plt.pie(sizes, labels=labels, autopct='%1.1f%%',
  shadow=True, startangle=90)
plt.axis('equal') 
plt.show()

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值