五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

python數(shù)據(jù)可視化自制職位分析生成崗位分析數(shù)據(jù)報(bào)表

發(fā)布日期:2021-12-31 00:03 | 文章來(lái)源:CSDN

為什么要進(jìn)行職位分析?職位分析是人力資源開(kāi)發(fā)和管理的基礎(chǔ)與核心,是企業(yè)人力資源規(guī)劃、招聘、培訓(xùn)、薪酬制定、績(jī)效評(píng)估、考核激勵(lì)等各項(xiàng)人力資源管理工作的依據(jù)。其次我們可以根據(jù)不同崗位的職位分析,可視化展示各崗位的數(shù)據(jù)分析報(bào)告。

首先我們來(lái)看看分析展示的效果:

下面,我們開(kāi)始介紹這個(gè)小工具的制作過(guò)程。

1. 核心功能設(shè)計(jì)

總體來(lái)說(shuō),我們的這款職位分析器可以通過(guò)輸入崗位關(guān)鍵字和崗位條數(shù),自動(dòng)爬取相關(guān)崗位的數(shù)據(jù),并對(duì)爬蟲(chóng)的崗位可視化表格展示。然后分析這些崗位數(shù)據(jù)的公司類型規(guī)模,對(duì)學(xué)歷要求,薪資分布等。

拆解需求,大致可以整理出核心功能如下:

可視化展示崗位表格數(shù)據(jù)

通過(guò)輸入的崗位關(guān)鍵字和獲取條數(shù),自動(dòng)爬取職位數(shù)據(jù)對(duì)爬蟲(chóng)的職位原始數(shù)據(jù)進(jìn)行清洗讀取展示清洗后的職位數(shù)據(jù)

分析崗位薪資情況

根據(jù)工作年限及對(duì)應(yīng)平均薪資,繪制工作經(jīng)驗(yàn)?zāi)晗藓托劫Y折線圖統(tǒng)計(jì)匯總薪資分布區(qū)間,了解該崗位薪資情況,展示薪資分布直方圖

分析崗位公司情況

展示崗位中公司類型分布情況,包含民營(yíng)企業(yè)、合資、上市、外企等等展示公司規(guī)模人數(shù)分布情況,包含少于50人,50-150,150-500等等統(tǒng)計(jì)崗位對(duì)于學(xué)歷的要求

數(shù)據(jù)分析導(dǎo)出

對(duì)于可視化數(shù)據(jù)進(jìn)行彈窗預(yù)覽,并將數(shù)據(jù)導(dǎo)出保存

基本的核心功能確定,下面我們我們首先開(kāi)始GUI設(shè)計(jì)。

2. GUI設(shè)計(jì)與實(shí)現(xiàn)

基于功能點(diǎn),我們可以先考慮進(jìn)行簡(jiǎn)單的UE布局設(shè)計(jì),然后再通過(guò)GUI開(kāi)發(fā)庫(kù)進(jìn)行設(shè)計(jì),這里采用的是tkinker,主要是簡(jiǎn)單方便。

基于UI設(shè)計(jì),我們gui設(shè)計(jì)編碼如下:

# 創(chuàng)建主窗口
root = Tk()
root.title('職位查詢分析數(shù)據(jù)平臺(tái) -- Dragon少年')
# 設(shè)置窗口大小
root.minsize(1380, 730)
root.resizable(False, False)
#得到屏幕寬度
sw = root.winfo_screenwidth()
#得到屏幕高度
sh = root.winfo_screenheight()
ww = 1380
wh = 730
x = (sw-ww) / 2
y = (sh-wh) / 2
root.geometry("%dx%d+%d+%d" %(ww,wh,x,y))
frame_left_top = Frame(width=1050, height=400)
frame_right_top = Frame(width=320, height=400)
# 定義列表區(qū)域
tree = ttk.Treeview(frame_left_top, show="headings", height=18,
  columns=("n", "a", "b", "c", "d", "e", "f", "g", "h"))
