基于Pandas和FineBI的昆明職位數據分析與可視化實現(三)- 職位數據統計分析

文章目錄

  • 一、職位數據分析
    • 1. 一級分類職位數量統計分析
    • 2. 職位二級分類分布分析
    • 3. 職位分布分析
    • 4. 工作經驗需求分布分析
    • 5. 學歷要求職位分布分析
    • 6. 企業職位供給前50
    • 7. 不同規模公司的職位數量統計
    • 8. 區域職位分布分析
    • 9. 各區域平均薪資范圍分布分析
    • 10. 不同工作經驗平均薪資范圍分布分析
    • 11. 不同學歷平均薪資范圍分布分析
    • 12. 不同企業規模平均薪資范圍分布分析
    • 13. 各行業職位分布分析
    • 14. 不同融資階段職位統計分析
    • 15. 不同融資階段平均薪資范圍分布分析
    • 16. 技能詞頻統計
  • 二、完整代碼


一、職位數據分析

1. 一級分類職位數量統計分析

對職位一級分類(category_1)字段進行頻次統計,計算每個一級分類下的職位數量,輸出包含分類名稱和對應數量的結構化數據并保存。通過該分析可快速掌握各大門類職位的整體分布格局,識別核心招聘領域。

# 1. 一級分類職位數量統計分析
def category_1_job_counts(data, dir_name, file_name):category_1_counts = data['category_1'].value_counts()category_1_counts = category_1_counts.reset_index()category_1_counts.columns = ['category_1', 'counts']save_to_csv(category_1_counts, f'{dir_name}/{file_name}')

分析結果如下圖所示:

在這里插入圖片描述

2. 職位二級分類分布分析

針對職位二級分類(category_2)字段進行數量統計,細化呈現更具體分類下的職位分布情況。相比一級分類,該分析能揭示更細分領域的招聘熱度,為崗位細分研究提供數據支持。

# 2. 職位二級分類分布分析
def category_2_job_counts(data, dir_name, file_name):category_2_counts = data['category_2'].value_counts()category_2_counts = category_2_counts.reset_index()category_2_counts.columns = ['category_2', 'counts']save_to_csv(category_2_counts, f'{dir_name}/{file_name}')# save_to_mysql(category_2_counts, 'category_2_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

3. 職位分布分析

統計具體職位名稱(position)的出現頻次,直接反映各崗位的招聘需求熱度。通過該分析可明確市場上需求量大的具體職位,為求職者和企業提供崗位供需的直觀參考。

# 3. 職位分布分析
def position_counts_analysis(data, dir_name, file_name):job_counts = data['position'].value_counts()job_counts = job_counts.reset_index()job_counts.columns = ['position', 'counts']save_to_csv(job_counts, f'{dir_name}/{file_name}')# save_to_mysql(job_counts, 'position_counts_analysis')

分析結果如下圖所示:

在這里插入圖片描述

4. 工作經驗需求分布分析

統計不同工作經驗要求(experience)對應的職位數量,并按經驗遞進邏輯(如在校 / 應屆→經驗不限→具體時長)排序。該分析可清晰呈現市場對崗位經驗的需求分布,幫助理解不同經驗層級的崗位供給情況。

# 4. 工作經驗需求分布分析
def experience_job_counts(data, dir_name, file_name):experience_counts = data['experience'].value_counts()experience_counts = experience_counts.reset_index()experience_counts.columns = ['experience', 'counts']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}experience_counts.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(experience_counts, f'{dir_name}/{file_name}')# save_to_mysql(experience_counts, 'experience_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

5. 學歷要求職位分布分析

統計不同學歷要求(education)對應的職位數量,并按學歷層次(如學歷不限→初中及以下→博士)排序。該分析可直觀展示市場對崗位學歷的需求門檻分布,為教育與就業的關聯研究提供基礎數據。

# 5. 學歷要求職位分布分析
def education_job_counts(data, dir_name, file_name):education_counts = data['education'].value_counts()education_counts = education_counts.reset_index()education_counts.columns = ['education', 'counts']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}education_counts.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(education_counts, f'{dir_name}/{file_name}')# save_to_mysql(education_counts, 'education_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

6. 企業職位供給前50

統計各企業(company_name)發布的職位數量,按職位數量降序排序后取前 50 名企業。該分析可識別招聘規模最大的頭部企業,反映企業的人才需求活躍度和市場擴張態勢。

