developer_salary_prediction / debug_prepare_features.py
dima806's picture
Upload 32 files
a32e584 verified
"""Debug prepare_features step by step."""
import pandas as pd
from src.preprocessing import reduce_cardinality
import yaml
from pathlib import Path
# Load config
config_path = Path("config/model_parameters.yaml")
with open(config_path, "r") as f:
config = yaml.safe_load(f)
# Create test input
df = pd.DataFrame(
{
"Country": ["United States of America"],
"YearsCode": [5.0],
"EdLevel": ["Bachelor's degree (B.A., B.S., B.Eng., etc.)"],
"DevType": ["Developer, full-stack"],
}
)
print("=" * 70)
print("STEP-BY-STEP DEBUGGING OF prepare_features()")
print("=" * 70)
print("\n1. Original input:")
print(f" Columns: {list(df.columns)}")
print(f" Values: {df.iloc[0].to_dict()}")
# Step 2: Copy
df_processed = df.copy()
# Step 3: Unicode normalization
for col in ["Country", "EdLevel", "DevType"]:
if col in df_processed.columns:
df_processed[col] = df_processed[col].str.replace("\u2019", "'", regex=False)
print("\n2. After unicode normalization:")
print(f" Columns: {list(df_processed.columns)}")
# Step 4: Fill missing values
df_processed["YearsCode"] = df_processed["YearsCode"].fillna(0)
df_processed["Country"] = df_processed["Country"].fillna("Unknown")
df_processed["EdLevel"] = df_processed["EdLevel"].fillna("Unknown")
df_processed["DevType"] = df_processed["DevType"].fillna("Unknown")
print("\n3. After filling missing values:")
print(f" Columns: {list(df_processed.columns)}")
print(f" Country value: '{df_processed['Country'].iloc[0]}'")
print(f" EdLevel value: '{df_processed['EdLevel'].iloc[0]}'")
print(f" DevType value: '{df_processed['DevType'].iloc[0]}'")
# Step 5: Reduce cardinality
print("\n4. Before cardinality reduction:")
print(f" Country value: '{df_processed['Country'].iloc[0]}'")
df_processed["Country"] = reduce_cardinality(df_processed["Country"])
print(f" After Country reduction: '{df_processed['Country'].iloc[0]}'")
print(f" EdLevel value: '{df_processed['EdLevel'].iloc[0]}'")
df_processed["EdLevel"] = reduce_cardinality(df_processed["EdLevel"])
print(f" After EdLevel reduction: '{df_processed['EdLevel'].iloc[0]}'")
print(f" DevType value: '{df_processed['DevType'].iloc[0]}'")
df_processed["DevType"] = reduce_cardinality(df_processed["DevType"])
print(f" After DevType reduction: '{df_processed['DevType'].iloc[0]}'")
# Step 6: Select feature columns
feature_cols = ["Country", "YearsCode", "EdLevel", "DevType"]
df_features = df_processed[feature_cols]
print("\n5. After selecting feature columns:")
print(f" Columns: {list(df_features.columns)}")
print(f" Values: {df_features.iloc[0].to_dict()}")
# Step 7: One-hot encode
drop_first = config["features"]["encoding"]["drop_first"]
print(f"\n6. One-hot encoding with drop_first={drop_first}:")
df_encoded = pd.get_dummies(df_features, drop_first=drop_first)
print(f" Result shape: {df_encoded.shape}")
print(f" Result columns: {list(df_encoded.columns)}")
print(f" Non-zero values: {df_encoded.columns[df_encoded.iloc[0] != 0].tolist()}")