vbar = ttk.Scrollbar(frame_left_top, orient=VERTICAL, command=tree.yview)
# 定義樹(shù)形結(jié)構(gòu)與滾動(dòng)條
tree.configure(yscrollcommand=vbar.set)
# 表格的標(biāo)題
tree.column("n", width=60, anchor="center")
tree.column("a", width=180, anchor="center")
tree.column("b", width=200, anchor="center")
tree.column("c", width=100, anchor="center")
tree.column("d", width=100, anchor="center")
tree.column("e", width=80, anchor="center")
tree.column("f", width=100, anchor="center")
tree.column("g", width=90, anchor="center")
tree.column("h", width=90, anchor="center")
tree.heading("n", text="序號(hào)")
tree.heading("a", text="崗位名稱")
tree.heading("b", text="公司名稱")
tree.heading("c", text="公司類型")
tree.heading("d", text="公司規(guī)模")
tree.heading("e", text="學(xué)歷")
tree.heading("f", text="工作經(jīng)驗(yàn)")
tree.heading("g", text="最低工資(k)")
tree.heading("h", text="最高工資(k)")
tree.grid(row=0, column=0, sticky=NSEW)
vbar.grid(row=0, column=1, sticky=NS)
# 整體區(qū)域定位
frame_left_top.grid(row=0, column=0, padx=4, pady=5)
frame_right_top.grid(row=0, column=1, padx=2, pady=2)
frame_left_top.grid_propagate(0)
frame_right_top.grid_propagate(0)
type_str=StringVar()
#設(shè)置滾動(dòng)窗口文本
habits = tk.LabelFrame(root, text="公司類型", padx=10, pady=4 )  # 水平,垂直方向上的邊距均為 10
habits.place(x=1035, y=170)
habits_Window = Label(habits, textvariable=type_str, width=30, height=10,  font=('楷體', 12))
habits_Window.grid()
size_str=StringVar()
#設(shè)置滾動(dòng)窗口文本
company_size = tk.LabelFrame(root, text="公司規(guī)模", padx=10, pady=4 )  # 水平,垂直方向上的邊距均為 10
company_size.place(x=1035, y=370)
company_size_Window = Label(company_size, textvariable=size_str, width=30, height=8,  font=('楷體', 12))
company_size_Window.grid()
edu_str=StringVar()
#設(shè)置滾動(dòng)窗口文本
company_edu = tk.LabelFrame(root, text="學(xué)歷要求", padx=10, pady=4 )  # 水平,垂直方向上的邊距均為 10
company_edu.place(x=1035, y=540)
company_edu_Window = Label(company_edu, textvariable=edu_str, width=30, height=8,  font=('楷體', 12))
company_edu_Window.grid()
# 打開(kāi)文件
# right_top_button = Button(frame_right_top, text="打開(kāi)文件", command=lambda :openFile(), font=('楷體', 12))
input_name = Label(frame_right_top, text='崗位關(guān)鍵字:', font=('楷體', 12)).place(x=0, y=10)
label = StringVar()
entry = Entry(frame_right_top, bg='#ffffff', width=20, textvariable=label, font=('楷體', 12)).place(x=120, y=10)
input_num = Label(frame_right_top, text='數(shù)據(jù)條數(shù):', font=('楷體', 12)).place(x=0, y=50)
label_num = StringVar()
entry_num = Entry(frame_right_top, bg='#ffffff', width=15, textvariable=label_num, font=('楷體', 12)).place(x=80, y=50)
btn_search = Button(frame_right_top, text="查詢輸出", command=lambda :openFile(label, label_num), font=('楷體', 12)).place(x=210, y=50)
right_pic_button = Button(frame_right_top, text="工作經(jīng)驗(yàn)對(duì)應(yīng)薪資圖", command=lambda: show_plot(), font=('楷體', 12)).place(x=0, y=90)
right_hist_button = Button(frame_right_top, text="工資分布圖", command=lambda: show_hist(), font=('楷體', 12)).place(x=180, y=90)
right_data_button = Button(frame_right_top, text="數(shù)據(jù)分析", command=lambda: show_data(), font=('楷體', 12)).place(x=0, y=130)

主界面中各個(gè)控件創(chuàng)建,主要包含label-文本,Entry-文本輸入框,Treeview-表格樹(shù),LabelFrame-控件容器等等。

效果如下:

3. 功能實(shí)現(xiàn)

我們明確功能點(diǎn)以及有了GUI布局后,可以正式開(kāi)始實(shí)現(xiàn)功能邏輯。

3.1 職位數(shù)據(jù)爬蟲(chóng)

