当前位置: 首页 > news >正文

基于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')

相关文章:

  • TCP/IP模型、OSI模型与C# Socket编程详解
  • (LeetCode 每日一题) 1498. 满足条件的子序列数目 (双指针)
  • Leetcode 3600. Maximize Spanning Tree Stability with Upgrades
  • ROS的可视化工具rviz介绍
  • 第十一节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 角色菜单授权
  • 智能座舱HMI语音自动化测试技术和实现
  • Linux下的调试器-gdb(16)
  • 【Canvas与标志】圆规脚足球俱乐部标志
  • 机器学习在智能供应链中的应用:需求预测与库存优化
  • RAG的“排毒”指南:告别非知识内容的干扰,实现精准问答
  • 对象的finalization机制Test
  • 数据库 DML 语句详解:语法与注意事项
  • github上传代码步骤(http)
  • 【Docker基础】Docker容器管理:docker inspect及其参数详解
  • 【学习】《算法图解》第八章学习笔记:平衡树
  • spring:BeanPostProcessor后置处理器介绍
  • AI大模型调用方法
  • FastGPT私有化部署完整指南
  • C++ 第四阶段 STL 容器 - 第一讲:详解 std::vector
  • 从代码学习深度学习 - 自然语言推断:使用注意力 PyTorch版