# 6. 企業職位供給前50
def company_job_counts(data, dir_name, file_name):company_counts = data['company_name'].value_counts()company_counts = company_counts.reset_index()company_counts.columns = ['company_name', 'counts']company_counts = company_counts.sort_values(by='counts', ascending=False)company_counts = company_counts.head(50)save_to_csv(company_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_counts, 'company_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

7. 不同規模公司的職位數量統計

按公司規模(company_size)統計對應職位數量,并按規模從小到大(0-20 人至 10000 人以上)排序。該分析可揭示不同規模企業的招聘需求差異,反映中小企業與大型企業的崗位供給格局。

# 7. 不同規模公司的職位數量統計
def company_size_job_counts(data, dir_name, file_name):company_size_counts = data['company_size'].value_counts()company_size_counts = company_size_counts.reset_index()company_size_counts.columns = ['company_size', 'counts']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}company_size_counts.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(company_size_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_size_counts, 'company_size_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

8. 區域職位分布分析

按省(province)、市(city)、區(district)三級地理維度分組統計職位數量,呈現職位在不同行政區域的分布情況。該分析可細化到區域層級,為人才流動、區域就業市場差異研究提供數據支撐。

# 8. 區域職位分布分析
def district_job_counts(data, dir_name, file_name):district_counts = data.groupby(by=['province', 'city', 'district'])[['province', 'city', 'district']]district_counts = district_counts.value_counts()district_counts = district_counts.reset_index()district_counts.columns = ['province', 'city', 'district', 'counts']save_to_csv(district_counts, f'{dir_name}/{file_name}')# save_to_mysql(district_counts, 'district_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

9. 各區域平均薪資范圍分布分析

按區域(district)分組計算平均薪資下限(salary_lower)和平均薪資上限(salary_upper),整合為區域薪資范圍數據。該分析可直觀對比不同區域的薪資水平差異,反映地域間的薪酬競爭力。

# 9. 各區域平均薪資范圍分布分析
def district_avg_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('district')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('district')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['district', 'avg_salary_lower', 'avg_salary_upper']save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'district_avg_salary_lower_upper')

分析結果如下圖所示:

在這里插入圖片描述

10. 不同工作經驗平均薪資范圍分布分析

按工作經驗(experience)分組計算平均薪資下限和上限,并按經驗遞進邏輯排序。該分析可清晰呈現薪資水平與工作經驗的關聯趨勢,為不同經驗層級的薪酬定位提供參考。

# 10. 不同工作經驗平均薪資范圍分布分析
def experience_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('experience')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('experience')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['experience', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}salary_avg_lower_upper.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'experience_salary_lower_upper')

分析結果如下圖所示:

在這里插入圖片描述

11. 不同學歷平均薪資范圍分布分析

按學歷(education)分組計算平均薪資下限和上限,并按學歷層次由低到高排序。該分析可揭示學歷與薪資水平的關聯規律,為不同學歷背景的薪酬預期提供參考依據。

# 11. 不同學歷平均薪資范圍分布分析
def education_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('education')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('education')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['education', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}salary_avg_lower_upper.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'education_salary_lower_upper')

分析結果如下圖所示:

在這里插入圖片描述

12. 不同企業規模平均薪資范圍分布分析

按企業規模(company_size)分組計算平均薪資下限和上限,并按規模從小到大排序。該分析可對比不同規模企業的薪酬競爭力差異,反映企業規模與薪資水平的潛在關聯。

# 12. 不同企業規模平均薪資范圍分布分析
def company_size_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('company_size')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('company_size')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['company_size', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}salary_avg_lower_upper.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'company_size_salary_lower_upper')

分析結果如下圖所示:

在這里插入圖片描述

13. 各行業職位分布分析

統計各行業(company_industry)的職位數量,呈現不同行業的招聘需求熱度。該分析可直觀反映行業人才需求差異,為產業就業市場研究提供基礎數據。

# 13. 各行業職位分布分析
def company_industry_job_counts(data, dir_name, file_name):industry_counts = data['company_industry'].value_counts()industry_counts = industry_counts.reset_index()industry_counts.columns = ['company_industry', 'counts']save_to_csv(industry_counts, f'{dir_name}/{file_name}')# save_to_mysql(industry_counts, 'company_industry_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

14. 不同融資階段職位統計分析

按企業融資階段(financing_status)統計職位數量,并按融資進程(未融資→已上市等)排序。該分析可展示不同發展階段企業的招聘活躍度,反映企業生命周期與人才需求的關聯。