關(guān)于職位數(shù)據(jù)爬取,我們爬取的是51job的數(shù)據(jù),編寫(xiě)一個(gè)函數(shù)。按照核心功能要求,這個(gè)函數(shù)通過(guò)參數(shù)職位關(guān)鍵字及數(shù)據(jù)條數(shù),自動(dòng)爬取并將數(shù)據(jù)保存。

首先我可以通過(guò)對(duì)51job職位搜索頁(yè)面進(jìn)行分析,獲取一個(gè)列表頁(yè),代碼如下:

# 獲取一個(gè)列表頁(yè)
def geturl(url):
 headers = {
  'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
 '(KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
 }
 # 使用通用爬蟲(chóng)對(duì)url進(jìn)行一頁(yè)進(jìn)行爬取
 page_text = requests.get(url=url, headers=headers).text # 每一頁(yè)源碼用text
 # print(page_text)
 return page_text

其次通過(guò)對(duì)具體職位頁(yè)面數(shù)據(jù)分析,獲取列表頁(yè)的所有崗位信息。主要包含崗位名稱、公司名稱、薪資水平、公司類型、招聘條件、福利待遇等等。代碼如下:

# 獲取列表頁(yè)的所有崗位信息
def get_data(page_text):
 # 正則表達(dá)式提取崗位信息
 job_href = '"job_href":"(.*?)"'  # 崗位鏈接
 job_name = '"job_name":"(.*?)"'  # 崗位名稱
 com_href = '"company_href":"(.*?)"' # 公司鏈接
 com_name = '"company_name":"(.*?)"' # 公司名稱
 salary = '"providesalary_text":"(.*?)"'  # 薪資水平
 company_type = '"companytype_text":"(.*?)"'  # 公司類型
 attribute = '"attribute_text":\[(.*?)\]'  # 招聘條件
 work_area = '"workarea_text":"(.*?)"'  # 工作地點(diǎn)
 company_size = '"companysize_text":"(.*?)"'  # 公司規(guī)模
 company_ind = '"companyind_text":"(.*?)"' # 主要業(yè)務(wù)
 job_welf = '"jobwelf":"(.*?)"'# 福利待遇
 # 第一個(gè)參數(shù)是規(guī)則,第二個(gè)參數(shù)是被檢索內(nèi)容,第三個(gè)參數(shù)re.S是單行匹配
 jobName_list = re.findall(job_name, page_text, re.S)
 comName_list = re.findall(com_name, page_text, re.S)
 salary_list = re.findall(salary, page_text, re.S)
 companytype_list = re.findall(company_type, page_text, re.S)
 attribute_list = re.findall(attribute, page_text, re.S)
 workarea_list = re.findall(work_area, page_text, re.S)
 companysize_list = re.findall(company_size, page_text, re.S)
 companyind_list = re.findall(company_ind, page_text, re.S)
 jobwelf_list = re.findall(job_welf, page_text, re.S)
 all_list = [jobName_list, comName_list, salary_list,
 companytype_list, attribute_list, workarea_list, companysize_list,
 companyind_list, jobwelf_list]
 return all_list

最后將獲取崗位數(shù)據(jù)保存至csv文件中,方便后面對(duì)這些數(shù)據(jù)進(jìn)行清洗。主要代碼如下:

# 主函數(shù)
def main(kw, num):
 # 關(guān)鍵字二次轉(zhuǎn)譯
 # kw = input("請(qǐng)輸入你要搜索的崗位關(guān)鍵字:")
 keyword = parse.quote(parse.quote(kw))
 page_num = 0
 col = ["崗位名稱", "公司名稱", "薪資水平", "公司類型", "招聘條件", "工作地點(diǎn)", '公司規(guī)模', '主要業(yè)務(wù)', '福利待遇']
 csv_file = open("51job.csv", "w+", encoding='utf-8', newline='')
 try:
  writer = csv.writer(csv_file)
  writer.writerow(col)
  for i1 in range(0, num):  # 爬取前3頁(yè)數(shù)據(jù)
page_num += 1
url = "https://search.51job.com/list/080000,000000,0000,00,9,99," + keyword + ",2," + str(
 page_num) + ".html"
page_text = geturl(url)
all_list = get_data(page_text)
if len(all_list[0]) == 0:
 print('沒(méi)有搜索到職位信息')
 break
else:
 print('正在爬取第%d頁(yè)' % page_num)
 save_data(all_list, writer, search_num=len(all_list[0]))
 finally:
  csv_file.close()

