Improve data normalization

This commit is contained in:
Aarni Koskela
2022-10-17 16:36:10 +03:00
parent 52a5c4bdff
commit 4e97f5fc3e
3 changed files with 30 additions and 5 deletions

Binary file not shown.

View File

@@ -5,16 +5,18 @@ import pandas as pd
from pulkka.config import DATA_DIR
ETA_VAI_LAHI_COL = "Etä- vai lähityö"
COLUMN_MAP = {
# 2021
"Missä kaupungissa työpaikkasi pääasiallinen toimisto sijaitsee?": "Kaupunki",
"Työaika (jos työsuhteessa)": "Työaika",
"Etänä vai paikallisesti?": "Etä",
"Etänä vai paikallisesti?": ETA_VAI_LAHI_COL,
"Vuositulot (sis. bonukset, osingot yms) / Vuosilaskutus (jos laskutat)": "Vuositulot",
"Kuukausipalkka (jos työntekijä) (brutto)": "Kuukausipalkka",
"Onko palkkasi nykyroolissasi mielestäsi kilpailukykyinen?": "Kilpailukykyinen",
# 2022
"Etänä vai lähityössä?": "Etä",
"Etänä vai lähityössä?": ETA_VAI_LAHI_COL,
"Kuukausipalkka (brutto, euroina)": "Kuukausipalkka",
"Vuositulot (sis. bonukset, osingot yms, euroina)": "Vuositulot",
"Mitä palveluja tarjoat?": "Palvelut",
@@ -27,6 +29,23 @@ ETATYO_MAP = {
"Jotain siltä väliltä": "50/50",
}
COMPANY_MAP = {
'Siili Solutions': 'Siili',
'Mavericks Software': 'Mavericks',
}
FULL_STACK_ROLE = 'Full-stack'
ROLE_MAP = {
'Full-stack developer': FULL_STACK_ROLE,
'Full-stack kehittäjä': FULL_STACK_ROLE,
'Full-stack ohjelmistokehittäjä': FULL_STACK_ROLE,
'Full-stack-kehittäjä': FULL_STACK_ROLE,
'Fullstack': FULL_STACK_ROLE,
'Ohjelmistokehittäjä (full-stack)': FULL_STACK_ROLE,
'Ohjelmistokehittäjä, full-stack': FULL_STACK_ROLE,
}
def map_sukupuoli(value: str):
if isinstance(value, str):
@@ -90,20 +109,25 @@ def read_data() -> pd.DataFrame:
# Turn työaika into 0% - 100%
df["Työaika"] = pd.to_numeric(df["Työaika"], errors="coerce").clip(0, 1)
df["Etä"] = df["Etä"].map(ETATYO_MAP).astype("category")
df["Etä"] = df[ETA_VAI_LAHI_COL].map(ETATYO_MAP).astype("category")
df["Kilpailukykyinen"].replace({"Kyllä": True, "Ei": False}, inplace=True)
# Try to clean up numbers with spaces, etc. to real numbers
df["Kuukausipalkka"] = df["Kuukausipalkka"].apply(map_numberlike)
df["Vuositulot"] = df["Vuositulot"].apply(map_numberlike)
# Remove Oy, Oyj, etc. from work places
df["Työpaikka"] = df["Työpaikka"].replace(re.compile(r"\s+oy|oyj$", flags=re.I), "")
# Fix up Työpaikka
df["Työpaikka"].replace("-", np.nan, inplace=True)
df["Työpaikka"].replace(re.compile(r"\s+oy|oyj$", flags=re.I), "", inplace=True)
df["Työpaikka"] = df["Työpaikka"].map(COMPANY_MAP).fillna(df["Työpaikka"])
# Normalize initial capitalization in Rooli and Palvelut
df["Rooli"] = df["Rooli"].apply(ucfirst)
df["Palvelut"] = df["Palvelut"].apply(ucfirst)
# Map Rooli via known roles
df["Rooli"] = df["Rooli"].map(ROLE_MAP).fillna(df["Rooli"])
# Fill in Vuositulot as 12.5 * Kk-tulot if empty
df["Vuositulot"] = df.apply(map_vuositulot, axis=1)

View File

@@ -8,6 +8,7 @@ def main():
df = force_tulot_numeric(df)
df = force_age_numeric(df)
profile = ProfileReport(df)
profile.config.vars.cat.n_obs = 20
profile.to_file(OUT_DIR / "profiling_report.html")