""" Test DOY reset logic for harvest detection. Verify that DOY resets to 1, 2, 3, ... after harvest is detected. """ import sys from pathlib import Path sys.path.insert(0, str(Path.cwd())) import pandas as pd import numpy as np from harvest_date_pred_utils import extract_features, load_model_and_config import torch # Load sample data ci_data = pd.read_csv('../laravel_app/storage/app/angata/Data/extracted_ci/ci_data_for_python/ci_data_for_python.csv') ci_data['Date'] = pd.to_datetime(ci_data['Date']) # Get field 779 data field_779 = ci_data[ci_data['field'] == '779'].reset_index(drop=True) print(f"Field 779: {len(field_779)} days of data") print(f"Date range: {field_779['Date'].min().date()} to {field_779['Date'].max().date()}\n") # Load model config model, config, scalers = load_model_and_config(Path.cwd()) # Test 1: First season (season_anchor_day = 0) print("=" * 80) print("TEST 1: First season (season_anchor_day=0, lookback_start=0)") print("=" * 80) window = field_779.iloc[0:20].copy().reset_index(drop=True) features = extract_features(window, config['features'], ci_column='FitData', season_anchor_day=0, lookback_start=0) # Extract DOY_normalized column (index 13 or find it) feature_names = config['features'] doy_idx = feature_names.index('DOY_normalized') if 'DOY_normalized' in feature_names else -1 if doy_idx >= 0: doy_values = (features[:, doy_idx] * 450).astype(int) # Denormalize print(f"Window size: {len(window)} days") print(f"DOY values: {doy_values[:10]}") print(f"Expected: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]") assert list(doy_values[:10]) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "DOY not incrementing correctly!" print("✓ DOY incrementing correctly for first season\n") # Test 2: After harvest detected at day 100, next season starts print("=" * 80) print("TEST 2: After harvest at day 100, new season starts (season_anchor_day=101, lookback_start=101)") print("=" * 80) harvest_day = 100 window = field_779.iloc[harvest_day:harvest_day+20].copy().reset_index(drop=True) features = extract_features(window, config['features'], ci_column='FitData', season_anchor_day=harvest_day+1, lookback_start=harvest_day+1) if doy_idx >= 0: doy_values = (features[:, doy_idx] * 450).astype(int) # Denormalize print(f"Window size: {len(window)} days (starting at day {harvest_day})") print(f"DOY values: {doy_values[:10]}") print(f"Expected: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] (fresh season)") assert list(doy_values[:10]) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "DOY not reset after harvest!" print("✓ DOY reset correctly for new season\n") print("=" * 80) print("ALL TESTS PASSED! DOY logic is correct.") print("=" * 80)