文章目录

  • 一、职位数据分析
    • 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(单精度浮点)&…