Rossmann-Store-Sales / tests /test_features.py
ymlin105's picture
Initial Production Release: End-to-End Rossmann Sales Forecasting System
ea6f215
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!")