# 14. 不同融資階段職位統計分析
def financing_status_job_counts(data, dir_name, file_name):financing_counts = data['financing_status'].value_counts()financing_counts = financing_counts.reset_index()financing_counts.columns = ['financing_status', 'counts']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}financing_counts.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(financing_counts, f'{dir_name}/{file_name}')# save_to_mysql(financing_counts, 'financing_status_job_counts')

分析結果如下圖所示:

在這里插入圖片描述

15. 不同融資階段平均薪資范圍分布分析

按企業融資階段分組計算平均薪資下限和上限,并按融資進程排序。該分析可揭示企業不同發展階段的薪酬策略差異,為求職者選擇企業提供薪資參考。

# 15. 不同融資階段平均薪資范圍分布分析
def financing_status_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('financing_status')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('financing_status')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['financing_status', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}salary_avg_lower_upper.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')

分析結果如下圖所示:

在這里插入圖片描述

16. 技能詞頻統計

對職位要求的技能(skill)進行拆分、去重后統計詞頻,取出現次數最多的前 50 項技能。該分析可識別市場熱門技能需求,為求職者提升職業技能和企業制定招聘標準提供方向參考。

# 16. 技能詞頻統計
def skill_word_frequency(data, dir_name, file_name):# 對技能列進行拆分、展開和去除首尾空格all_skills = data['skill'].str.split(',').explode().str.strip()skill_freq = all_skills.value_counts()skill_freq = skill_freq.reset_index()skill_freq.columns = ['skill', 'counts']skill_freq = skill_freq.sort_values(by='counts', ascending=False)skill_freq = skill_freq.head(50)save_to_csv(skill_freq, f'{dir_name}/{file_name}')# save_to_mysql(skill_freq, 'skill_word_frequency')

分析結果如下圖所示:

在這里插入圖片描述


二、完整代碼