3.2 數(shù)據(jù)預(yù)處理

我們通過(guò)爬蟲(chóng)已經(jīng)拿到了原始數(shù)據(jù),接下來(lái)我們需要將這些數(shù)據(jù)清洗,去除異常值、缺失值,轉(zhuǎn)換我們要的數(shù)據(jù)格式。

首先我們可以對(duì)工作地點(diǎn)進(jìn)行整理,我們爬取的數(shù)據(jù),默認(rèn)都是浙江省,我們按照浙江省各個(gè)地級(jí)市進(jìn)行工作地點(diǎn)轉(zhuǎn)換,代碼如下:

job = pd.read_csv("51job.csv", encoding='utf-8')
df = pd.DataFrame(job)
dict_city = {'杭州': 0, '湖州': 0, '紹興': 0, '寧波': 0, '嘉興': 0, '麗水': 0, '臺(tái)州': 0, '溫州': 0, '金華': 0, '衢州': 0, '舟山': 0}
city = df.loc[:, "工作地點(diǎn)"]
print(city.shape[0])
for i in range(city.shape[0]):
 # print(city[i])
 for k, v in dict_city.items():
  # print(k, v)
  if k in city[i]:
dict_city[k] = dict_city[k] + 1
df.loc[i, "城市"] = k
break
# print(list(dict_city.keys()))
# print(list(dict_city.values()))
city_df = df["城市"]
if np.any(pd.notnull(df["城市"])):
 df["城市"].fillna("其他", inplace=True)
# print(df["城市"].value_counts())

接著我們需要將原始數(shù)據(jù)得到的工資進(jìn)行格式轉(zhuǎn)換,轉(zhuǎn)換成 k/月固定格式,并將整理的薪資數(shù)據(jù)單獨(dú)存儲(chǔ)保存下來(lái)。主要代碼如下:

def get_salary(salary):
 if '-' in salary:  # 針對(duì)1-2萬(wàn)/月或者10-20萬(wàn)/年的情況,包含-
  low_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0]
  high_salary = re.findall(re.compile('(\d?\.?\d+)'), salary)[1]
  if u'萬(wàn)' in salary and u'年' in salary:  # 單位統(tǒng)一成千/月的形式
low_salary = round(float(low_salary) / 12 * 10, 1)
high_salary = round(float(high_salary) / 12 * 10, 1)
  elif u'萬(wàn)' in salary and u'月' in salary:
low_salary = float(low_salary) * 10
high_salary = float(high_salary) * 10
 else:  # 針對(duì)20萬(wàn)以上/年和100元/天這種情況,不包含-,取最低工資,沒(méi)有最高工資
  low_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0]
  if u'萬(wàn)' in salary and u'年' in salary:  # 單位統(tǒng)一成千/月的形式
low_salary = round(float(low_salary) / 12 * 10, 1)
  elif u'萬(wàn)' in salary and u'月' in salary:
low_salary = float(low_salary) * 10
  elif u'元' in salary and u'天' in salary:
low_salary = round(float(low_salary) / 1000 * 21, 1)# 每月工作日21天
  elif u'元' in salary and u'小時(shí)' in salary:
low_salary = round(float(low_salary) / 1000 * 8 * 21, 1)# 每天8小時(shí),每月工作日21天
  high_salary = low_salary
 return low_salary, high_salary
job = pd.read_csv("51job_pre.csv", encoding='utf-8')
job_df = job.drop("福利待遇", axis=1)
job_df = job_df.dropna(axis=0, how="any")
for index, row in job_df.iterrows():
 salary = row["薪資水平"]
 if salary:  # 如果待遇這欄不為空,計(jì)算最低最高待遇
  getsalary = get_salary(salary)
  low_salary = getsalary[0]
  high_salary = getsalary[1]
 else:
  low_salary = high_salary = "0"
 job_df.loc[index, "最低工資(k)"] = low_salary
 job_df.loc[index, "最高工資(k)"] = high_salary
 job_df.loc[index, "平均工資(k)"] = round((float(low_salary) + float(high_salary)) / 2, 1)
job_df.to_csv("./51job_pre2.csv", index=False)

