Feature Engineering is the art of creating new features from raw data - crucial for ML!
1import pandas as pd
2import numpy as np
3
4df = pd.DataFrame({
5 'population': [120, 450, 85, 200, 5000],
6 'area_km2': [100, 500, 50, 200, 10000],
7 'year_observed': [2020, 2021, 2019, 2022, 2023]
8})
9
10# Logarithm - for skewed distributions
11df['log_population'] = np.log1p(df['population'])
12
13# Standardization (Z-score)
14df['pop_standardized'] = (df['population'] - df['population'].mean()) / df['population'].std()
15
16# Normalization (Min-Max)
17df['pop_normalized'] = (df['population'] - df['population'].min()) / (df['population'].max() - df['population'].min())
18
19# Binning - splitting into categories
20df['pop_category'] = pd.cut(
21 df['population'],
22 bins=[0, 100, 300, 1000, float('inf')],
23 labels=['small', 'medium', 'large', 'huge']
24)
25
26# Quantiles
27df['pop_quartile'] = pd.qcut(df['population'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])1# Ratio features
2df['density'] = df['population'] / df['area_km2']
3
4# Polynomial features
5df['area_squared'] = df['area_km2'] ** 2
6df['area_sqrt'] = np.sqrt(df['area_km2'])
7
8# Interaction features
9df['pop_area_interaction'] = df['population'] * df['area_km2']
10
11# Aggregated features (e.g., from grouping)
12df['pop_vs_mean'] = df['population'] / df['population'].mean()1# Data with categories
2df = pd.DataFrame({
3 'species': ['Lion', 'Elephant', 'Cheetah', 'Lion', 'Elephant'],
4 'habitat': ['Savanna', 'Forest', 'Savanna', 'Forest', 'Savanna'],
5 'endangered': ['Yes', 'No', 'Yes', 'No', 'No']
6})
7
8# One-Hot Encoding
9df_encoded = pd.get_dummies(df, columns=['species', 'habitat'])
10
11# Label Encoding
12from sklearn.preprocessing import LabelEncoder
13le = LabelEncoder()
14df['species_encoded'] = le.fit_transform(df['species'])
15
16# Ordinal Encoding (for ordered categories)
17danger_map = {'Low': 0, 'Medium': 1, 'High': 2}
18df['danger_level'] = df['danger'].map(danger_map)
19
20# Binary Encoding
21df['endangered_binary'] = (df['endangered'] == 'Yes').astype(int)1df = pd.DataFrame({
2 'observation_date': pd.date_range('2023-01-01', periods=100, freq='D')
3})
4
5# Extracting date components
6df['year'] = df['observation_date'].dt.year
7df['month'] = df['observation_date'].dt.month
8df['day'] = df['observation_date'].dt.day
9df['day_of_week'] = df['observation_date'].dt.dayofweek # 0=Monday
10df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
11df['quarter'] = df['observation_date'].dt.quarter
12df['day_of_year'] = df['observation_date'].dt.dayofyear
13
14# Cyclical encoding (for seasonality)
15df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
16df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)1df = pd.DataFrame({
2 'description': [
3 'Large male lion spotted near river',
4 'Small elephant calf with mother',
5 'Fast cheetah hunting gazelle',
6 ]
7})
8
9# Text length
10df['text_length'] = df['description'].str.len()
11df['word_count'] = df['description'].str.split().str.len()
12
13# Keyword presence
14df['has_river'] = df['description'].str.contains('river').astype(int)
15df['has_hunting'] = df['description'].str.contains('hunt').astype(int)
16
17# TF-IDF (for ML)
18from sklearn.feature_extraction.text import TfidfVectorizer
19tfidf = TfidfVectorizer(max_features=100)
20tfidf_features = tfidf.fit_transform(df['description'])1from sklearn.pipeline import Pipeline
2from sklearn.preprocessing import StandardScaler, OneHotEncoder
3from sklearn.compose import ColumnTransformer
4
5# Define transformations
6numeric_features = ['population', 'area_km2']
7categorical_features = ['habitat']
8
9preprocessor = ColumnTransformer([
10 ('num', StandardScaler(), numeric_features),
11 ('cat', OneHotEncoder(drop='first'), categorical_features)
12])
13
14# Usage in a pipeline
15pipeline = Pipeline([
16 ('preprocessor', preprocessor),
17 # ('model', SomeModel())
18])