mirror of
https://github.com/koodiklinikka/palkkakysely.git
synced 2026-02-18 09:54:03 +00:00
Improve data normalization
This commit is contained in:
Binary file not shown.
@@ -5,16 +5,18 @@ import pandas as pd
|
|||||||
|
|
||||||
from pulkka.config import DATA_DIR
|
from pulkka.config import DATA_DIR
|
||||||
|
|
||||||
|
ETA_VAI_LAHI_COL = "Etä- vai lähityö"
|
||||||
|
|
||||||
COLUMN_MAP = {
|
COLUMN_MAP = {
|
||||||
# 2021
|
# 2021
|
||||||
"Missä kaupungissa työpaikkasi pääasiallinen toimisto sijaitsee?": "Kaupunki",
|
"Missä kaupungissa työpaikkasi pääasiallinen toimisto sijaitsee?": "Kaupunki",
|
||||||
"Työaika (jos työsuhteessa)": "Työaika",
|
"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",
|
"Vuositulot (sis. bonukset, osingot yms) / Vuosilaskutus (jos laskutat)": "Vuositulot",
|
||||||
"Kuukausipalkka (jos työntekijä) (brutto)": "Kuukausipalkka",
|
"Kuukausipalkka (jos työntekijä) (brutto)": "Kuukausipalkka",
|
||||||
"Onko palkkasi nykyroolissasi mielestäsi kilpailukykyinen?": "Kilpailukykyinen",
|
"Onko palkkasi nykyroolissasi mielestäsi kilpailukykyinen?": "Kilpailukykyinen",
|
||||||
# 2022
|
# 2022
|
||||||
"Etänä vai lähityössä?": "Etä",
|
"Etänä vai lähityössä?": ETA_VAI_LAHI_COL,
|
||||||
"Kuukausipalkka (brutto, euroina)": "Kuukausipalkka",
|
"Kuukausipalkka (brutto, euroina)": "Kuukausipalkka",
|
||||||
"Vuositulot (sis. bonukset, osingot yms, euroina)": "Vuositulot",
|
"Vuositulot (sis. bonukset, osingot yms, euroina)": "Vuositulot",
|
||||||
"Mitä palveluja tarjoat?": "Palvelut",
|
"Mitä palveluja tarjoat?": "Palvelut",
|
||||||
@@ -27,6 +29,23 @@ ETATYO_MAP = {
|
|||||||
"Jotain siltä väliltä": "50/50",
|
"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):
|
def map_sukupuoli(value: str):
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
@@ -90,20 +109,25 @@ def read_data() -> pd.DataFrame:
|
|||||||
# Turn työaika into 0% - 100%
|
# Turn työaika into 0% - 100%
|
||||||
df["Työaika"] = pd.to_numeric(df["Työaika"], errors="coerce").clip(0, 1)
|
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)
|
df["Kilpailukykyinen"].replace({"Kyllä": True, "Ei": False}, inplace=True)
|
||||||
|
|
||||||
# Try to clean up numbers with spaces, etc. to real numbers
|
# Try to clean up numbers with spaces, etc. to real numbers
|
||||||
df["Kuukausipalkka"] = df["Kuukausipalkka"].apply(map_numberlike)
|
df["Kuukausipalkka"] = df["Kuukausipalkka"].apply(map_numberlike)
|
||||||
df["Vuositulot"] = df["Vuositulot"].apply(map_numberlike)
|
df["Vuositulot"] = df["Vuositulot"].apply(map_numberlike)
|
||||||
|
|
||||||
# Remove Oy, Oyj, etc. from work places
|
# Fix up Työpaikka
|
||||||
df["Työpaikka"] = df["Työpaikka"].replace(re.compile(r"\s+oy|oyj$", flags=re.I), "")
|
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
|
# Normalize initial capitalization in Rooli and Palvelut
|
||||||
df["Rooli"] = df["Rooli"].apply(ucfirst)
|
df["Rooli"] = df["Rooli"].apply(ucfirst)
|
||||||
df["Palvelut"] = df["Palvelut"].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
|
# Fill in Vuositulot as 12.5 * Kk-tulot if empty
|
||||||
df["Vuositulot"] = df.apply(map_vuositulot, axis=1)
|
df["Vuositulot"] = df.apply(map_vuositulot, axis=1)
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ def main():
|
|||||||
df = force_tulot_numeric(df)
|
df = force_tulot_numeric(df)
|
||||||
df = force_age_numeric(df)
|
df = force_age_numeric(df)
|
||||||
profile = ProfileReport(df)
|
profile = ProfileReport(df)
|
||||||
|
profile.config.vars.cat.n_obs = 20
|
||||||
profile.to_file(OUT_DIR / "profiling_report.html")
|
profile.to_file(OUT_DIR / "profiling_report.html")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user