Spaces:
Sleeping
Sleeping
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!")
|