Formulario de registro de actividad de análisis, procesamiento y selección de Python

        Recientemente, ha sido relativamente relajado. El departamento ha postulado con éxito para un evento de networking. Se organiza con otras dos universidades con una proporción relativamente alta de niñas. Soy responsable de la preparación del formulario de inscripción. Desde el 13 hasta el presente (1 am del día 19), se han inscrito más de 670 estudiantes y la proporción de hombres y mujeres tiende a ser de 1: 2.

        Parece decir demasiado, porque son los datos reales de la escuela, los datos no se harán públicos, el formulario de registro se hizo con la estrella del cuestionario y se descargó para obtener el formulario de datos original. Hay 8 formularios de registro originales. Se requiere el primer nombre, se requiere el segundo género, se requiere el tercer grado, se requiere la cuarta universidad y se requiere el quinto número de teléfono móvil. La auto-presentación y los requisitos para la otra mitad son Opcional.

        El formato del exce descargado de la estrella del cuestionario es el siguiente:

0 número de serie 1 Hora de enviar la hoja de respuestas 2 veces usado 3 fuentes 4 detalles de la fuente 5 de IP 6Nombre 7 sexo 8 grados 9 escuelas 10 número de teléfono móvil 11 fotos personales 12 autointroducción

13 requisitos para la otra mitad

        Para las 8 preguntas, el nombre, la universidad y el número de teléfono móvil son cadenas no vacías, el sexo y la educación son números, que representan respectivamente los números de serie de las opciones. La foto es el tipo de archivo adjunto. Si se carga, se mostrará como la dirección de la foto, de lo contrario será la cadena '(Vacío)', si se completan la introducción y los requisitos, es la cadena correspondiente, de lo contrario será '(vacío)'.

        En primer lugar, para las universidades, a algunas les gusta escribir abreviaturas y otras escriben la ortografía completa. Por ejemplo, para la Facultad de Cultura y Periodismo, algunas completan "Wen Xin", "Wen Xin College", "Facultad de Cultura y Periodismo" , etc. Para facilitar las estadísticas, es necesario hacer ajustes a los distintos nombres de las universidades ingresados ​​por ellos. Así que ordené manualmente una tabla college_name.xls:

La primera columna es Quanpin, y la segunda columna es la combinación de palabras clave correspondientes a la universidad en sus diversos métodos de llenado.Múltiples espacios están separados por espacios y las palabras clave de diferentes universidades no pueden ser iguales ni contener la relación.

 

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

Una vez que se completa la operación, se obtiene la asignación de palabras clave al nombre completo de la universidad y la asignación del nombre completo de la universidad al número, y luego se almacena la cantidad de solicitantes masculinos y femeninos para cada universidad:

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

Luego use el gráfico circular de plt para dibujar un gráfico circular:

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()

resultado:

Dado que el chino no es compatible de forma predeterminada, la etiqueta de cada bloque se establece en el número del mapeo.

Empiece a escribir la primera tabla, el formato es el siguiente:

0Nombre 1 Tiempo para completar el / los formulario / s 2 universidades 3 género 4 calificaciones académicas 5 número de teléfono móvil 6 Situación de carga de fotos 7 Introducción 8 requisitos

 

import xlwt
workspace=xlwt.Workbook(encoding='ascii')
excel=workspace.add_sheet('报名表完整版',cell_overwrite_ok=True)#添加第一张表
excel.write(0,0,'姓名')
excel.write(0,1,'填表时长/s')
excel.write(0,2,'学院')
excel.write(0,3,'性别')
excel.write(0,4,'学历')
excel.write(0,5,'手机号码')
excel.write(0,6,'照片上传情况')
excel.write(0,7,'介绍')
excel.write(0,8,'要求')#第一行添加表头
for row in range(1,st.nrows):
    excel.write(row,0,st.cell_value(row,6))#写入姓名
    excel.write(row,1,st.cell_value(row,2)[0:-1])#原始数据为'xxx秒',为了方便以后筛选,在这去掉最后一个字符,故设置为取0:-1
    temp_college=st.cell_value(row,9)#原始学院名输入
    for keyword in dictionary:
        if keyword  in temp_college:
            excel.write(row,2,dictionary[keyword])#将在字典中查到的完整学院名写入
    excel.write(row,3,st.cell_value(row,7))#写入性别
    excel.write(row,4,st.cell_value(row,8))#写入学历
    excel.write(row,5,st.cell_value(row,10))#写入手机号码
    if st.cell_value(row,11)=='(空)':#如果照片未上传,则写为0,否则写入1
        excel.write(row,6,0)
    else:
        excel.write(row,6,1)
    excel.write(row,7,st.cell_value(row,12))#写入介绍
    excel.write(row,8,st.cell_value(row,13))#写入要求

