用Python 统计、分析2020年江苏省事业单位招聘岗位 Excel 表格信息

前言:

前面已经介绍了两个 Python xlrd、xlwt 模块处理 Excel 表格文件的实例,一个是侧重简单的文件读取、写入:给已有Excel表格添加序号、增加新列 ,另一个是侧重多个 Excel 表格文件的信息收集整个:汇总,分析大学校运会报名 Excel 表格

这篇博客将介绍第三个用 Python 处理 Excel 表格的实例,侧重于用 xlrd 模块 读取 Excel 表格数据 ,并 对数据进行统计分析

需求:

在工作中,经常会遇到许多 数据量、信息特别多的 Excel 表格 ,当想要从这些表格中查找数据,或进行数据统计及分析工作时,Excel 表格软件提供的功能可能就有点力不从心了。

如需对【江苏省2020年省属事业单位统一公开招聘岗位表】进行一定的数据统计、分析工作。

表格文件预览:( 表格下载链接

在这里插入图片描述
上面表格大概有600条左右的数据,其实数据量也不太多,当遇到有成千上万条的Excel表格数据时,单用Excel表格提供的功能来统计分析数据,就更显吃力了。

模拟案例:统计、分析2020年江苏省事业单位招聘岗位表格信息

总体需求:

  1. 数据读取:获取表格数据,并对数据进行整理;
  2. 基础统计:A: 总招聘岗位数,总招聘人数,岗位最大、最小招聘人数;B: 岗位招聘人数分布情况:即招聘人数为1、2…的单位个数;C: 招聘对象为社会人员、应届毕业生、不限的各自数量,及所占比例。
  3. 按条件查找分析数据:A:专业为计算机相关专业,招聘对象为应届毕业生的所有招聘信息;B:统计条件下招聘的岗位数,招聘人数,及两者在全部招聘信息中所占比例;C: 统计条件下学历要求情况:中专,大专,本科,硕士,博士 招聘岗位数,招聘人数、占比。
  4. 综合分析:A: 统计各主管部门招聘人数,占总招聘人数比例;B: 分析最大、最小招聘人数的部门是哪个;C: 分析每个主管部门招聘对象为:社会人员、应届毕业生、不限 的人数,及其内部比例。
  5. 保存数据: 将上面分析数据写入新建的Excel 表格,方便阅读。

主要思路及实现代码:

1、读取、整理数据:

获取满足后续分析工作要求的数据,是每项数据分析工作的先决条件,这就依赖以数据读取和整理。

用 xlrd 模块读取文件数据:

import xlrd
import xlwt

work_book = xlrd.open_workbook('sample3.xls')
sheet = work_book.sheet_by_index(1)  # 注意下载的文件有隐藏的一个sheet表单
all_data = sheet._cell_values[3:]  # 按行读取表格数据

打印下数据:

for ds in all_data:
    print(ds)

打印截图:

在这里插入图片描述
从上面的截图可以看到,按行读取时,数据内容并不完整,这是因为表格文件中合并单元格的关系:

在这里插入图片描述
数据整理:

因为单元格合并的关系,读取到的数据并不完整,所以就要对数据进行整理。Python的数据分析模块 pandas 里的 DataFrame 数据结构有一个向上查找填充缺失值的方法,因还未介绍过 pandsa 模块,所以来 写一个函数,模拟向上查找填充缺失值方法,并对数据进行整理:

# 向上查找数据函数
def fill(i,j,data_list):
    up_index = i -1
    for c in range(i):
        if data_list[up_index][j] != '':
            return data_list[up_index][j]
        else:
            up_index -= 1

# 模拟pandas里DataFrame对象中向前填充的功能:
for i,ds in enumerate(all_data):
    for j,d in enumerate(ds):
        if d == '':
            ds[j] = fill(i,j,all_data)

# 打印数据:
for ds in all_data:
    print(ds)

打印截图:

在这里插入图片描述
从上面的截图可以看出数据被补充完整了。

2、数据基础分析:

需求:

  1. 总招聘岗位数,总招聘人数,岗位最大、最小招聘人数;
  2. 岗位招聘人数分布情况:即招聘人数为1、2…的单位个数;
  3. 招聘对象为社会人员、应届毕业生、不限的各自数量,及所占比例。

获取数据并整理后就可以进行数据分析工作了,来一个个的实现上述数据基础分析的需求:

1、总招聘岗位数,总招聘人数,岗位最大、最小招聘人数:

# 招聘岗位数
total_post = len(all_data)
print(total_post)  # 580
# 总招聘人数
total_employs = sum([int(ds[9]) for ds in all_data])
print(total_employs)  # 708
# 最大的招聘人数
max_employ = max([int(ds[9]) for ds in all_data])
print(max_employ) # 10
# 最小招聘人数
min_employ = min([int(ds[9]) for ds in all_data])
print(min_employ)  # 1

上面的代码,计算出:总招聘岗位数为580个,总招聘人数为708个,岗位最多、最少招聘人数分别为:10,1。

整个江苏省事业单位才招聘708个,好像不是特别多的样子…

2、岗位招聘人数分布情况:

# 分析岗位招聘人数分布情况
# 先获取有多少招聘个数种类
number_employ = set([int(ds[9]) for ds in all_data])
print(number_employ)  # {1, 2, 3, 4, 5, 7, 9, 10}
# 获取每个招聘数量的岗位数量
# 建立字典
ne_dict = {key:0 for key in number_employ}
print(ne_dict)
# {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 7: 0, 9: 0, 10: 0}

for ds in all_data:
    if ds[9] in ne_dict.keys():
        ne_dict[ds[9]] += 1

print(ne_dict)
# {1: 497, 2: 61, 3: 15, 4: 2, 5: 2, 7: 1, 9: 1, 10: 1}

上面的代码统计出:招聘人数为1的岗位有497个,人数为2的有61个,人数为3的有15个,人数为4和5的有2个,招聘人数为7、9、10个的岗位都只有一个。

3、招聘对象为社会人员、应届毕业生、不限的各自数量,及所占比例:

# 分析招聘对象数据
# 建立不同招聘对象数量数据
employ_type = {'社会人员': [0,0] ,'应届毕业生': [0,0] ,'不限': [0,0]}

# 遍历所有招聘信息将对应的招聘人数统计至建立的招聘对象数据信息
for ds in all_data:
    if ds[13] in employ_type.keys():
        employ_type[ds[13]][0] += int(ds[9])

# 计算占比
sum_employ = sum([employ_type['社会人员'][0],
                  employ_type['应届毕业生'][0],
                  employ_type['不限'][0],
                  ])
for vs in employ_type.values():
    vs[1] = str(round(vs[0]/sum_employ * 100,2)) + '%'

print(employ_type)  # 打印统计数据
# 打印结果
# {'社会人员': [105, '14.83%'], '应届毕业生': [517, '73.02%'], '不限': [86, '12.15%']}

社会招聘人员为105,14.83 % ,应届毕业生招聘数量为 517 ,73.02 % 。

3、按条件查找分析数据:

需求:

  1. 专业为计算机相关专业,招聘对象为应届毕业生的所有招聘信息;
  2. 统计条件下招聘的岗位数,招聘人数,及两者在全部招聘信息中所占比例;
  3. 统计条件下学历要求情况:中专,大专,本科,硕士,博士 招聘岗位数,招聘人数、占比。

1、先按查找条件,筛选出对应数据:

# 联合查找,有多个条件:
s1_data = [data for data in all_data
           if '计算机' in data[12] and data[13] == '应届毕业生']
# 测试查找数据
for ds in s1_data:
    print(ds)

打印截图:

在这里插入图片描述
2、统计条件下招聘的岗位数,招聘人数,及两者在全部招聘信息中所占比例:

# 招聘岗位数、招聘人数
s1_post,s1_employs = len(s1_data),sum([int(data[9])
                                         for data in s1_data])
print(s1_post,s1_employs)  
# 打印结果:
# 60 75
# 招聘岗位数、人数在全部招聘信息中占比
s1_post_ratio,s1_employs_ratio = (round(s1_post/total_post * 100, 2),
                                  round(s1_employs/total_employs * 100, 2))
print(s1_post_ratio,s1_employs_ratio)  
# 打印结果:
# 10.34 10.59

计算机相关专业、应届毕业生的招聘岗位数为60,招聘人数为75,在所有的招聘岗位和总招聘人数中的比例分别为:10.34 %, 10.59 %。

3、统计条件下学历要求情况:

# 统计学历要求情况:招聘岗位数,招聘人数
s1_academic = {'中专': [0,0], '大专': [0,0], '本科': [0,0],
               '硕士': [0,0], '博士': [0,0]}
for data in s1_data:
    for key in s1_academic.keys():
        if key in data[11]:
            s1_academic[key][0] += 1
            s1_academic[key][1] += int(data[9])

# 统计占比情况:
for value in s1_academic.values():
    value.append(round(value[0]/s1_post* 100, 2))
    value.append(round(value[1]/s1_employs* 100, 2))

print(s1_academic)  # 打印数据

# ------运行结果------
# {'中专': [0, 0, 0.0, 0.0], '大专': [6, 7, 10.0, 9.33], 
# '本科': [24, 29, 40.0, 38.67], '硕士': [29, 38, 48.33, 50.67],
# '博士': [1, 1, 1.67, 1.33]}
# ------运行结果------

注:这里招聘岗位的学历要求,统计的是岗位最低的学历要求。
不招聘中专的,大专招聘7个,占比9.33 %,本科招聘 29 个,占比 38.67 %,硕士招聘 38 个,占比 50.67 %,博士招聘 1个。

4、综合分析:

需求:

  1. 统计各主管部门招聘人数,占总招聘人数比例;
  2. 分析最大、最小招聘人数的部门是哪个;
  3. 分析每个主管部门招聘对象为:社会人员、应届毕业生、不限 的人数,及其内部比例。

1、统计各主管部门招聘人数,占总招聘人数比例:

先获取招聘的主管部门:

# 分析各个主管部门招聘人数
# 统计招聘的主管部门
manages = set([i[1] for i in all_data ])
print(manages) # 打印获取数据

# {'江苏省卫生健康委员会', '江苏省应急管理厅', '江苏省文化和旅游厅',
# '江苏省委老干部局', '江苏省委党校', '江苏省委办公厅', '江苏省人力资源和社会保障厅',
# '江苏省地方志办公室', '江苏省社会科学院', '江苏省人民政府外事办公室', '江苏省科学技术厅',
# '江苏省住房和城乡建设厅', '江苏省委统战部', '江苏省交通运输厅', '江苏省发展和改革委员会',
# '江苏省市场监督管理局', '江苏省商务厅', '中国民用航空江苏安全监督管理局', '江苏省总工会', '
# 江苏省地方金融监督管理局', '江苏省统计局', '江苏省工业和信息化厅', '江苏省人民防空办公室',
# '江苏省文学艺术界联合会', '江苏省供销合作总社', '江苏省残疾人联合会', '江苏省政务服务管理办公室',
# '江苏省农业科学院', '江苏省退役军人事务厅', '江苏省设备成套有限公司', '江苏省机关事务管理局',
# '江苏省纪委监委机关', '江苏省公安厅', '江苏省科学技术协会', '江苏省中国科学院植物研究所',
# '江苏省药品监督管理局', '江苏省体育局', '江苏省教育厅', '江苏省生态环境厅', '江苏省民政厅',
# '江苏省档案馆', '江苏省水利厅', '江苏省作家协会', '江苏省政协办公厅', '江苏省人大常委会办公厅',
# '江苏省委宣传部', '江苏省财政厅', '江苏省通信管理局'}

建立初始数据,统计数据:

# 建立主管部门招聘人数数据
employ_manages = {key:[0,0,0,0,0] for key in manages}
# 统计数据
for ds in all_data:
    if ds[1] in employ_manages.keys():
        employ_manages[ds[1]][0] += int(ds[9])

# 计算比例
for key in employ_manages.keys():
    employ_manages[key][1] = round(employ_manages[key][0] / total_employs*100,2)

print(employ_manages)

解析:

这里的部门统计信息:employ_manages = {key:[0,0,0,0,0] for key in manages}
字典键为部门名称
值为列表,列表对应的数据为:[招聘人数,占比 % ,社会人员招聘人数,应届毕业生人数,不限人数]

部分数据截图:
在这里插入图片描述

2、分析最大、最小招聘人数部门:

# 先查找部门最大招聘人数与最小招聘人数
max_me = max([employ_manages[key][0] for key in employ_manages.keys()])
min_me = min([employ_manages[key][0] for key in employ_manages.keys()])
print(max_me,min_me) # 186 1 
# 查找最大招聘人数、最小招聘人数部门, 可能有多个
max_manages = [key for key in employ_manages.keys()
               if employ_manages[key][0] == max_me]
min_manages = [key for key in employ_manages.keys()
               if employ_manages[key][0] == min_me]
print(max_manages,min_manages)
# 打印结果:
# ['江苏省卫生健康委员会'] ['江苏省委统战部', '江苏省通信管理局', '江苏省中国科学院植物研究所', '江苏省商务厅', '江苏省档案馆', '江苏省设备成套有限公司']

按主管部门分,最大的招聘人数居然招了 186 个为:江苏省卫生健康委员会。可能也是因为疫情原因吧…

3、分析每个主管部门招聘对象:

分析每个主管部门招聘对象为:社会人员、应届毕业生、不限 的人数,及其内部比例。

# 统计各部门招聘 社会人员、应届毕业生、不限 人员数量
e_type = ['社会人员','应届毕业生','不限']

for ds in all_data:
    for key in employ_manages.keys():
        if key == ds[1]:
            for i,type_ in enumerate(e_type):
                if ds[13] == type_:
                    employ_manages[key][2+i] += int(ds[9])

# 计算内部占比:
for value in employ_manages.values():
    for i in range(2,5):
        value.append(round(value[i]/value[0]*100,2))

print(employ_manages)

部分数据截图:

在这里插入图片描述

5、保存数据

上面已经完成了数据的提取和分析工作,但是在阅读分析数据方面就不太方便了,现在还没介绍数据可视化的方法,所有就先把数据写入Excel表格:

# 新建Excel文件、写入数据
# 整理统计分析数据:基础数据
info1 = {'总招聘岗位数':total_post,
             '总招聘人数':total_employs,
             '最大招聘人数':max_employ,
             '最小招聘人数':min_employ}

# 新建Excel表格 写入分析数据:
new_work = xlwt.Workbook()  # 新建Excel工作簿
new_sheet = new_work.add_sheet('统计分析数据') # 创建sheet表
# 写入数据:
new_sheet.write_merge(0,0,0,5,'江苏省2020年事业单位招聘岗位表分析结果')
# 写入基础分析数据
row_no = 1
for key,value in info1.items():
    new_sheet.write(row_no,0,key)
    new_sheet.write(row_no,1,value)
    row_no += 1

# 岗位人数分布情况:
new_sheet.write_merge(row_no+1,row_no+1,0,2,'岗位招聘人数分布情况:')
new_sheet.write(row_no+2,0,'招聘人数')
new_sheet.write(row_no+2,1,'岗位数量')
row_no += 3
for key,value in ne_dict.items():
    new_sheet.write(row_no,0,key)
    new_sheet.write(row_no,1,value)
    row_no += 1

# 写入社招、应届毕业生招聘人数及比例数据
new_sheet.write_merge(row_no+1,row_no+1,0,3,'招聘对象分布及比例:')
new_sheet.write(row_no+2,0,'招聘对象')
new_sheet.write(row_no+2,1,'招聘数量')
new_sheet.write(row_no+2,2,'百分比(%)')
row_no += 3
for key,value in employ_type.items():
    new_sheet.write(row_no,0,key)
    new_sheet.write(row_no,1,value[0])
    new_sheet.write(row_no, 2, value[1])
    row_no += 1

# 计算机相关专业、应届毕业生招聘情况数据
info2 = {'招聘岗位数':[s1_post,s1_post_ratio],
         '招聘人数':[s1_employs,s1_employs_ratio]}

new_sheet.write_merge(row_no+1,row_no+1,0,3,'计算机相关专业应届毕业生招聘信息分析')
new_sheet.write(row_no+2,0,'项目')
new_sheet.write(row_no+2,1,'数量')
new_sheet.write(row_no+2,2,'百分比(%)')
row_no += 3
for key,value in info2.items():
    new_sheet.write(row_no,0,key)
    new_sheet.write(row_no,1,value[0])
    new_sheet.write(row_no, 2, value[1])
    row_no += 1

# 学历分布情况:
new_sheet.write_merge(row_no+1,row_no+1,0,3,'学历分布信息:')
new_sheet.write(row_no+2,0,'最低学历')
new_sheet.write(row_no+2,1,'岗位数')
new_sheet.write(row_no+2,2,'招聘人数')
new_sheet.write(row_no+2,3,'岗位数百分比')
new_sheet.write(row_no+2,4,'人数百分比')
row_no += 3
for key,value in s1_academic.items():
    new_sheet.write(row_no,0,key)
    new_sheet.write(row_no,1,value[0])
    new_sheet.write(row_no, 2, value[1])
    new_sheet.write(row_no, 3, value[2])
    new_sheet.write(row_no, 4, value[3])
    row_no += 1

# 综合分析数据
new_sheet2 = new_work.add_sheet('部门招聘信息分析')
new_sheet2.write_merge(0,0,0,5,'招聘岗位表部门招聘信息分析结果')
row_label = ['主管部门','招聘人数','占比(%)','招聘社会人员数量',
             '招聘应届毕业生数量','不限人员数量',
             '社会人员比例','应届毕业生比例','不限比例']

for col,label in enumerate(row_label):
    new_sheet2.write(1,col,label)

row_no2 = 2

for key,value in employ_manages.items():
    new_sheet2.write(row_no2,0,key)
    for col,v in enumerate(value):
        new_sheet2.write(row_no2,col+1,v)
    row_no2 += 1

# 保存文件
new_work.save('analysis_info.xls')

保存的Excel文件信息如下:

基础分析数据:

在这里插入图片描述
综合分析数据:

在这里插入图片描述

结尾

以上就是本篇博客所有内容,其实重点还是在数据的分析上。读取数据,和写入数据其实都比较简单。这篇博客也是 Python 与 Excel 表格最后一篇内容了,感谢阅读。

【Python与Excel表格】专栏

着重介绍 Python xlwt、xlrd 等模块操作 Excel 表格文件的方法,也会搭配一些实例演练,强化所讲知识点的理解与运用。
感兴趣的朋友,可以点个关注或收藏。 创作不易,你的支持是我最大的动力,感谢 !

猜你喜欢

转载自blog.csdn.net/zhouz92/article/details/106978058