Repository navigation
Expand file tree
/
Copy pathdata_process.py
More file actions
173 lines (145 loc) · 5.4 KB
/
Copy pathdata_process.py
File metadata and controls
173 lines (145 loc) · 5.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import csv
import pdb
import pandas as pd
import numpy as np
import math
import sys
df = pd.read_csv('../data/train.csv')
NUM_SKILLS = 15
##Filter out positions where min salary is 0 and where max salary is 0
print("Original data size")
print(len(df))
df = df[df.min_salary != 0]
df = df[df.min_salary.notnull()]
print("Filtered out min salary zero or missing. New size " + str(len(df)) )
df = df[df.max_salary != 0]
df = df[df.max_salary.notnull()]
print("Filtered out max salary zero or missing. New size " + str(len(df)) )
##Filter out non-engineering or developer roles
df = df[df['job_title'].str.contains("engineer") | df['job_title'].str.contains("Engineer") \
| df['job_title'].str.contains("developer") | df['job_title'].str.contains("Developer")]
print("Filtered out non-engineering roles. New size " + str(len(df)) )
<<<<<<< HEAD
#
# def bay_area_filter(row):
# found = False
# found |= 'San Francisco' in row.address
# found |= 'Menlo Park' in row.address
# found |= 'Palo Alto' in row.address
# found |= 'Mountain View' in row.address
# found |= 'Redwood City' in row.address
# return found
#
# #Create New Columns for geographies
# df['NYC'] = df.apply(lambda row: 'New York' in row.address, axis=1)
# df['LA'] = df.apply(lambda row: 'Los Angeles' in row.address, axis=1)
# df['SF'] = df.apply(bay_area_filter, axis=1)
# df['SEA'] = df.apply(lambda row: 'Seattle' in row.address, axis=1)
#
# ##Create binary variable for seniority
# df['senior'] = df.apply(lambda row: row.seniority == 'senior' or row.seniority == 'staff', axis=1)
#
# ##Create binary variable for each seniority bucket
# seniority_types = df.seniority.unique()
# for seniority in seniority_types:
# df[f"seniority_{seniority}"] = df.apply(lambda row: row.seniority == seniority, axis=1)
#
# ##Create binary variable for each skill type
# skill_types = df.skills.unique()
# skills = []
# for skill in skill_types:
# if type(skill) is float:
# continue
# skills.extend(skill.split(","))
#
# skills = list(set(skills))
# skill_counts = {skill:0 for skill in skills}
#
# for idx, row in df.iterrows():
# if type(row.skills) is float:
# continue
# for skill in row.skills.split(","):
# skill_counts[skill] +=1
#
#
# sorted_skills = [item[0] for item in sorted(skill_counts.items(), key=lambda x: x[1], reverse=True)]
#
#
# sorted_skills = sorted_skills[:NUM_SKILLS]
#
# for skill in sorted_skills:
# df[f"skills_{skill}"] = df.apply(lambda row: skill in str(row.skills), axis=1)
=======
def bay_area_filter(row):
found = False
found |= 'San Francisco' in row.address
found |= 'Menlo Park' in row.address
found |= 'Palo Alto' in row.address
found |= 'Mountain View' in row.address
found |= 'Redwood City' in row.address
return found
#Create New Columns for geographies
df['NYC'] = df.apply(lambda row: 'New York' in row.address, axis=1)
df['LA'] = df.apply(lambda row: 'Los Angeles' in row.address, axis=1)
df['SF'] = df.apply(bay_area_filter, axis=1)
df['SEA'] = df.apply(lambda row: 'Seattle' in row.address, axis=1)
##Create binary variable for seniority
df['senior'] = df.apply(lambda row: row.seniority == 'senior' or row.seniority == 'staff', axis=1)
##Create binary variable for each seniority bucket
seniority_types = df.seniority.unique()
seniority_counts = {}
for seniority in seniority_types:
df[f"seniority_{seniority}"] = df.apply(lambda row: row.seniority == seniority, axis=1)
s = f"seniority_{seniority}"
print(f"{seniority}: {df[s].sum()}")
##Seniority categories for GMM
gmm_seniority = {}
gmm_seniority["junior"] = ["junior","intern"]
gmm_seniority["regular"] = ["regular"]
gmm_seniority["senior"] = ["senior","staff","manager"]
gmm_seniority["executive"] = ["director","vp","cxo"]
for category, group in gmm_seniority.items():
df[f"gmm_{category}"] = df.apply(lambda row: row.seniority in group, axis=1)
##Create binary variable for each skill type
skill_types = df.skills.unique()
skills = []
for skill in skill_types:
if type(skill) is float:
continue
skills.extend(skill.split(","))
skills = list(set(skills))
skill_counts = {skill:0 for skill in skills}
for idx, row in df.iterrows():
if type(row.skills) is float:
continue
for skill in row.skills.split(","):
skill_counts[skill] +=1
sorted_skills = [item[0] for item in sorted(skill_counts.items(), key=lambda x: x[1], reverse=True)]
sorted_skills = sorted_skills[:NUM_SKILLS]
for skill in sorted_skills:
df[f"skills_{skill}"] = df.apply(lambda row: skill in str(row.skills), axis=1)
>>>>>>> e20d5e0fe2dd946acea04d20645fb228d226f44a
##first replace any NaN values in this column; instead put in string "N/A"
# values = {'roles' : "N/A"}
# df = df.fillna(value=values)
# values = {'stage': 'N/A'}
# #
# ##Create binary variable for full_stack, back_end, front_end
# df['back_end'] = df.apply(lambda row: 'back_end' in row.roles, axis=1)
# df['full_stack'] = df.apply(lambda row: 'full_stack' in row.roles, axis=1)
# df['front_end'] = df.apply(lambda row: 'front_end' in row.roles, axis=1)
#
# ##Create a column for average company size
# #define function to compute average
# def avg_size(row):
# if math.isnan(row.max_size) or math.isnan(row.min_size):
# return float('nan')
# else:
# return ((row.max_size)+(row.min_size) ) / 2
#apply function to dataframe
# df['avg_size'] = df.apply(avg_size, axis=1)
#####Todo: feature scaling for faster convergence
#write out new dataset
dataset_name = './output/processed_data.csv'
df.to_csv(dataset_name)
print("Cleaned dataset output as " + dataset_name)