from pathlib import Pathimport pandas as pd
from sqlalchemy import create_enginedef load_data(csv_file_path):try:data = pd.read_csv(csv_file_path)return dataexcept FileNotFoundError:print("未找到指定的 CSV 文件,請檢查文件路徑和文件名。")except Exception as e:print(f"加載數據時出現錯誤: {e}")# 保存清洗后的數據為csv文件
def save_to_csv(data, csv_file_path):# 使用 pathlib 處理文件路徑path = Path(csv_file_path)# 檢查文件所在目錄是否存在,如果不存在則創建path.parent.mkdir(parents=True, exist_ok=True)data.to_csv(csv_file_path, index=False, encoding='utf-8-sig', mode='w', header=True)print(f'清洗后的數據已保存到 {csv_file_path} 文件')# 讀取MySQL中的數據
def load_from_mysql(table_name):# 創建數據庫引擎實例engine = create_engine(f'mysql+mysqlconnector://root:zxcvbq@127.0.0.1:3306/position')data = pd.read_sql_table(table_name, engine)return data# 保存清洗后的數據到MySQL數據庫
def save_to_mysql(data, table_name):# 創建一個 SQLAlchemy 引擎,用于連接 MySQL 數據庫# 使用 mysqlconnector 作為 MySQL 的驅動程序# 數據庫連接信息包括用戶名 root、密碼 zxcvbq、主機地址 127.0.0.1、端口 3306 以及數據庫名 positionengine = create_engine(f'mysql+mysqlconnector://root:zxcvbq@127.0.0.1:3306/position')# 將 DataFrame 中的數據寫入到 MySQL 數據庫中# table_name 是要寫入的表名# con 參數指定了數據庫連接引擎# index=False 表示不將 DataFrame 的索引寫入數據庫# if_exists='replace' 表示如果表已經存在,則先刪除原表,再創建新表并寫入數據data.to_sql(table_name, con=engine, index=False, if_exists='replace')print(f'清洗后的數據已保存到 {table_name} 表')# 1. 一級分類職位數量統計分析
def category_1_job_counts(data, dir_name, file_name):category_1_counts = data['category_1'].value_counts()category_1_counts = category_1_counts.reset_index()category_1_counts.columns = ['category_1', 'counts']save_to_csv(category_1_counts, f'{dir_name}/{file_name}')# 2. 職位二級分類分布分析
def category_2_job_counts(data, dir_name, file_name):category_2_counts = data['category_2'].value_counts()category_2_counts = category_2_counts.reset_index()category_2_counts.columns = ['category_2', 'counts']save_to_csv(category_2_counts, f'{dir_name}/{file_name}')# save_to_mysql(category_2_counts, 'category_2_job_counts')# 3. 職位分布分析
def position_counts_analysis(data, dir_name, file_name):job_counts = data['position'].value_counts()job_counts = job_counts.reset_index()job_counts.columns = ['position', 'counts']save_to_csv(job_counts, f'{dir_name}/{file_name}')# save_to_mysql(job_counts, 'position_counts_analysis')# 4. 工作經驗需求分布分析
def experience_job_counts(data, dir_name, file_name):experience_counts = data['experience'].value_counts()experience_counts = experience_counts.reset_index()experience_counts.columns = ['experience', 'counts']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}experience_counts.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(experience_counts, f'{dir_name}/{file_name}')# save_to_mysql(experience_counts, 'experience_job_counts')# 5. 學歷要求職位分布分析
def education_job_counts(data, dir_name, file_name):education_counts = data['education'].value_counts()education_counts = education_counts.reset_index()education_counts.columns = ['education', 'counts']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}education_counts.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(education_counts, f'{dir_name}/{file_name}')# save_to_mysql(education_counts, 'education_job_counts')# 6. 企業職位供給前50
def company_job_counts(data, dir_name, file_name):company_counts = data['company_name'].value_counts()company_counts = company_counts.reset_index()company_counts.columns = ['company_name', 'counts']company_counts = company_counts.sort_values(by='counts', ascending=False)company_counts = company_counts.head(50)save_to_csv(company_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_counts, 'company_job_counts')# 7. 不同規模公司的職位數量統計
def company_size_job_counts(data, dir_name, file_name):company_size_counts = data['company_size'].value_counts()company_size_counts = company_size_counts.reset_index()company_size_counts.columns = ['company_size', 'counts']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}company_size_counts.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(company_size_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_size_counts, 'company_size_job_counts')# 8. 區域職位分布分析
def district_job_counts(data, dir_name, file_name):district_counts = data.groupby(by=['province', 'city', 'district'])[['province', 'city', 'district']]district_counts = district_counts.value_counts()district_counts = district_counts.reset_index()district_counts.columns = ['province', 'city', 'district', 'counts']save_to_csv(district_counts, f'{dir_name}/{file_name}')# save_to_mysql(district_counts, 'district_job_counts')# 9. 各區域平均薪資范圍分布分析
def district_avg_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('district')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('district')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['district', 'avg_salary_lower', 'avg_salary_upper']save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'district_avg_salary_lower_upper')# 10. 不同工作經驗平均薪資范圍分布分析
def experience_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('experience')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('experience')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['experience', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}salary_avg_lower_upper.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'experience_salary_lower_upper')# 11. 不同學歷平均薪資范圍分布分析
def education_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('education')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('education')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['education', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}salary_avg_lower_upper.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'education_salary_lower_upper')# 12. 不同企業規模平均薪資范圍分布分析
def company_size_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('company_size')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('company_size')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['company_size', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}salary_avg_lower_upper.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'company_size_salary_lower_upper')# 13. 各行業職位分布分析
def company_industry_job_counts(data, dir_name, file_name):industry_counts = data['company_industry'].value_counts()industry_counts = industry_counts.reset_index()industry_counts.columns = ['company_industry', 'counts']save_to_csv(industry_counts, f'{dir_name}/{file_name}')# save_to_mysql(industry_counts, 'company_industry_job_counts')# 14. 不同融資階段職位統計分析
def financing_status_job_counts(data, dir_name, file_name):financing_counts = data['financing_status'].value_counts()financing_counts = financing_counts.reset_index()financing_counts.columns = ['financing_status', 'counts']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}financing_counts.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(financing_counts, f'{dir_name}/{file_name}')# save_to_mysql(financing_counts, 'financing_status_job_counts')# 15. 不同融資階段平均薪資范圍分布分析
def financing_status_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('financing_status')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('financing_status')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['financing_status', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}salary_avg_lower_upper.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# 16. 技能詞頻統計
def skill_word_frequency(data, dir_name, file_name):# 對技能列進行拆分、展開和去除首尾空格all_skills = data['skill'].str.split(',').explode().str.strip()skill_freq = all_skills.value_counts()skill_freq = skill_freq.reset_index()skill_freq.columns = ['skill', 'counts']skill_freq = skill_freq.sort_values(by='counts', ascending=False)skill_freq = skill_freq.head(50)save_to_csv(skill_freq, f'{dir_name}/{file_name}')# save_to_mysql(skill_freq, 'skill_word_frequency')if __name__ == '__main__':dir_path = '../data/data_analysis_result'df = load_data('../data/data_cleaning_result/cleaned_position_dataset.csv')category_1_job_counts(df, dir_path, 'category_1_job_counts.csv')category_2_job_counts(df, dir_path, 'category_2_job_counts.csv')position_counts_analysis(df, dir_path, 'position_counts_analysis.csv')experience_job_counts(df, dir_path, 'experience_job_counts.csv')education_job_counts(df, dir_path, 'education_job_counts.csv')company_job_counts(df, dir_path, 'company_job_counts.csv')company_size_job_counts(df, dir_path, 'company_size_job_counts.csv')district_job_counts(df, dir_path, 'district_job_counts.csv')district_avg_salary_lower_upper(df, dir_path, 'district_avg_salary_lower_upper.csv')experience_salary_lower_upper(df, dir_path, 'experience_salary_lower_upper.csv')education_salary_lower_upper(df, dir_path, 'education_salary_lower_upper.csv')company_size_salary_lower_upper(df, dir_path, 'company_size_salary_lower_upper.csv')company_industry_job_counts(df, dir_path, 'company_industry_job_counts.csv')financing_status_job_counts(df, dir_path, 'financing_status_job_counts.csv')financing_status_salary_lower_upper(df, dir_path, 'financing_status_salary_lower_upper.csv')skill_word_frequency(df, dir_path, 'skill_word_frequency.csv')

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87228.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據Hadoop之——安裝部署hadoop

