python數(shù)據(jù)可視化自制職位分析生成崗位分析數(shù)據(jù)報表
為什么要進行職位分析?職位分析是人力資源開發(fā)和管理的基礎與核心,是企業(yè)人力資源規(guī)劃、招聘、培訓、薪酬制定、績效評估、考核激勵等各項人力資源管理工作的依據(jù)。其次我們可以根據(jù)不同崗位的職位分析,可視化展示各崗位的數(shù)據(jù)分析報告。
首先我們來看看分析展示的效果:
下面,我們開始介紹這個小工具的制作過程。
1. 核心功能設計
總體來說,我們的這款職位分析器可以通過輸入崗位關鍵字和崗位條數(shù),自動爬取相關崗位的數(shù)據(jù),并對爬蟲的崗位可視化表格展示。然后分析這些崗位數(shù)據(jù)的公司類型規(guī)模,對學歷要求,薪資分布等。
拆解需求,大致可以整理出核心功能如下:
可視化展示崗位表格數(shù)據(jù)
通過輸入的崗位關鍵字和獲取條數(shù),自動爬取職位數(shù)據(jù)對爬蟲的職位原始數(shù)據(jù)進行清洗讀取展示清洗后的職位數(shù)據(jù)
分析崗位薪資情況
根據(jù)工作年限及對應平均薪資,繪制工作經(jīng)驗年限和薪資折線圖統(tǒng)計匯總薪資分布區(qū)間,了解該崗位薪資情況,展示薪資分布直方圖
分析崗位公司情況
展示崗位中公司類型分布情況,包含民營企業(yè)、合資、上市、外企等等展示公司規(guī)模人數(shù)分布情況,包含少于50人,50-150,150-500等等統(tǒng)計崗位對于學歷的要求
數(shù)據(jù)分析導出
對于可視化數(shù)據(jù)進行彈窗預覽,并將數(shù)據(jù)導出保存
基本的核心功能確定,下面我們我們首先開始GUI設計。
2. GUI設計與實現(xiàn)
基于功能點,我們可以先考慮進行簡單的UE布局設計,然后再通過GUI開發(fā)庫進行設計,這里采用的是tkinker,主要是簡單方便。
基于UI設計,我們gui設計編碼如下:
# 創(chuàng)建主窗口 root = Tk() root.title('職位查詢分析數(shù)據(jù)平臺 -- Dragon少年') # 設置窗口大小 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) # 定義樹形結(jié)構與滾動條 tree.configure(yscrollcommand=vbar.set) # 表格的標題 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="序號") tree.heading("a", text="崗位名稱") tree.heading("b", text="公司名稱") tree.heading("c", text="公司類型") tree.heading("d", text="公司規(guī)模") tree.heading("e", text="學歷") tree.heading("f", text="工作經(jīng)驗") 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() #設置滾動窗口文本 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() #設置滾動窗口文本 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() #設置滾動窗口文本 company_edu = tk.LabelFrame(root, text="學歷要求", 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() # 打開文件 # right_top_button = Button(frame_right_top, text="打開文件", command=lambda :openFile(), font=('楷體', 12)) input_name = Label(frame_right_top, text='崗位關鍵字:', 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)驗對應薪資圖", 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)
主界面中各個控件創(chuàng)建,主要包含label-文本,Entry-文本輸入框,Treeview-表格樹,LabelFrame-控件容器等等。
效果如下:
3. 功能實現(xiàn)
我們明確功能點以及有了GUI布局后,可以正式開始實現(xiàn)功能邏輯。
3.1 職位數(shù)據(jù)爬蟲
關于職位數(shù)據(jù)爬取,我們爬取的是51job的數(shù)據(jù),編寫一個函數(shù)。按照核心功能要求,這個函數(shù)通過參數(shù)職位關鍵字及數(shù)據(jù)條數(shù),自動爬取并將數(shù)據(jù)保存。
首先我可以通過對51job職位搜索頁面進行分析,獲取一個列表頁,代碼如下:
# 獲取一個列表頁 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' } # 使用通用爬蟲對url進行一頁進行爬取 page_text = requests.get(url=url, headers=headers).text # 每一頁源碼用text # print(page_text) return page_text
其次通過對具體職位頁面數(shù)據(jù)分析,獲取列表頁的所有崗位信息。主要包含崗位名稱、公司名稱、薪資水平、公司類型、招聘條件、福利待遇等等。代碼如下:
# 獲取列表頁的所有崗位信息 def get_data(page_text): # 正則表達式提取崗位信息 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":"(.*?)"' # 工作地點 company_size = '"companysize_text":"(.*?)"' # 公司規(guī)模 company_ind = '"companyind_text":"(.*?)"' # 主要業(yè)務 job_welf = '"jobwelf":"(.*?)"'# 福利待遇 # 第一個參數(shù)是規(guī)則,第二個參數(shù)是被檢索內(nèi)容,第三個參數(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文件中,方便后面對這些數(shù)據(jù)進行清洗。主要代碼如下:
# 主函數(shù) def main(kw, num): # 關鍵字二次轉(zhuǎn)譯 # kw = input("請輸入你要搜索的崗位關鍵字:") keyword = parse.quote(parse.quote(kw)) page_num = 0 col = ["崗位名稱", "公司名稱", "薪資水平", "公司類型", "招聘條件", "工作地點", '公司規(guī)模', '主要業(yè)務', '福利待遇'] 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頁數(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('沒有搜索到職位信息') break else: print('正在爬取第%d頁' % page_num) save_data(all_list, writer, search_num=len(all_list[0])) finally: csv_file.close()
3.2 數(shù)據(jù)預處理
我們通過爬蟲已經(jīng)拿到了原始數(shù)據(jù),接下來我們需要將這些數(shù)據(jù)清洗,去除異常值、缺失值,轉(zhuǎn)換我們要的數(shù)據(jù)格式。
首先我們可以對工作地點進行整理,我們爬取的數(shù)據(jù),默認都是浙江省,我們按照浙江省各個地級市進行工作地點轉(zhuǎn)換,代碼如下:
job = pd.read_csv("51job.csv", encoding='utf-8') df = pd.DataFrame(job) dict_city = {'杭州': 0, '湖州': 0, '紹興': 0, '寧波': 0, '嘉興': 0, '麗水': 0, '臺州': 0, '溫州': 0, '金華': 0, '衢州': 0, '舟山': 0} city = df.loc[:, "工作地點"] 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ù)得到的工資進行格式轉(zhuǎn)換,轉(zhuǎn)換成 k/月固定格式,并將整理的薪資數(shù)據(jù)單獨存儲保存下來。主要代碼如下:
def get_salary(salary): if '-' in salary: # 針對1-2萬/月或者10-20萬/年的情況,包含- low_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0] high_salary = re.findall(re.compile('(\d?\.?\d+)'), salary)[1] if u'萬' 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'萬' in salary and u'月' in salary: low_salary = float(low_salary) * 10 high_salary = float(high_salary) * 10 else: # 針對20萬以上/年和100元/天這種情況,不包含-,取最低工資,沒有最高工資 low_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0] if u'萬' in salary and u'年' in salary: # 單位統(tǒng)一成千/月的形式 low_salary = round(float(low_salary) / 12 * 10, 1) elif u'萬' 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'小時' in salary: low_salary = round(float(low_salary) / 1000 * 8 * 21, 1)# 每天8小時,每月工作日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: # 如果待遇這欄不為空,計算最低最高待遇 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é)束之后,我們通過觀察可以看到招聘條件列中有我們需要的學歷和工作經(jīng)驗等數(shù)據(jù),我們需要提取出單獨的學歷,工作經(jīng)驗等數(shù)據(jù)。代碼如下:
job_df.to_csv("./51job_pre2.csv", index=False) job_df = pd.read_csv("51job_pre2.csv", encoding='utf-8') job_df["學歷"] = job_df["招聘條件"].apply(lambda x: re.findall("本科|大專|高中|中專|碩士|博士|初中及以下", x)) job_df["工作經(jīng)驗"] = job_df["招聘條件"].apply(lambda x: re.findall(r',".*經(jīng)驗"|,"在校生/應屆生"', x)) job_df["學歷"] = job_df["學歷"].apply(func) job_df["工作經(jīng)驗"] = job_df["工作經(jīng)驗"].apply(func2) # 薪資水平,公司類型,招聘條件,工作地點,公司規(guī)模,主要業(yè)務,城市,最低工資(k),最高工資(k),平均工資(k) job_df = job_df.drop(["薪資水平", "招聘條件", "工作地點", "主要業(yè)務", "城市"], axis=1) job_df = job_df.dropna(axis=0, how="any") job_df.to_csv("./51job_analysis.csv", index=False)
原始數(shù)據(jù)清洗整理完畢,我們就可以繼續(xù)編寫GUI的數(shù)據(jù)展示了。
3.3 崗位數(shù)據(jù)展示
上面我們已經(jīng)拿到了需要的數(shù)據(jù),首先我們可以通過讀取保存的數(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], "學歷"],job_df.loc[job_df.index[i], "工作經(jīng)驗"], \ 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" # 打開文件選擇對話框 # Filepath = filedialog.askopenfilename(filetypes=[('表格', '*.xls;*.csv')]) #過濾文件后綴類型 # print(os.path.split(Filepath)) (filepath, tempfilename) = os.path.split(Filepath) # 右側(cè)的值是元組類型 try: # Filepath 當路徑存在的時候繼續(xù) if Filepath: # 傳輸excel表格的路徑 # 調(diào)用讀取數(shù)據(jù)的函數(shù),趁著用戶正在查看查詢條件的時候 將數(shù)據(jù)注入到全局變量中 減少查詢等待 # 由于兩種表格文件的讀取模塊不同,需要做處理判斷屬于哪種文件類型,故采用下邊的方式進行判斷 # 從文件名中分離出后綴 (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('警告', '文件讀取異常,請檢查!') 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 薪資圖表可視化
接下來我們可以對不同工作經(jīng)驗年限對應的薪資統(tǒng)計,繪制縮略折線圖。代碼如下:
def show_plot(): global canvas_spice canvas_spice.get_tk_widget().destroy() # 圖像及畫布 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)驗')['平均工資(k)'].mean(), 2) experience_list = ["無需經(jīng)驗", "1年經(jīng)驗", "2年經(jīng)驗", "3-4年經(jīng)驗", "5-7年經(jīng)驗"] 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)驗", fontsize=8) plt.ylabel("平均工資(k)", fontsize=8) plt.title("工作經(jīng)驗對應薪資折線圖", fontsize=8) canvas_spice.draw() canvas_spice.get_tk_widget().bind("<Double-Button-1>", xFunc1)
通過統(tǒng)計崗位數(shù)據(jù)中平均薪資數(shù)據(jù),繪制出薪資分布直方圖,展示該職位的平均薪資分布情況。代碼如下:
def show_hist(): global canvas_spice_hist canvas_spice_hist.get_tk_widget().destroy() # 圖像及畫布 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)
效果如下:
除了主界面之外,我們在繪制完圖表之后希望能直接彈窗預覽展示,因此也需要一個用于瀏覽圖片的界面與功能,這部分整體會放在后續(xù)預覽保存模塊講解。
3.5 崗位公司情況統(tǒng)計
我們還可以對不同的公司規(guī)模、類型、對崗位學歷要求等進行數(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[:, "學歷"].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 預覽保存
我們在前面有提到,對于繪制好的圖表,希望可以彈出預覽保存,這里實現(xiàn)這個功能,采用的是畫布綁定左鍵雙擊事件,彈出的子窗體同樣可以綁定右鍵事件, 通過事件適配器傳遞圖片參數(shù)。
def handlerAdaptor(fun, **kwds): return lambda event, fun= fun, kwds= kwds:fun(event, **kwds)
def xFunc2(event): top = Toplevel() top.title('圖像導出') 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() # 圖像及畫布 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))
效果如下:
然后我們可以對預覽的圖片進行保存:
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() # 獲取當前窗口句柄 win32gui.PostMessage(HWND, win32con.WM_CLOSE, 0, 0)
至此,自制的職位分析器小工具就編碼完成啦~
下面,我一鍵獲取生成設計師職位的分析報告:
從上面的分析報告中,不難看出:
- 設計師職業(yè)的薪資水平在工作經(jīng)驗5年以上,薪資會有較大的漲幅。
- 行業(yè)的平均薪資分布主要在6k-14k左右。
- 設計行業(yè)的公司大部分是民營,公司人數(shù)在500人以下。
- 對于設計的學歷要求大部分是大專及以上。
好了,今天就到這里,明天我們繼續(xù)努力!
創(chuàng)作不易,白嫖不好,各位的支持和認可,就是我創(chuàng)作的最大動力,我們下篇文章見!
Dragon少年 | 文
如果本篇博客有任何錯誤,請批評指教,不勝感激 !
以上就是python數(shù)據(jù)可視化自制職位分析生成崗位分析數(shù)據(jù)報表的詳細內(nèi)容,更多關于python數(shù)據(jù)可視化生成職位分析數(shù)據(jù)報表的資料請關注本站其它相關文章!
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。