薪資整理結(jié)束之后,我們通過(guò)觀察可以看到招聘條件列中有我們需要的學(xué)歷和工作經(jīng)驗(yàn)等數(shù)據(jù),我們需要提取出單獨(dú)的學(xué)歷,工作經(jīng)驗(yàn)等數(shù)據(jù)。代碼如下:

job_df.to_csv("./51job_pre2.csv", index=False)
job_df = pd.read_csv("51job_pre2.csv", encoding='utf-8')
job_df["學(xué)歷"] = job_df["招聘條件"].apply(lambda x: re.findall("本科|大專|高中|中專|碩士|博士|初中及以下", x))
job_df["工作經(jīng)驗(yàn)"] = job_df["招聘條件"].apply(lambda x: re.findall(r',".*經(jīng)驗(yàn)"|,"在校生/應(yīng)屆生"', x))
job_df["學(xué)歷"] = job_df["學(xué)歷"].apply(func)
job_df["工作經(jīng)驗(yàn)"] = job_df["工作經(jīng)驗(yàn)"].apply(func2)
# 薪資水平,公司類型,招聘條件,工作地點(diǎn),公司規(guī)模,主要業(yè)務(wù),城市,最低工資(k),最高工資(k),平均工資(k)
job_df = job_df.drop(["薪資水平", "招聘條件", "工作地點(diǎn)", "主要業(yè)務(wù)", "城市"], axis=1)
job_df = job_df.dropna(axis=0, how="any")
job_df.to_csv("./51job_analysis.csv", index=False)

原始數(shù)據(jù)清洗整理完畢,我們就可以繼續(xù)編寫(xiě)GUI的數(shù)據(jù)展示了。

3.3 崗位數(shù)據(jù)展示

上面我們已經(jīng)拿到了需要的數(shù)據(jù),首先我們可以通過(guò)讀取保存的數(shù)據(jù)表格,可視化展示崗位數(shù)據(jù)表格。代碼主要如下:

def read_csv_define(csv_path):
 x = tree.get_children()
 for item in x:
  tree.delete(item)
 global job_df
 job_df = pd.read_csv(csv_path, encoding='utf-8')
 # print(job_df.shape[0])
 for i in range(job_df.shape[0]):
  tree.insert("", "end",
  values=(i+1, job_df.loc[job_df.index[i], "崗位名稱"], job_df.loc[job_df.index[i], "公司名稱"],\
job_df.loc[job_df.index[i], "公司類型"], job_df.loc[job_df.index[i], "公司規(guī)模"], \
 job_df.loc[job_df.index[i], "學(xué)歷"],job_df.loc[job_df.index[i], "工作經(jīng)驗(yàn)"], \
job_df.loc[job_df.index[i], "最低工資(k)"], job_df.loc[job_df.index[i], "最高工資(k)"]))
def openFile(label, label_num):
 sname = label.get()
 num_str = label_num.get()
 num = int(num_str)
 rep.main(sname, int(num/50))
 pre.main()
 Filepath = "./51job_analysis.csv"
 # 打開(kāi)文件選擇對(duì)話框
 # Filepath = filedialog.askopenfilename(filetypes=[('表格', '*.xls;*.csv')]) #過(guò)濾文件后綴類型
 # print(os.path.split(Filepath))
 (filepath, tempfilename) = os.path.split(Filepath)  # 右側(cè)的值是元組類型
 try:
  # Filepath 當(dāng)路徑存在的時(shí)候繼續(xù)
  if Filepath:
# 傳輸excel表格的路徑
# 調(diào)用讀取數(shù)據(jù)的函數(shù),趁著用戶正在查看查詢條件的時(shí)候 將數(shù)據(jù)注入到全局變量中 減少查詢等待
# 由于兩種表格文件的讀取模塊不同,需要做處理判斷屬于哪種文件類型,故采用下邊的方式進(jìn)行判斷
# 從文件名中分離出后綴
(filename, extension) = os.path.splitext(tempfilename)
if extension == '.xls' or extension == '.XLS':
 read_xls(Filepath)
elif extension == '.csv':
 read_csv_define(Filepath)
  else:
print('未選擇任何文件!')
# exit_program()
 except Exception as e:
  global job_df
  job_df = pd.DataFrame()
  tkinter.messagebox.showwarning('警告', '文件讀取異常,請(qǐng)檢查!')
  print("ex:", e)
 finally:
  size_str.set("")
  type_str.set("")
  edu_str.set("")
  canvas_spice.get_tk_widget().destroy()
  canvas_spice_hist.get_tk_widget().destroy()

