最近比较清闲,部门竞标成功了一个联谊活动,和其他两个女生比例比较高的学院一起承办,我是负责报名表的制作,从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()
结果:

最低0.47元/天 解锁文章
5817

被折叠的 条评论
为什么被折叠?