目錄 前期準備 一、JDK的安裝 1、安裝jdk 2、配置Java環境變量 3、加載環境變量 4、進行校驗 二、hadoop的環境搭建 1、hadoop的下載安裝 2、配置文件設置 2.1. 配置 hadoop-env.sh 2.2. 配置 core-site.xml 2.3. 配置 hdfs-site.xml 2.4. 配置 yarn-site.xml 2.…

Spring IoC DI介紹

文章目錄 IoC & DI 介紹IoC介紹DI 介紹 組件注冊Bean 命名約定方法注解 Bean總結 掃描路徑DI 詳解屬性注入構造方法注入Setter 注入三種注入優缺點分析 當同一類型存在多個Bean時,直接使用Autowired會存在問題使用Primary注解使用Qualifier注解使用Bean的名稱使用Resource注…

【Flutter】解決 flutter_inappwebview在 Windows 上使用導致應用閃退問題

問題背景 在 Windows 11 上運行 Flutter 桌面應用時,應用出現閃退現象。通過系統事件日志分析,發現是 MSVCP140.dll 模塊的訪問沖突異常(錯誤代碼 c0000005)導致的崩潰。 問題分析 1. 錯誤現象 應用啟動后立即閃退Windows 事件…

使用 JavaScript、Mastra 和 Elasticsearch 構建一個具備代理能力的 RAG 助手

作者:來自 Elastic JD Armada 了解如何在 JavaScript 生態系統中構建 AI 代理。 Elasticsearch 與業界領先的生成式 AI 工具和服務商有原生集成。查看我們的網絡研討會,了解如何超越 RAG 基礎,或使用 Elastic 向量數據庫構建可投入生產的應用…

Active Directory 環境下 Linux Samba 文件共享服務建設方案

Active Directory 環境下 Linux Samba 文件共享服務建設方案 目錄 需求分析方案總體設計技術架構與選型詳細部署規劃共享文件性能測試非域終端共享配置運維與權限安全管理建議1. 需求分析 因某公司(編的)新增多個部門,各部門之間存在多類型終端系統,但又有同時訪問文件庫…

Python爬蟲網安-項目-簡單網站爬取

源碼: https://github.com/Wist-fully/Attack/tree/pc pc_p1 目標: 1.進入列表頁,順著列表爬取每個電影詳情頁 2.利用正則來提取,海報,名稱,類別,上映的時間,評分,劇…

Golang中的數組

Golang Array和以往認知的數組有很大不同。有點像Python中的列表 1. 數組:是同一種數據類型的固定長度的序列。 2. 數組定義:var a [len]int,比如:var a [5]int,數組長度必須是常量,且是類型的組成部分。一…

《Origin畫百圖》之矩陣散點圖

矩陣散點圖的作用 一、直觀展示多變量間的兩兩關系 矩陣散點圖的基本單元是兩兩變量的散點圖,每個散點圖對應矩陣中的一個單元格,可直接反映變量間的: 相關性方向:正相關(散點向右上傾斜)或負相關&#x…