效果如下:

3.4 薪資圖表可視化

接下來(lái)我們可以對(duì)不同工作經(jīng)驗(yàn)?zāi)晗迣?duì)應(yīng)的薪資統(tǒng)計(jì),繪制縮略折線圖。代碼如下:

def show_plot():
 global canvas_spice
 canvas_spice.get_tk_widget().destroy()
 # 圖像及畫(huà)布
 fig, ax = plt.subplots(figsize=(5, 3.2), dpi=100)  # 圖像比例
 canvas_spice = FigureCanvasTkAgg(fig, root)
 canvas_spice.get_tk_widget().place(x=5, y=400)  # 放置位置
 work_experience = round(job_df.groupby(by='工作經(jīng)驗(yàn)')['平均工資(k)'].mean(), 2)
 experience_list = ["無(wú)需經(jīng)驗(yàn)", "1年經(jīng)驗(yàn)", "2年經(jīng)驗(yàn)", "3-4年經(jīng)驗(yàn)", "5-7年經(jīng)驗(yàn)"]
 experience_val = [work_experience[i] for i in experience_list]
 x = range(len(experience_list))
 y = experience_val
 plt.plot(x, y)
 plt.xticks(x, experience_list, fontsize=6)
 plt.grid(True, linestyle="--", alpha=0.5)
 plt.xlabel("工作經(jīng)驗(yàn)", fontsize=8)
 plt.ylabel("平均工資(k)", fontsize=8)
 plt.title("工作經(jīng)驗(yàn)對(duì)應(yīng)薪資折線圖", fontsize=8)
 canvas_spice.draw()
 canvas_spice.get_tk_widget().bind("<Double-Button-1>", xFunc1)

通過(guò)統(tǒng)計(jì)崗位數(shù)據(jù)中平均薪資數(shù)據(jù),繪制出薪資分布直方圖,展示該職位的平均薪資分布情況。代碼如下:

def show_hist():
 global canvas_spice_hist
 canvas_spice_hist.get_tk_widget().destroy()
 # 圖像及畫(huà)布
 fig_hist, ax_hist = plt.subplots(figsize=(5, 3.2), dpi=100)  # 圖像比例
 canvas_spice_hist = FigureCanvasTkAgg(fig_hist, root)
 canvas_spice_hist.get_tk_widget().place(x=520, y=400)  # 放置位置
 plt.hist(job_df["平均工資(k)"].values, bins=10)
 # 求出最小值
 max_ = job_df["平均工資(k)"].max()
 min_ = job_df["平均工資(k)"].min()
 # 修改刻度
 plt.xticks(np.linspace(min_, max_, num=11),fontsize=7)
 # 添加網(wǎng)格
 plt.grid()
 plt.xlabel("平均工資(k)", fontsize=8)
 plt.ylabel("崗位數(shù)量", fontsize=8)
 plt.title("工資分布直方圖", fontsize=8)
 canvas_spice_hist.draw()
 canvas_spice_hist.get_tk_widget().bind("<Double-Button-1>", xFunc2)

效果如下:

除了主界面之外,我們?cè)诶L制完圖表之后希望能直接彈窗預(yù)覽展示,因此也需要一個(gè)用于瀏覽圖片的界面與功能,這部分整體會(huì)放在后續(xù)預(yù)覽保存模塊講解。

3.5 崗位公司情況統(tǒng)計(jì)

我們還可以對(duì)不同的公司規(guī)模、類型、對(duì)崗位學(xué)歷要求等進(jìn)行數(shù)據(jù)分析展示:

def show_data():
 company = job_df.loc[:, "公司類型"].value_counts()
 type_name = list(company.index)
 x = range(len(type_name))
 content = ""
 for item in x:
  content += type_name[item] + '----' + str(company[item]) + '\n'
 type_str.set(content)
 company = job_df.loc[:, "公司規(guī)模"].value_counts()
 company_scale = company.index.to_list()
 z = range(len(company_scale))
 size_content = ""
 for item in z:
  size_content += company_scale[item] + '----' + str(company[item]) + '\n'
 size_str.set(size_content)
 education = job_df.loc[:, "學(xué)歷"].value_counts()
 education_scale = education.index.to_list()
 y = range(len(education_scale))
 edu_content = ""
 for item in y:
  edu_content += education_scale[item] + '----' + str(education[item]) + '\n'
 edu_str.set(edu_content)