De la misma forma, haz una segunda tabla para publicar en el grupo en ese momento, para que puedan coincidir según el contenido de la tabla, de modo que el número de teléfono móvil y el género estén parcialmente ocultos. Para la conveniencia de la lectura, use jieba para extraer las palabras centrales de la introducción y los requisitos escritos por ellos:

import jieba.posseg as posseg
excel2=workspace.add_sheet('报名表简洁版',cell_overwrite_ok=True)    
excel2.write(0,0,'姓名')
excel2.write(0,1,'填表时长/s')
excel2.write(0,2,'学院')
excel2.write(0,3,'性别')
excel2.write(0,4,'学历')
excel2.write(0,5,'手机号码')
excel2.write(0,6,'照片上传情况')
excel2.write(0,7,'介绍')
excel2.write(0,8,'要求')

word_type=['n','nz','ns','vn','v','a','an']#保留的词性
for row in range(1,st.nrows):
    temp_name=st.cell_value(row,6)
    if len(temp_name)==2:
        write_name=temp_name[0]+'*'
    elif len(temp_name)==3:
        write_name=temp_name[0]+'*'+temp_name[2]
    else:
        write_name=temp_name[0]+'**'+temp_name[3]
    excel2.write(row,0,write_name)#对姓名的第一个字改为*,四字名字的第二三个字改为*
    excel2.write(row,1,st.cell_value(row,2)[0:-1])
    temp_college=st.cell_value(row,9)
    for keyword in dictionary:
        if keyword  in temp_college:
            excel2.write(row,2,dictionary[keyword])
    excel2.write(row,3,st.cell_value(row,7))
    excel2.write(row,4,st.cell_value(row,8))
    excel2.write(row,5,str(st.cell_value(row,10)[:3])+'****'+str(st.cell_value(row,10)[-4:]))#手机号码的中间四位改为*
    if st.cell_value(row,11)=='(空)':
        excel2.write(row,6,0)
    else:
        excel2.write(row,6,1)
    words_info = posseg.cut(st.cell_value(row,12))
    words_demm = posseg.cut(st.cell_value(row,13))#对他们的介绍和要求进行词性切分
    info=''
    demm=''
    for word, flag in words_info:
        if flag in word_type:
            info+=word#遍历切分后的每一个词word和他的词性flag,如果词性满足要求,则添加改词
    for word, flag in words_demm:
        if flag in word_type:
            demm+=word
    excel2.write(row,7,info)
    excel2.write(row,8,demm)

Algunas partes del discurso relacionadas son las siguientes:

a adjetivo
un Sustantivos
D adverbio
mi interjección
metro Cuantificador
norte sustantivo
ns Ponga su nombre
no Nombre personal
Nuevo Testamento Nombre de la Organización
Nueva Zelanda Otros nombres
v verbo
vn Gerundio

Calcule las 3-6 columnas de estadística y escríbalas en la tercera tabla como las estadísticas de datos escritas para cada universidad:

excel3=workspace.add_sheet('数据统计',cell_overwrite_ok=True)
excel3.write(0,0,'学院名')
excel3.write(0,1,'报名人数')
excel3.write(0,2,'总占比')
excel3.write(0,3,'男生报名数')
excel3.write(0,4,'男生占比')
excel3.write(0,5,'女生报名数')
excel3.write(0,6,'女生占比')
excel3.write(0,7,'男女比例')
number=1
for college in mapping:
    excel3.write(number,0,college)#第三张表写入学院名
    boy=statistic[mapping[college],0];#获得该学院男生报名数,之前计算得
    girl=statistic[mapping[college],1];
    print(college+'总报名人数'+str(boy+girl))
    excel3.write(number,1,str(boy+girl))#第二列写入总数
    excel3.write(number,3,str(boy))#第四列写入男生人数
    excel3.write(number,5,str(girl))#第六列写入女生人数
    statistic[mapping[college],2]=round((boy+girl)/st.nrows,5)#储存数据在变量statistic里
    print('占'+str(statistic[mapping[college],2]))
    statistic[mapping[college],3]=round(boy/191,3)#
    statistic[mapping[college],4]=round(girl/384,3)
    if girl==0:
        girl=1#在计算男女比例时可能出现分母(女生为0)的情况,故设置为1
    statistic[mapping[college],5]=round(boy/girl,3)
    excel3.write(number,2,str(100*statistic[mapping[college],2])+'%')#分别百分数写入占比
    excel3.write(number,4,str(100*statistic[mapping[college],3])+'%')
    excel3.write(number,6,str(100*statistic[mapping[college],4])+'%')
    excel3.write(number,7,str(statistic[mapping[college],5]))
    print('男生占'+str(statistic[mapping[college],3]))
    print('女生占'+str(statistic[mapping[college],4]))
    print('男女比例'+str(statistic[mapping[college],5]))   
    number+=1

