Source code for salary_stone.metrics
from collections import Counter
import pandas as pd
[docs]def skill_freq(skill_vec: list, data: pd.DataFrame, extracted_scol: str='extracted_skills'):
"""
The purpose of this method is to get the distribution of skills within a dataframe of
glassdoor job salary data.
:param skill_vec: is the vector of skills that we are calculating the frequency of.
:param data: is the dataframe that we are using for our frequency calculation.
:param extracted_scol: is the name of the column with the extracted skill from the skill extractor.
:returns: a vector of the skills and the skill percentage found within the dataframe.
"""
extracted_skills = [item for sub_list in list(data[extracted_scol]) for item in sub_list]
counts = Counter(extracted_skills)
skill_percentages = []
for i in skill_vec:
skill_percentages.append(counts[i]/len(data))
return skill_vec, skill_percentages
[docs]def skill_salary_dist(skill_vec: list, data: pd.DataFrame, extracted_salcol:str='salary_bin', extracted_scol:str='extracted_skills'): # list of the skills ['python', 'java']
"""
The purpose of this method is to get the salary distribution of jobs that include a skill.
:param skill_vec: is the vector of skills that we are calculating the frequency of.
:param data: is the dataframe that we are using for our frequency calculation.
:param extracted_salcol: is the name of the extracted salary column from the salary extractor.
:param extracted_scol: is the name of the extracted skill column from the skill extractor.
:returns: a dictionary with the skill as key and the counts of which salary bins it appears in.
"""
sorted_data = data.sort_values(by=[extracted_salcol]).reset_index(drop=True)
dictionary = {}
for i in skill_vec:
salarybin_count = [0] * len(sorted_data[extracted_salcol].unique())
index = 0
salary_bin = sorted_data[extracted_salcol][0]
for j in range(len(sorted_data)):
count = sorted_data[extracted_scol][j].count(i)
if count > 0:
if salary_bin == sorted_data[extracted_salcol][j]:
salarybin_count[index] += 1
else:
index += 1
salarybin_count[index] += 1
salary_bin = sorted_data[extracted_salcol][j]
dictionary[i] = salarybin_count
# dict with skill as key and vector with the value for each salary bin. {'python': [1,2,3,4,5], 'java': [6,7,8,9,10]}
return dictionary
[docs]def similarity_measure(skill_vec: list, data: pd.DataFrame, topn:int=5, jobtitle_col='job_title_sim', extracted_scol='extracted_skills'):
'''
The purpose of this method is to return the most similar job titles based on a lis tof skills passed in.
:param skill_vec: a vector of skills.
:param data: a dataframe of the job description data.
:param topn: a value for the number of similar job titles to return.
:return: two lists where one is the similarity score and the other is the job title.
'''
# caculate the skill vec similarity score for each job title
extracted_skills_list_by_title = []
tmp = []
job_titles = []
for i in data[jobtitle_col].unique():
extracted_skills_by_title = [item for sub_list in list(data[data[jobtitle_col]==i][extracted_scol]) for item in sub_list]
counts = Counter(extracted_skills_by_title)
skill_similarity_count = 0
for j in skill_vec:
skill_similarity_count += counts[j]
extracted_skills_list_by_title.append(skill_similarity_count/len(extracted_skills_by_title))
tmp.append(skill_similarity_count/len(extracted_skills_by_title))
job_titles.append(i)
final_list = []
for i in range(0, topn):
max1 = 0
for j in range(len(extracted_skills_list_by_title)):
if extracted_skills_list_by_title[j] > max1:
max1 = extracted_skills_list_by_title[j];
extracted_skills_list_by_title.remove(max1);
final_list.append(max1)
s = set(final_list)
nums = [num for num, letter in zip(tmp, job_titles) if num in s ]
letters = [letter for num, letter in zip(tmp, job_titles) if num in s ]
percentages, titles = zip(*sorted(zip(nums, letters), reverse=True))
# return the topn job titles most similar.
return percentages, titles