"""Tests para adf_kpss_stationarity.""" import numpy as np from adf_kpss_stationarity import adf_kpss_stationarity def test_random_walk_es_no_estacionario(): # Random walk = suma acumulada de ruido: tiene raiz unitaria. rng = np.random.default_rng(123) paseo = np.cumsum(rng.normal(0.0, 1.0, 400)).tolist() res = adf_kpss_stationarity(paseo) assert res["verdict"] == "non_stationary" assert res["adf"]["stationary"] is False assert res["kpss"]["stationary"] is False def test_ruido_blanco_es_estacionario(): # Ruido blanco gaussiano: estacionario por construccion. rng = np.random.default_rng(42) ruido = rng.normal(0.0, 1.0, 400).tolist() res = adf_kpss_stationarity(ruido) assert res["verdict"] == "stationary" assert res["adf"]["stationary"] is True assert res["kpss"]["stationary"] is True assert res["warning"] is None def test_serie_con_tendencia_no_es_estacionaria(): # Tendencia lineal determinista + ruido pequeno: KPSS la marca no estacionaria. rng = np.random.default_rng(7) serie = [0.1 * i + rng.normal(0, 0.5) for i in range(300)] res = adf_kpss_stationarity(serie) assert res["verdict"] != "stationary" assert res["warning"] is not None def test_muestra_insuficiente_devuelve_nota(): res = adf_kpss_stationarity([1, 2, 3, 4, 5]) assert res["n"] == 5 assert res["note"] == "datos insuficientes" assert res["verdict"] is None def test_descarta_none_y_nan(): rng = np.random.default_rng(1) base = rng.normal(0, 1, 200).tolist() sucio = [] for i, v in enumerate(base): sucio.append(v) if i % 20 == 0: sucio.append(None) sucio.append(float("nan")) res = adf_kpss_stationarity(sucio) assert res["n"] == 200 # las None/NaN no cuentan def test_warning_presente_si_no_estacionaria(): # Tendencia lineal fuerte: garantiza no estacionariedad (verdict != stationary). rng = np.random.default_rng(99) serie = [0.5 * i + rng.normal(0, 0.3) for i in range(300)] res = adf_kpss_stationarity(serie) assert res["verdict"] != "stationary" assert res["warning"] is not None assert "espuria" in res["warning"].lower() def test_estructura_basica_del_dict(): rng = np.random.default_rng(5) ruido = rng.normal(0, 1, 100).tolist() res = adf_kpss_stationarity(ruido) for key in ("n", "alpha", "adf", "kpss", "verdict"): assert key in res for sub in ("stat", "p_value", "lags", "stationary", "conclusion"): assert sub in res["adf"] assert sub in res["kpss"]