diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 65d63e40c..561cde407 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,9 +28,9 @@ jobs: python-version: ["3.10"] test-subset: - tests/model - - tests/statespace/test_statespace.py - - tests/statespace/test_kalman_filter.py - - tests/statespace --ignore tests/statespace/test_statespace.py --ignore tests/statespace/test_kalman_filter.py + - tests/statespace/core/test_statespace.py + - tests/statespace/filters/test_kalman_filter.py + - tests/statespace --ignore tests/statespace/core/test_statespace.py --ignore tests/statespace/filters/test_kalman_filter.py - tests/distributions - tests --ignore tests/model --ignore tests/statespace --ignore tests/distributions fail-fast: false @@ -71,9 +71,9 @@ jobs: python-version: ["3.12"] test-subset: - tests/model - - tests/statespace/test_statespace.py - - tests/statespace/test_kalman_filter.py - - tests/statespace --ignore tests/statespace/test_statespace.py --ignore tests/statespace/test_kalman_filter.py + - tests/statespace/core/test_statespace.py + - tests/statespace/filters/test_kalman_filter.py + - tests/statespace --ignore tests/statespace/core/test_statespace.py --ignore tests/statespace/filters/test_kalman_filter.py - tests/distributions - tests --ignore tests/model --ignore tests/statespace --ignore tests/distributions fail-fast: false diff --git a/notebooks/Exponential Trend Smoothing.ipynb b/notebooks/Exponential Trend Smoothing.ipynb index fff683276..f5f7333fc 100644 --- a/notebooks/Exponential Trend Smoothing.ipynb +++ b/notebooks/Exponential Trend Smoothing.ipynb @@ -3559,7 +3559,7 @@ ], "source": [ "df = (\n", - " pd.read_csv(\"../tests/statespace/test_data/airpassangers.csv\", parse_dates=[\"Month\"])\n", + " pd.read_csv(\"../tests/statespace/_data/airpassangers.csv\", parse_dates=[\"Month\"])\n", " .rename(columns={\"Month\": \"time\", \"#Passengers\": \"passangers\"})\n", " .set_index(\"time\")\n", " .astype(float)\n", diff --git a/notebooks/SARMA Example.ipynb b/notebooks/SARMA Example.ipynb index d65fe718a..7beb981d1 100644 --- a/notebooks/SARMA Example.ipynb +++ b/notebooks/SARMA Example.ipynb @@ -337,17 +337,17 @@ "\n" ], "text/plain": [ - "\u001b[3m Model Requirements \u001b[0m\n", + "\u001B[3m Model Requirements \u001B[0m\n", " \n", - " \u001b[1m \u001b[0m\u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mShape\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mConstraints\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1m Dimensions\u001b[0m\u001b[1m \u001b[0m \n", + " \u001B[1m \u001B[0m\u001B[1mVariable \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mShape\u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mConstraints\u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1m Dimensions\u001B[0m\u001B[1m \u001B[0m \n", " ───────────────────────────────────────────────── \n", - " ar_params \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ar_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " ma_params \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ma_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_state \u001b[3;35mNone\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", + " ar_params \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ar_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " ma_params \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ma_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_state \u001B[3;35mNone\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", " \n", - "\u001b[2;3mThese parameters should be assigned priors inside a\u001b[0m\n", - "\u001b[2;3m PyMC model block before calling the \u001b[0m\n", - "\u001b[2;3m build_statespace_graph method. \u001b[0m\n" + "\u001B[2;3mThese parameters should be assigned priors inside a\u001B[0m\n", + "\u001B[2;3m PyMC model block before calling the \u001B[0m\n", + "\u001B[2;3m build_statespace_graph method. \u001B[0m\n" ] }, "metadata": {}, @@ -1805,18 +1805,18 @@ "\n" ], "text/plain": [ - "\u001b[3m Model Requirements \u001b[0m\n", + "\u001B[3m Model Requirements \u001B[0m\n", " \n", - " \u001b[1m \u001b[0m\u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mShape\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mConstraints\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1m Dimensions\u001b[0m\u001b[1m \u001b[0m \n", + " \u001B[1m \u001B[0m\u001B[1mVariable \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mShape\u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mConstraints\u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1m Dimensions\u001B[0m\u001B[1m \u001B[0m \n", " ───────────────────────────────────────────────── \n", - " ar_params \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ar_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " ma_params \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ma_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_state \u001b[3;35mNone\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", - " sigma_obs \u001b[3;35mNone\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", + " ar_params \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ar_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " ma_params \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ma_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_state \u001B[3;35mNone\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", + " sigma_obs \u001B[3;35mNone\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", " \n", - "\u001b[2;3mThese parameters should be assigned priors inside a\u001b[0m\n", - "\u001b[2;3m PyMC model block before calling the \u001b[0m\n", - "\u001b[2;3m build_statespace_graph method. \u001b[0m\n" + "\u001B[2;3mThese parameters should be assigned priors inside a\u001B[0m\n", + "\u001B[2;3m PyMC model block before calling the \u001B[0m\n", + "\u001B[2;3m build_statespace_graph method. \u001B[0m\n" ] }, "metadata": {}, @@ -2331,7 +2331,7 @@ ], "source": [ "airpass = pd.read_csv(\n", - " \"../tests/statespace/test_data/airpass.csv\",\n", + " \"../tests/statespace/_data/airpass.csv\",\n", " parse_dates=True,\n", " date_format=\"%Y %b\",\n", " index_col=0,\n", @@ -2414,20 +2414,20 @@ "\n" ], "text/plain": [ - "\u001b[3m Model Requirements \u001b[0m\n", + "\u001B[3m Model Requirements \u001B[0m\n", " \n", - " \u001b[1m \u001b[0m\u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mShape \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mConstraints \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1m Dimensions\u001b[0m\u001b[1m \u001b[0m \n", + " \u001B[1m \u001B[0m\u001B[1mVariable \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mShape \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mConstraints \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1m Dimensions\u001B[0m\u001B[1m \u001B[0m \n", " ───────────────────────────────────────────────────────────────────────────────── \n", - " x0 \u001b[1m(\u001b[0m\u001b[1;36m28\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'state'\u001b[0m,\u001b[1m)\u001b[0m \n", - " P0 \u001b[1m(\u001b[0m\u001b[1;36m28\u001b[0m, \u001b[1;36m28\u001b[0m\u001b[1m)\u001b[0m Positive Semi-definite \u001b[1m(\u001b[0m\u001b[32m'state'\u001b[0m, \u001b[32m'state_aux'\u001b[0m\u001b[1m)\u001b[0m \n", - " ar_params \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ar_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " ma_params \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ma_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " seasonal_ar_params \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'seasonal_ar_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " seasonal_ma_params \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m \u001b[3;35mNone\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'seasonal_ma_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_state \u001b[3;35mNone\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", + " x0 \u001B[1m(\u001B[0m\u001B[1;36m28\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'state'\u001B[0m,\u001B[1m)\u001B[0m \n", + " P0 \u001B[1m(\u001B[0m\u001B[1;36m28\u001B[0m, \u001B[1;36m28\u001B[0m\u001B[1m)\u001B[0m Positive Semi-definite \u001B[1m(\u001B[0m\u001B[32m'state'\u001B[0m, \u001B[32m'state_aux'\u001B[0m\u001B[1m)\u001B[0m \n", + " ar_params \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ar_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " ma_params \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ma_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " seasonal_ar_params \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'seasonal_ar_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " seasonal_ma_params \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m \u001B[3;35mNone\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'seasonal_ma_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_state \u001B[3;35mNone\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", " \n", - "\u001b[2;3mThese parameters should be assigned priors inside a PyMC model block before calling\u001b[0m\n", - "\u001b[2;3m the build_statespace_graph method. \u001b[0m\n" + "\u001B[2;3mThese parameters should be assigned priors inside a PyMC model block before calling\u001B[0m\n", + "\u001B[2;3m the build_statespace_graph method. \u001B[0m\n" ] }, "metadata": {}, diff --git a/notebooks/Structural Timeseries Modeling.ipynb b/notebooks/Structural Timeseries Modeling.ipynb index ff47101ab..0b388fb9e 100644 --- a/notebooks/Structural Timeseries Modeling.ipynb +++ b/notebooks/Structural Timeseries Modeling.ipynb @@ -1288,7 +1288,7 @@ } ], "source": [ - "nile = pd.read_csv(\"../tests/statespace/test_data/nile.csv\", dtype={\"x\": \"float64\"})\n", + "nile = pd.read_csv(\"../tests/statespace/_data/nile.csv\", dtype={\"x\": \"float64\"})\n", "nile.index = pd.date_range(start=\"1871-01-01\", end=\"1970-01-01\", freq=\"YS-JAN\")\n", "nile.rename(columns={\"x\": \"height\"}, inplace=True)\n", "nile = (nile - nile.mean()) / nile.std()\n", @@ -1328,19 +1328,19 @@ "\n" ], "text/plain": [ - "\u001b[3m Model Requirements \u001b[0m\n", + "\u001B[3m Model Requirements \u001B[0m\n", " \n", - " \u001b[1m \u001b[0m\u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mShape \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mConstraints \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1m Dimensions\u001b[0m\u001b[1m \u001b[0m \n", + " \u001B[1m \u001B[0m\u001B[1mVariable \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mShape \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mConstraints \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1m Dimensions\u001B[0m\u001B[1m \u001B[0m \n", " ────────────────────────────────────────────────────────────────────────── \n", - " initial_trend \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'trend_state'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_trend \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m Positive \u001b[1m(\u001b[0m\u001b[32m'trend_shock'\u001b[0m,\u001b[1m)\u001b[0m \n", - " ar_params \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ar_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_ar \u001b[1m(\u001b[0m\u001b[1m)\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", - " sigma_obs \u001b[1m(\u001b[0m\u001b[1m)\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", - " P0 \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m Positive semi-definite \u001b[1m(\u001b[0m\u001b[32m'state'\u001b[0m, \u001b[32m'state_aux'\u001b[0m\u001b[1m)\u001b[0m \n", + " initial_trend \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'trend_state'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_trend \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m Positive \u001B[1m(\u001B[0m\u001B[32m'trend_shock'\u001B[0m,\u001B[1m)\u001B[0m \n", + " ar_params \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ar_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_ar \u001B[1m(\u001B[0m\u001B[1m)\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", + " sigma_obs \u001B[1m(\u001B[0m\u001B[1m)\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", + " P0 \u001B[1m(\u001B[0m\u001B[1;36m3\u001B[0m, \u001B[1;36m3\u001B[0m\u001B[1m)\u001B[0m Positive semi-definite \u001B[1m(\u001B[0m\u001B[32m'state'\u001B[0m, \u001B[32m'state_aux'\u001B[0m\u001B[1m)\u001B[0m \n", " \n", - "\u001b[2;3mThese parameters should be assigned priors inside a PyMC model block before \u001b[0m\n", - "\u001b[2;3m calling the build_statespace_graph method. \u001b[0m\n" + "\u001B[2;3mThese parameters should be assigned priors inside a PyMC model block before \u001B[0m\n", + "\u001B[2;3m calling the build_statespace_graph method. \u001B[0m\n" ] }, "metadata": {}, @@ -1986,7 +1986,7 @@ ], "source": [ "airpass = pd.read_csv(\n", - " \"../tests/statespace/test_data/airpass.csv\",\n", + " \"../tests/statespace/_data/airpass.csv\",\n", " parse_dates=True,\n", " date_format=\"%Y %b\",\n", " index_col=0,\n", @@ -2028,18 +2028,18 @@ "\n" ], "text/plain": [ - "\u001b[3m Model Requirements \u001b[0m\n", + "\u001B[3m Model Requirements \u001B[0m\n", " \n", - " \u001b[1m \u001b[0m\u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mShape \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mConstraints \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1m Dimensions\u001b[0m\u001b[1m \u001b[0m \n", + " \u001B[1m \u001B[0m\u001B[1mVariable \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mShape \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mConstraints \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1m Dimensions\u001B[0m\u001B[1m \u001B[0m \n", " ──────────────────────────────────────────────────────────────────────────── \n", - " initial_trend \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'trend_state'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_trend \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m Positive \u001b[1m(\u001b[0m\u001b[32m'trend_shock'\u001b[0m,\u001b[1m)\u001b[0m \n", - " annual \u001b[1m(\u001b[0m\u001b[1;36m11\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'annual_state'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_annual \u001b[1m(\u001b[0m\u001b[1m)\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", - " P0 \u001b[1m(\u001b[0m\u001b[1;36m14\u001b[0m, \u001b[1;36m14\u001b[0m\u001b[1m)\u001b[0m Positive semi-definite \u001b[1m(\u001b[0m\u001b[32m'state'\u001b[0m, \u001b[32m'state_aux'\u001b[0m\u001b[1m)\u001b[0m \n", + " initial_trend \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'trend_state'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_trend \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m Positive \u001B[1m(\u001B[0m\u001B[32m'trend_shock'\u001B[0m,\u001B[1m)\u001B[0m \n", + " annual \u001B[1m(\u001B[0m\u001B[1;36m11\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'annual_state'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_annual \u001B[1m(\u001B[0m\u001B[1m)\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", + " P0 \u001B[1m(\u001B[0m\u001B[1;36m14\u001B[0m, \u001B[1;36m14\u001B[0m\u001B[1m)\u001B[0m Positive semi-definite \u001B[1m(\u001B[0m\u001B[32m'state'\u001B[0m, \u001B[32m'state_aux'\u001B[0m\u001B[1m)\u001B[0m \n", " \n", - "\u001b[2;3m These parameters should be assigned priors inside a PyMC model block before \u001b[0m\n", - "\u001b[2;3m calling the build_statespace_graph method. \u001b[0m\n" + "\u001B[2;3m These parameters should be assigned priors inside a PyMC model block before \u001B[0m\n", + "\u001B[2;3m calling the build_statespace_graph method. \u001B[0m\n" ] }, "metadata": {}, @@ -2697,21 +2697,21 @@ "\n" ], "text/plain": [ - "\u001b[3m Model Requirements \u001b[0m\n", + "\u001B[3m Model Requirements \u001B[0m\n", " \n", - " \u001b[1m \u001b[0m\u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mShape \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mConstraints \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1m Dimensions\u001b[0m\u001b[1m \u001b[0m \n", + " \u001B[1m \u001B[0m\u001B[1mVariable \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mShape \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1mConstraints \u001B[0m\u001B[1m \u001B[0m \u001B[1m \u001B[0m\u001B[1m Dimensions\u001B[0m\u001B[1m \u001B[0m \n", " ─────────────────────────────────────────────────────────────────────────────── \n", - " initial_trend \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'trend_state'\u001b[0m,\u001b[1m)\u001b[0m \n", - " beta_exog \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'exog_state'\u001b[0m,\u001b[1m)\u001b[0m \n", - " ar_params \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m(\u001b[0m\u001b[32m'ar_lag'\u001b[0m,\u001b[1m)\u001b[0m \n", - " sigma_ar \u001b[1m(\u001b[0m\u001b[1m)\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", - " sigma_obs_error \u001b[1m(\u001b[0m\u001b[1m)\u001b[0m Positive \u001b[3;35mNone\u001b[0m \n", - " P0 \u001b[1m(\u001b[0m\u001b[1;36m4\u001b[0m, \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m Positive semi-definite \u001b[1m(\u001b[0m\u001b[32m'state'\u001b[0m, \u001b[32m'state_aux'\u001b[0m\u001b[1m)\u001b[0m \n", + " initial_trend \u001B[1m(\u001B[0m\u001B[1;36m2\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'trend_state'\u001B[0m,\u001B[1m)\u001B[0m \n", + " beta_exog \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'exog_state'\u001B[0m,\u001B[1m)\u001B[0m \n", + " ar_params \u001B[1m(\u001B[0m\u001B[1;36m1\u001B[0m,\u001B[1m)\u001B[0m \u001B[1m(\u001B[0m\u001B[32m'ar_lag'\u001B[0m,\u001B[1m)\u001B[0m \n", + " sigma_ar \u001B[1m(\u001B[0m\u001B[1m)\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", + " sigma_obs_error \u001B[1m(\u001B[0m\u001B[1m)\u001B[0m Positive \u001B[3;35mNone\u001B[0m \n", + " P0 \u001B[1m(\u001B[0m\u001B[1;36m4\u001B[0m, \u001B[1;36m4\u001B[0m\u001B[1m)\u001B[0m Positive semi-definite \u001B[1m(\u001B[0m\u001B[32m'state'\u001B[0m, \u001B[32m'state_aux'\u001B[0m\u001B[1m)\u001B[0m \n", " \n", - " data_exog \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m pm.Data \u001b[1m(\u001b[0m\u001b[32m'time'\u001b[0m, \u001b[32m'exog_state'\u001b[0m\u001b[1m)\u001b[0m \n", + " data_exog \u001B[1m(\u001B[0m\u001B[3;35mNone\u001B[0m, \u001B[1;36m1\u001B[0m\u001B[1m)\u001B[0m pm.Data \u001B[1m(\u001B[0m\u001B[32m'time'\u001B[0m, \u001B[32m'exog_state'\u001B[0m\u001B[1m)\u001B[0m \n", " \n", - "\u001b[2;3m These parameters should be assigned priors inside a PyMC model block before \u001b[0m\n", - "\u001b[2;3m calling the build_statespace_graph method. \u001b[0m\n" + "\u001B[2;3m These parameters should be assigned priors inside a PyMC model block before \u001B[0m\n", + "\u001B[2;3m calling the build_statespace_graph method. \u001B[0m\n" ] }, "metadata": {}, diff --git a/tests/statespace/test_data/airpass.csv b/tests/statespace/_data/airpass.csv similarity index 100% rename from tests/statespace/test_data/airpass.csv rename to tests/statespace/_data/airpass.csv diff --git a/tests/statespace/test_data/airpassangers.csv b/tests/statespace/_data/airpassangers.csv similarity index 100% rename from tests/statespace/test_data/airpassangers.csv rename to tests/statespace/_data/airpassangers.csv diff --git a/tests/statespace/test_data/nile.csv b/tests/statespace/_data/nile.csv similarity index 100% rename from tests/statespace/test_data/nile.csv rename to tests/statespace/_data/nile.csv diff --git a/tests/statespace/test_data/statsmodels_macrodata_processed.csv b/tests/statespace/_data/statsmodels_macrodata_processed.csv similarity index 100% rename from tests/statespace/test_data/statsmodels_macrodata_processed.csv rename to tests/statespace/_data/statsmodels_macrodata_processed.csv diff --git a/tests/statespace/utilities/__init__.py b/tests/statespace/core/__init__.py similarity index 100% rename from tests/statespace/utilities/__init__.py rename to tests/statespace/core/__init__.py diff --git a/tests/statespace/test_representation.py b/tests/statespace/core/test_representation.py similarity index 97% rename from tests/statespace/test_representation.py rename to tests/statespace/core/test_representation.py index 4a75f11c8..653867585 100644 --- a/tests/statespace/test_representation.py +++ b/tests/statespace/core/test_representation.py @@ -7,8 +7,8 @@ from numpy.testing import assert_allclose from pymc_extras.statespace.core.representation import PytensorRepresentation -from tests.statespace.utilities.shared_fixtures import TEST_SEED -from tests.statespace.utilities.test_helpers import fast_eval, make_test_inputs +from tests.statespace.shared_fixtures import TEST_SEED +from tests.statespace.test_utilities import fast_eval, make_test_inputs floatX = pytensor.config.floatX atol = 1e-12 if floatX == "float64" else 1e-6 diff --git a/tests/statespace/test_statespace.py b/tests/statespace/core/test_statespace.py similarity index 99% rename from tests/statespace/test_statespace.py rename to tests/statespace/core/test_statespace.py index 46a1210d4..6a77c1514 100644 --- a/tests/statespace/test_statespace.py +++ b/tests/statespace/core/test_statespace.py @@ -18,10 +18,10 @@ MATRIX_NAMES, SMOOTHER_OUTPUT_NAMES, ) -from tests.statespace.utilities.shared_fixtures import ( +from tests.statespace.shared_fixtures import ( rng, ) -from tests.statespace.utilities.test_helpers import ( +from tests.statespace.test_utilities import ( fast_eval, load_nile_test_data, make_test_inputs, diff --git a/tests/statespace/test_statespace_JAX.py b/tests/statespace/core/test_statespace_JAX.py similarity index 95% rename from tests/statespace/test_statespace_JAX.py rename to tests/statespace/core/test_statespace_JAX.py index 9e8d9975f..b5750283b 100644 --- a/tests/statespace/test_statespace_JAX.py +++ b/tests/statespace/core/test_statespace_JAX.py @@ -13,14 +13,14 @@ MATRIX_NAMES, SMOOTHER_OUTPUT_NAMES, ) -from tests.statespace.test_statespace import ( # pylint: disable=unused-import +from tests.statespace.core.test_statespace import ( # pylint: disable=unused-import exog_ss_mod, ss_mod, ) -from tests.statespace.utilities.shared_fixtures import ( # pylint: disable=unused-import +from tests.statespace.shared_fixtures import ( # pylint: disable=unused-import rng, ) -from tests.statespace.utilities.test_helpers import load_nile_test_data +from tests.statespace.test_utilities import load_nile_test_data pytest.importorskip("jax") pytest.importorskip("numpyro") diff --git a/tests/statespace/filters/__init__.py b/tests/statespace/filters/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/statespace/test_distributions.py b/tests/statespace/filters/test_distributions.py similarity index 98% rename from tests/statespace/test_distributions.py rename to tests/statespace/filters/test_distributions.py index 4dd9c0c48..1958d0bf0 100644 --- a/tests/statespace/test_distributions.py +++ b/tests/statespace/filters/test_distributions.py @@ -18,10 +18,10 @@ OBS_STATE_DIM, TIME_DIM, ) -from tests.statespace.utilities.shared_fixtures import ( # pylint: disable=unused-import +from tests.statespace.shared_fixtures import ( # pylint: disable=unused-import rng, ) -from tests.statespace.utilities.test_helpers import ( +from tests.statespace.test_utilities import ( delete_rvs_from_model, fast_eval, load_nile_test_data, diff --git a/tests/statespace/test_kalman_filter.py b/tests/statespace/filters/test_kalman_filter.py similarity index 98% rename from tests/statespace/test_kalman_filter.py rename to tests/statespace/filters/test_kalman_filter.py index 6c0bc18c6..b3ea0a618 100644 --- a/tests/statespace/test_kalman_filter.py +++ b/tests/statespace/filters/test_kalman_filter.py @@ -12,10 +12,10 @@ UnivariateFilter, ) from pymc_extras.statespace.filters.kalman_filter import BaseFilter -from tests.statespace.utilities.shared_fixtures import ( # pylint: disable=unused-import +from tests.statespace.shared_fixtures import ( # pylint: disable=unused-import rng, ) -from tests.statespace.utilities.test_helpers import ( +from tests.statespace.test_utilities import ( get_expected_shape, get_sm_state_from_output_name, initialize_filter, diff --git a/tests/statespace/models/__init__.py b/tests/statespace/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/statespace/test_ETS.py b/tests/statespace/models/test_ETS.py similarity index 99% rename from tests/statespace/test_ETS.py rename to tests/statespace/models/test_ETS.py index 23c262eed..cdb64ad07 100644 --- a/tests/statespace/test_ETS.py +++ b/tests/statespace/models/test_ETS.py @@ -9,8 +9,8 @@ from pymc_extras.statespace.models.ETS import BayesianETS from pymc_extras.statespace.utils.constants import LONG_MATRIX_NAMES -from tests.statespace.utilities.shared_fixtures import rng -from tests.statespace.utilities.test_helpers import load_nile_test_data +from tests.statespace.shared_fixtures import rng +from tests.statespace.test_utilities import load_nile_test_data @pytest.fixture(scope="session") diff --git a/tests/statespace/test_SARIMAX.py b/tests/statespace/models/test_SARIMAX.py similarity index 98% rename from tests/statespace/test_SARIMAX.py rename to tests/statespace/models/test_SARIMAX.py index 7c9b831e0..e8d295ca7 100644 --- a/tests/statespace/test_SARIMAX.py +++ b/tests/statespace/models/test_SARIMAX.py @@ -18,10 +18,10 @@ SARIMAX_STATE_STRUCTURES, SHORT_NAME_TO_LONG, ) -from tests.statespace.utilities.shared_fixtures import ( # pylint: disable=unused-import +from tests.statespace.shared_fixtures import ( # pylint: disable=unused-import rng, ) -from tests.statespace.utilities.test_helpers import ( +from tests.statespace.test_utilities import ( load_nile_test_data, make_stationary_params, simulate_from_numpy_model, diff --git a/tests/statespace/test_VARMAX.py b/tests/statespace/models/test_VARMAX.py similarity index 97% rename from tests/statespace/test_VARMAX.py rename to tests/statespace/models/test_VARMAX.py index d28f2c2c4..5be836310 100644 --- a/tests/statespace/test_VARMAX.py +++ b/tests/statespace/models/test_VARMAX.py @@ -12,7 +12,7 @@ from pymc_extras.statespace import BayesianVARMAX from pymc_extras.statespace.utils.constants import SHORT_NAME_TO_LONG -from tests.statespace.utilities.shared_fixtures import ( # pylint: disable=unused-import +from tests.statespace.shared_fixtures import ( # pylint: disable=unused-import rng, ) @@ -26,7 +26,7 @@ @pytest.fixture(scope="session") def data(): df = pd.read_csv( - "tests/statespace/test_data/statsmodels_macrodata_processed.csv", + "tests/statespace/_data/statsmodels_macrodata_processed.csv", index_col=0, parse_dates=True, ).astype(floatX) diff --git a/tests/statespace/test_structural.py b/tests/statespace/models/test_structural.py similarity index 99% rename from tests/statespace/test_structural.py rename to tests/statespace/models/test_structural.py index 1aae6cd35..9aacb70fd 100644 --- a/tests/statespace/test_structural.py +++ b/tests/statespace/models/test_structural.py @@ -2,8 +2,6 @@ import warnings from collections import defaultdict -from copyreg import remove_extension -from typing import Optional import numpy as np import pandas as pd @@ -27,10 +25,10 @@ SHOCK_DIM, SHORT_NAME_TO_LONG, ) -from tests.statespace.utilities.shared_fixtures import ( # pylint: disable=unused-import +from tests.statespace.shared_fixtures import ( # pylint: disable=unused-import rng, ) -from tests.statespace.utilities.test_helpers import ( +from tests.statespace.test_utilities import ( assert_pattern_repeats, simulate_from_numpy_model, unpack_symbolic_matrices_with_params, diff --git a/tests/statespace/utilities/shared_fixtures.py b/tests/statespace/shared_fixtures.py similarity index 100% rename from tests/statespace/utilities/shared_fixtures.py rename to tests/statespace/shared_fixtures.py diff --git a/tests/statespace/utilities/statsmodel_local_level.py b/tests/statespace/statsmodel_local_level.py similarity index 100% rename from tests/statespace/utilities/statsmodel_local_level.py rename to tests/statespace/statsmodel_local_level.py diff --git a/tests/statespace/utilities/test_helpers.py b/tests/statespace/test_utilities.py similarity index 96% rename from tests/statespace/utilities/test_helpers.py rename to tests/statespace/test_utilities.py index c6170f880..301c97a74 100644 --- a/tests/statespace/utilities/test_helpers.py +++ b/tests/statespace/test_utilities.py @@ -1,3 +1,10 @@ +""" +Tools and utilities shared by statespace tests. + +There are no actual tests in this file -- the name is chosen to trigger automatic discovery of the sub-folders by +pytest. +""" + import numpy as np import pandas as pd import pytensor @@ -12,7 +19,7 @@ MATRIX_NAMES, SHORT_NAME_TO_LONG, ) -from tests.statespace.utilities.statsmodel_local_level import LocalLinearTrend +from tests.statespace.statsmodel_local_level import LocalLinearTrend floatX = pytensor.config.floatX @@ -20,7 +27,7 @@ def load_nile_test_data(): from importlib.metadata import version - nile = pd.read_csv("tests/statespace/test_data/nile.csv", dtype={"x": floatX}) + nile = pd.read_csv("tests/statespace/_data/nile.csv", dtype={"x": floatX}) major, minor, rev = map(int, version("pandas").split(".")) if major >= 2 and minor >= 2 and rev >= 0: freq_str = "YS-JAN" diff --git a/tests/statespace/utils/__init__.py b/tests/statespace/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/statespace/test_coord_assignment.py b/tests/statespace/utils/test_coord_assignment.py similarity index 98% rename from tests/statespace/test_coord_assignment.py rename to tests/statespace/utils/test_coord_assignment.py index 40aaec124..40a8d288d 100644 --- a/tests/statespace/test_coord_assignment.py +++ b/tests/statespace/utils/test_coord_assignment.py @@ -19,7 +19,7 @@ NO_FREQ_INFO_WARNING, NO_TIME_INDEX_WARNING, ) -from tests.statespace.utilities.test_helpers import load_nile_test_data +from tests.statespace.test_utilities import load_nile_test_data function_names = ["pandas_date_freq", "pandas_date_nofreq", "pandas_nodate", "numpy", "pytensor"] expected_warning = [