用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 表格文件的方法,也會搭配一些實例演練,強化所講知識點的理解與運用。
感興趣的朋友,可以點個關注或收藏。 創作不易,你的支持是我最大的動力,感謝 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章