Spaces:
Build error
Build error
| 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] == 3 # 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!") | |