Flask文件下載send_file中文文件名處理解決方案

Flask文件下載send_file中文文件名處理解決方案 Flask文件下載中文文件名處理解決方案問題背景問題分析核心問題常見癥狀 解決方案技術實現關鍵技術點 完整實現示例 Flask文件下載中文文件名處理解決方案 問題背景 在Web應用開發中,當用戶下載包含中文字符的文件時…

新手指南:在 Ubuntu 上安裝 PostgreSQL 并通過 VS Code 連接及操作

本文檔記錄了一個初學者在 Ubuntu 系統上安裝、配置 PostgreSQL 數據庫,并使用 Visual Studio Code (VS Code) 作為客戶端進行連接和操作的全過程。其中包含了遇到的常見錯誤、分析和最終的解決方案,旨在為新手提供一個清晰、可復現的操作路徑。 最終目…

二刷 蒼穹外賣day10(含bug修改)

Spring Task Spring框架提供的任務調度工具,可以按照約定的時間自動執行某個代碼邏輯 cron表達式 一個字符串,通過cron表達式可以定義任務觸發的時間 **構成規則:**分為6或7個域,由空格分隔開,每個域代表一個含義 …

Android Native 之 inputflinger進程分析

Android IMS原理解析 - 簡書 Android 輸入事件分發全流程梳理(一)_android input事件分發流程-CSDN博客 Android 輸入事件分發全流程梳理(二)_android輸入事件流程圖-CSDN博客 inputflinger模塊與surfaceflinger模塊在同級目錄…

Python實例題:基于 Flask 的在線聊天系統

目錄 Python實例題 題目 要求: 解題思路: 代碼實現: Python實例題 題目 基于 Flask 的在線聊天系統 要求: 使用 Flask 框架構建一個實時在線聊天系統,支持以下功能: 用戶注冊、登錄和個人資料管理…

v-bind指令

好的,我們來學習 v-bind 指令。這個指令是理解 Vue 數據驅動思想的基石。 核心功能:v-bind 的作用是將一個或多個 HTML 元素的 attribute (屬性) 或一個組件的 prop (屬性) 動態地綁定到 Vue 實例的數據上。 簡單來說,它在你的數據和 HTML …

【設計模式04】單例模式

前言 整個系統中只會出現要給實例,比如Spring中的Bean基本都是單例的 UML類圖 無 代碼示例 package com.sw.learn.pattern.B_create.c_singleton;public class Main {public static void main(String[] args) {// double check locking 線程安全懶加載 ?? //…

飛算科技依托 JavaAI 核心技術,打造企業級智能開發全場景方案

在數字經濟蓬勃發展的當下,企業對智能化開發的需求愈發迫切。飛算數智科技(深圳)有限公司(簡稱 “飛算科技”)作為自主創新型數字科技公司與國家級高新技術企業,憑借深厚的技術積累與創新能力,以…

20250701【二叉樹公共祖先】|Leetcodehot100之236【pass】今天計劃

20250701 思路與錯誤記錄1.二叉樹的數據結構與初始化1.1數據結構1.2 初始化 2.解題 完整代碼今天做了什么 題目 思路與錯誤記錄 1.二叉樹的數據結構與初始化 1.1數據結構 1.2 初始化 根據列表,順序存儲構建二叉樹 def build_tree(nodes, index0):# idx是root開始…

Web應用開發 --- Tips

Web應用開發 --- Tips General后端需要做參數校驗代碼風格和Api設計風格的一致性大于正確性數據入庫時間應由后端記錄在對Api修改的時候,要注意兼容情況,避免breaking change 索引對于查詢字段,注意加索引對于唯一的字段,考慮加唯…

CSS 安裝使用教程

一、CSS 簡介 CSS(Cascading Style Sheets,層疊樣式表)是用于為 HTML 頁面添加樣式的語言。通過 CSS 可以控制網頁元素的顏色、布局、字體、動畫等,是前端開發的三大核心技術之一(HTML、CSS、JavaScript)。…

機器學習中為什么要用混合精度訓練

目錄 FP16與顯存占用關系機器學習中一般使用混合精度訓練:FP16計算 FP32存儲關鍵變量。 FP16與顯存占用關系 顯存(Video RAM,簡稱 VRAM)是顯卡(GPU)專用的內存。 FP32(單精度浮點)&…