from __future__ import annotations import os import sys import unittest import pandas as pd sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) from data.shared_baseline import _blend_entity_frames, _normalize_name class TestSharedBaseline(unittest.TestCase): def test_normalize_name_matches_first_last_and_last_first(self) -> None: self.assertEqual(_normalize_name("Eduardo Rodriguez"), _normalize_name("Rodriguez, Eduardo")) def test_blend_entity_frames_prefers_prior_when_current_sample_is_small(self) -> None: prior_df = pd.DataFrame( [ {"player_name": "Slugger Sam", "game_date": "2025-09-01", "source_season": 2025, "event_key": "p1"}, {"player_name": "Slugger Sam", "game_date": "2025-08-01", "source_season": 2025, "event_key": "p2"}, {"player_name": "Slugger Sam", "game_date": "2024-09-01", "source_season": 2024, "event_key": "p3"}, {"player_name": "Slugger Sam", "game_date": "2024-08-01", "source_season": 2024, "event_key": "p4"}, {"player_name": "Slugger Sam", "game_date": "2023-09-01", "source_season": 2023, "event_key": "p5"}, ] ) season_df = pd.DataFrame( [ {"player_name": "Slugger Sam", "game_date": "2026-03-20", "source_season": 2026, "event_key": "c1"}, ] ) prior_df["game_date"] = pd.to_datetime(prior_df["game_date"]) season_df["game_date"] = pd.to_datetime(season_df["game_date"]) blended_df, meta_df = _blend_entity_frames( prior_df=prior_df, season_df=season_df, blend_k=260.0, role_label="batter", ) self.assertFalse(blended_df.empty) self.assertEqual(len(meta_df), 1) meta = meta_df.iloc[0] self.assertEqual(meta["baseline_mode"], "blended") self.assertGreater(float(meta["prior_weight"]), float(meta["season_2026_weight"])) self.assertEqual(meta["baseline_driver"], "prior_led") self.assertTrue(bool(meta["rolling_overlay_active"])) def test_blend_entity_frames_uses_current_only_when_no_prior_exists(self) -> None: season_df = pd.DataFrame( [ {"player_name": "Ace Pitcher", "game_date": "2026-03-20", "source_season": 2026, "event_key": "c1"}, {"player_name": "Ace Pitcher", "game_date": "2026-03-18", "source_season": 2026, "event_key": "c2"}, ] ) season_df["game_date"] = pd.to_datetime(season_df["game_date"]) blended_df, meta_df = _blend_entity_frames( prior_df=pd.DataFrame(columns=season_df.columns), season_df=season_df, blend_k=320.0, role_label="pitcher", ) self.assertEqual(len(blended_df), 2) meta = meta_df.iloc[0] self.assertEqual(meta["baseline_mode"], "current_only") self.assertAlmostEqual(float(meta["season_2026_weight"]), 1.0, places=6) self.assertEqual(meta["baseline_driver"], "current_season_led") if __name__ == "__main__": unittest.main()