效果如下:

3.6 預(yù)覽保存

我們?cè)谇懊嬗刑岬?,?duì)于繪制好的圖表,希望可以彈出預(yù)覽保存,這里實(shí)現(xiàn)這個(gè)功能,采用的是畫(huà)布綁定左鍵雙擊事件,彈出的子窗體同樣可以綁定右鍵事件, 通過(guò)事件適配器傳遞圖片參數(shù)。

def handlerAdaptor(fun, **kwds):
 return lambda event, fun= fun, kwds= kwds:fun(event, **kwds)
def xFunc2(event):
 top = Toplevel()
 top.title('圖像導(dǎo)出')
 top.minsize(700, 450)
 top.resizable(False, False)
 # 得到屏幕寬度
 sw = root.winfo_screenwidth()
 # 得到屏幕高度
 sh = root.winfo_screenheight()
 ww = 700
 wh = 450
 x = (sw - ww) / 2
 y = (sh - wh) / 2
 top.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
 top.transient(root)
 top.grab_set()
 # 圖像及畫(huà)布
 fig, ax = plt.subplots(figsize=(7, 4.5), dpi=100)  # 圖像比例
 canvas_spice = FigureCanvasTkAgg(fig, top)
 canvas_spice.get_tk_widget().place(x=1, y=1)  # 放置位置
 plt.hist(job_df["平均工資(k)"].values, bins=10)
 # 求出最小值
 max_ = job_df["平均工資(k)"].max()
 min_ = job_df["平均工資(k)"].min()
 # 修改刻度
 plt.xticks(np.linspace(min_, max_, num=11), fontsize=10)
 # 添加網(wǎng)格
 plt.grid()
 plt.xlabel("平均工資(k)", fontsize=12)
 plt.ylabel("崗位數(shù)量", fontsize=12)
 plt.title("工資分布直方圖", fontsize=15)
 plt.savefig("hist.png")
 canvas_spice.draw()
 canvas_spice.get_tk_widget().pack()
 img_pl = Image.open("hist.png").copy()
 os.remove("hist.png")
 canvas_spice.get_tk_widget().bind("<Button-3>", handlerAdaptor(saveimg, img=img_pl))

效果如下:

然后我們可以對(duì)預(yù)覽的圖片進(jìn)行保存:

def saveimg(event, img):
 Filepath = filedialog.asksaveasfilename(filetypes=[('圖像', '*.png;')])
 if Filepath:
  if not Filepath.endswith(('.png')):
Filepath += '.png'
  # 保存獲得的圖像
  img.save(Filepath, 'png')
  tkinter.messagebox.showinfo("提示", "保存成功!")
  HWND = win32gui.GetFocus()  # 獲取當(dāng)前窗口句柄
  win32gui.PostMessage(HWND, win32con.WM_CLOSE, 0, 0)

至此,自制的職位分析器小工具就編碼完成啦~

下面,我一鍵獲取生成設(shè)計(jì)師職位的分析報(bào)告:

從上面的分析報(bào)告中,不難看出:

  • 設(shè)計(jì)師職業(yè)的薪資水平在工作經(jīng)驗(yàn)5年以上,薪資會(huì)有較大的漲幅。
  • 行業(yè)的平均薪資分布主要在6k-14k左右。
  • 設(shè)計(jì)行業(yè)的公司大部分是民營(yíng),公司人數(shù)在500人以下。
  • 對(duì)于設(shè)計(jì)的學(xué)歷要求大部分是大專及以上。

好了,今天就到這里,明天我們繼續(xù)努力!

創(chuàng)作不易,白嫖不好,各位的支持和認(rèn)可,就是我創(chuàng)作的最大動(dòng)力,我們下篇文章見(jiàn)!

Dragon少年 | 文

如果本篇博客有任何錯(cuò)誤,請(qǐng)批評(píng)指教,不勝感激 !

以上就是python數(shù)據(jù)可視化自制職位分析生成崗位分析數(shù)據(jù)報(bào)表的詳細(xì)內(nèi)容,更多關(guān)于python數(shù)據(jù)可視化生成職位分析數(shù)據(jù)報(bào)表的資料請(qǐng)關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部