Finalmente guarde la tabla (contiene el excel, excel2, excel3 recién escrito)

workspace.save('报名表.xls')

Código completo:

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 16 17:20:04 2019

@author: 71405
"""

import xlrd
import re
import numpy as np
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:行数
    wordset=re.split('  ',cn.cell_value(row,1))
    for word in wordset:   
        dictionary[word]=cn.cell_value(row,0)
    if cn.cell_value(row,0) not in mapping:
        mapping[cn.cell_value(row,0)]=map_number
        map_number=map_number+1
    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:
            find=1;
            statistic[mapping[dictionary[keyword]],int(st.cell_value(row,7)-1)]+=1
            break
    if find==0:
        print(college+'can not find')
    row=row+1
    
 
    
    
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()

import jieba.posseg as posseg
import xlwt
workspace=xlwt.Workbook(encoding='ascii')
excel=workspace.add_sheet('报名表完整版',cell_overwrite_ok=True)
excel.write(0,0,'姓名')
excel.write(0,1,'填表时长/s')
excel.write(0,2,'学院')
excel.write(0,3,'性别')
excel.write(0,4,'学历')
excel.write(0,5,'手机号码')
excel.write(0,6,'照片上传情况')
excel.write(0,7,'介绍')
excel.write(0,8,'要求')
for row in range(1,st.nrows):
    excel.write(row,0,st.cell_value(row,6))
    excel.write(row,1,st.cell_value(row,2)[0:-1])
    temp_college=st.cell_value(row,9)
    for keyword in dictionary:
        if keyword  in temp_college:
            excel.write(row,2,dictionary[keyword])
    excel.write(row,3,st.cell_value(row,7))
    excel.write(row,4,st.cell_value(row,8))
    excel.write(row,5,st.cell_value(row,10))
    if st.cell_value(row,11)=='(空)':
        excel.write(row,6,0)
    else:
        excel.write(row,6,1)
    excel.write(row,7,st.cell_value(row,12))
    excel.write(row,8,st.cell_value(row,13))
excel2=workspace.add_sheet('报名表简洁版',cell_overwrite_ok=True)    
excel2.write(0,0,'姓名')
excel2.write(0,1,'填表时长/s')
excel2.write(0,2,'学院')
excel2.write(0,3,'性别')
excel2.write(0,4,'学历')
excel2.write(0,5,'手机号码')
excel2.write(0,6,'照片上传情况')
excel2.write(0,7,'介绍')
excel2.write(0,8,'要求')

word_type=['n','nz','ns','vn','v','a','an']
for row in range(1,st.nrows):
    temp_name=st.cell_value(row,6)
    if len(temp_name)==2:
        write_name=temp_name[0]+'*'
    elif len(temp_name)==3:
        write_name=temp_name[0]+'*'+temp_name[2]
    else:
        write_name=temp_name[0]+'**'+temp_name[3]
    excel2.write(row,0,write_name)
    excel2.write(row,1,st.cell_value(row,2)[0:-1])
    temp_college=st.cell_value(row,9)
    for keyword in dictionary:
        if keyword  in temp_college:
            excel2.write(row,2,dictionary[keyword])
    excel2.write(row,3,st.cell_value(row,7))
    excel2.write(row,4,st.cell_value(row,8))
    excel2.write(row,5,str(st.cell_value(row,10)[:3])+'****'+str(st.cell_value(row,10)[-4:]))
    if st.cell_value(row,11)=='(空)':
        excel2.write(row,6,0)
    else:
        excel2.write(row,6,1)
    words_info = posseg.cut(st.cell_value(row,12))
    words_demm = posseg.cut(st.cell_value(row,13))
    info=''
    demm=''
    for word, flag in words_info:
        if flag in word_type:
            info+=word
    for word, flag in words_demm:
        if flag in word_type:
            demm+=word
    excel2.write(row,7,info)
    excel2.write(row,8,demm)
    
excel3=workspace.add_sheet('数据统计',cell_overwrite_ok=True)
excel3.write(0,0,'学院名')
excel3.write(0,1,'报名人数')
excel3.write(0,2,'总占比')
excel3.write(0,3,'男生报名数')
excel3.write(0,4,'男生占比')
excel3.write(0,5,'女生报名数')
excel3.write(0,6,'女生占比')
excel3.write(0,7,'男女比例')
number=1
for college in mapping:
    excel3.write(number,0,college)
    boy=statistic[mapping[college],0];
    girl=statistic[mapping[college],1];
    print(college+'总报名人数'+str(boy+girl))
    excel3.write(number,1,str(boy+girl))
    excel3.write(number,3,str(boy))
    excel3.write(number,5,str(girl))
    statistic[mapping[college],2]=round((boy+girl)/st.nrows,5)
    print('占'+str(statistic[mapping[college],2]))
    statistic[mapping[college],3]=round(boy/191,3)
    statistic[mapping[college],4]=round(girl/384,3)
    if girl==0:
        girl=1
    statistic[mapping[college],5]=round(boy/girl,3)
    excel3.write(number,2,str(100*statistic[mapping[college],2])+'%')
    excel3.write(number,4,str(100*statistic[mapping[college],3])+'%')
    excel3.write(number,6,str(100*statistic[mapping[college],4])+'%')
    excel3.write(number,7,str(statistic[mapping[college],5]))
    print('男生占'+str(statistic[mapping[college],3]))
    print('女生占'+str(statistic[mapping[college],4]))
    print('男女比例'+str(statistic[mapping[college],5]))   
    number+=1
workspace.save('报名表.xls')

——————————————————————— Yo soy la línea divisoria ————————————————————— - —————

Una vez finalizado el análisis y el procesamiento, debido a la gran cantidad de solicitantes, cuando era imposible seleccionar uno por uno, se redactó un algoritmo de selección:

Controlado por cuatro condiciones: la cantidad de tiempo para completar el formulario, si subir fotos, si escribir una introducción y si escribir requisitos. Generalmente, los datos de estas cuatro dimensiones pueden indicar si el estudiante es entusiasta y serio sobre la actividad. Por ejemplo, un estudiante usó 20s. Después de completar el llenado, ninguno de los tres campos que se pueden completar está completado, lo cual es demasiado garabateado. Algunos estudiantes escribieron mucho contenido y subieron fotos. El tiempo de llenado es más de 100 segundos (el tiempo de llenado más largo de los datos es 2600 s, que probablemente sea más de 20 minutos, ¡mírelo seriamente!).


import xlrd
import xlwt
workspace=xlwt.Workbook(encoding='ascii')
excel=workspace.add_sheet('报名表筛选版',cell_overwrite_ok=True)
select_list=[1,1,1,1]#分别代表时间/照片/介绍/要求为空时是否筛选
col_num=[1,6,7,8]#四个属性所在列号
time_thre=100#阈值

table=xlrd.open_workbook(r'报名表.xls')#打开之前所写入完成的表的第一张
t=table.sheet_by_index(0)

remain=1#保留的行号
for i in range(t.ncols):#t.ncols:t的列数
    excel.write(0,i,t.cell_value(0,i))#老规矩,第一行复制表头
    
for row in range(1,t.nrows):
    state=True#表示是否保留
    if select_list[0]==1:
        if int(t.cell_value(row,col_num[0]))<time_thre:
            state=False#填写时长小于阈值的置为不保留
    for i in range(1,4):
        if select_list[i]==1:#是否分别开启照片/介绍/要求非空筛选
            if t.cell_value(row,col_num[i])=='0' or  t.cell_value(row,col_num[i])==0  or t.cell_value(row,col_num[i])=='(空)'  or t.cell_value(row,col_num[i])=='无':
                state=False#如果对应字符串为无、空、0的任意字符,则不保留
    if state:
        for i in range(t.ncols):
            excel.write(remain,i,t.cell_value(row,i))#如果以上都通过了则写入新表
        remain+=1
        
workspace.save('报名表筛选版.xls')

 

Supongo que te gusta

Origin blog.csdn.net/qq_36614557/article/details/103134597
Recomendado
Clasificación