File size: 2,398 Bytes
ea6f215
 
 
 
 
 
7b0e417
ea6f215
 
7b0e417
 
 
 
ea6f215
 
7b0e417
ea6f215
7b0e417
ea6f215
 
7b0e417
 
 
 
 
573118d
7b0e417
ea6f215
 
 
7b0e417
 
 
ea6f215
 
 
7b0e417
ea6f215
 
7b0e417
 
 
ea6f215
 
7b0e417
 
 
 
 
 
ea6f215
 
 
7b0e417
ea6f215
 
7b0e417
ea6f215
7b0e417
ea6f215
7b0e417
ea6f215
7b0e417
 
ea6f215
7b0e417
 
ea6f215
 
 
 
 
 
 
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
import pandas as pd
import numpy as np
import sys
import os

# Add project root to path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from src.features import (
    FeatureEngineer,
    DateTransformation,
    FourierSeriesSeasonality,
    EasterFeature,
)


def test_date_transformation():
    df = pd.DataFrame({"Date": ["2015-01-01", "2015-01-02"]})
    eng = FeatureEngineer(DateTransformation())
    df_transformed = eng.apply_feature_engineering(df)

    assert "Year" in df_transformed.columns
    assert "Month" in df_transformed.columns
    assert df_transformed["Year"].iloc[0] == 2015
    assert df_transformed["Month"].iloc[0] == 1
    assert df_transformed["DayOfWeek"].iloc[0] == 4  # 2015-01-01 was Thursday


def test_fourier_seasonality():
    # Create a 1-year range
    dates = pd.date_range(start="2015-01-01", periods=366, freq="D")
    df = pd.DataFrame({"Date": dates})

    order = 3
    eng = FeatureEngineer(FourierSeriesSeasonality(period=365.25, order=order))
    df_transformed = eng.apply_feature_engineering(df)

    # Check if all terms exist
    for i in range(1, order + 1):
        assert f"fourier_sin_{i}" in df_transformed.columns
        assert f"fourier_cos_{i}" in df_transformed.columns

    # Check periodicity roughly (first and last day of a year should be similar)
    # 2015-01-01 and 2016-01-01
    assert np.allclose(
        df_transformed["fourier_sin_1"].iloc[0],
        df_transformed["fourier_sin_1"].iloc[365],
        atol=0.1,
    )


def test_easter_feature():
    # 2014-04-20 was Easter
    df = pd.DataFrame({"Date": ["2014-04-13", "2014-04-20", "2014-04-27"]})
    eng = FeatureEngineer(EasterFeature())
    df_transformed = eng.apply_feature_engineering(df)

    # Easter day (index 1) should have easter_effect = 1
    assert df_transformed["easter_effect"].iloc[1] == 1
    # 7 days before (index 0) should be included in window (e.g., +/- 7 days)
    assert df_transformed["easter_effect"].iloc[0] == 1
    # 7 days after (index 2) should be included
    assert df_transformed["easter_effect"].iloc[2] == 1

    # Check days_to_easter
    assert df_transformed["days_to_easter"].iloc[1] == 0


if __name__ == "__main__":
    # Manual run if pytest not used
    test_date_transformation()
    test_fourier_seasonality()
    test_easter_feature()
    print("All feature engineering tests passed!")