diff --git a/docs/changelogs/index.md b/docs/changelogs/index.md new file mode 100644 index 0000000..783afc5 --- /dev/null +++ b/docs/changelogs/index.md @@ -0,0 +1,6 @@ +# Changelog + +Welcome to the FoundationForecast Changelog. Here you will find a list of changes, updates, and improvements for each release. Explore the details of each version below. + +- [v0.1.3](v0.1.3.md) +- [v0.1.2](v0.1.2.md) diff --git a/docs/changelogs/v0.1.2.md b/docs/changelogs/v0.1.2.md new file mode 100644 index 0000000..101e90d --- /dev/null +++ b/docs/changelogs/v0.1.2.md @@ -0,0 +1,26 @@ +### Features + +* **Tafsut foundation model**: Added support for [Tafsut](https://github.com/Tafsut-FM/tafsut), a zero-shot probabilistic univariate time series foundation model. Use it via the `Tafsut` class with checkpoint `Tafsut-FM/tafsut-univariate-base`. + + ```python + import pandas as pd + from foundationforecast import Tafsut + + df = pd.read_csv( + "https://timecopilot.s3.amazonaws.com/public/data/air_passengers.csv", + parse_dates=["ds"], + ) + + model = Tafsut() + fcst_df = model.forecast(df, h=12) + ``` + +* **GIFT-Eval replication experiment**: Added the `experiments/gift-eval` benchmark harness with Modal CI integration and Hugging Face leaderboard verification against published reference results. + +### Fixes + +* Improved quantile sorting, device handling, and model routing across foundation model backends. + +--- + +**Full Changelog**: https://github.com/TimeCopilot/foundationforecast/compare/v0.1.1...v0.1.2 diff --git a/docs/changelogs/v0.1.3.md b/docs/changelogs/v0.1.3.md new file mode 100644 index 0000000..f3b9c1e --- /dev/null +++ b/docs/changelogs/v0.1.3.md @@ -0,0 +1,38 @@ +### Features + +* **TimesFM 3.0 foundation model**: Added support for [`google/timesfm-3.0-pytorch`](https://huggingface.co/google/timesfm-3.0-pytorch) via a new `_TimesFMV3` backend powered by `TimesFM3Evaluator` and `ModelConfig` from [`timecopilot-timesfm>=0.4.0`](https://pypi.org/project/timecopilot-timesfm/). The wrapper treats each series independently (univariate panel mode), matching the existing TimesFM 2.5 integration pattern. + + ```python + import pandas as pd + from foundationforecast import TimesFM + + df = pd.read_csv( + "https://timecopilot.s3.amazonaws.com/public/data/air_passengers.csv", + parse_dates=["ds"], + ) + + model = TimesFM( + repo_id="google/timesfm-3.0-pytorch", + alias="TimesFM-3", + context_length=2048, + ) + fcst_df = model.forecast(df, h=12, freq="MS") + ``` + + **License note:** TimesFM 3.0 pretrained weights are [non-commercial](https://huggingface.co/google/timesfm-3.0-pytorch/blob/main/LICENSE); TimesFM 1.0–2.5 checkpoints remain Apache-2.0. + +* **GIFT-Eval**: Registered `google--timesfm-3.0-pytorch` (reference slug `TimesFM-3`) in the gift-eval model registry and added it to the CI replication subset on `m4_weekly/short`. + +* **TimesFM family notebook**: Added [`timesfm-family` example notebook](../examples/timesfm-family.ipynb) comparing TimesFM 1.0, 2.0, 2.5, and 3.0 with supported prediction intervals. + +### Dependencies + +* Bumped `timecopilot-timesfm` from `>=0.3.0` to `>=0.4.0`. + +### Documentation + +* Updated README, model hub, and `TimesFM` docstrings with TimesFM 3.0 support and non-commercial license citation. + +--- + +**Full Changelog**: https://github.com/TimeCopilot/foundationforecast/compare/v0.1.2...v0.1.3 diff --git a/docs/examples/index.md b/docs/examples/index.md index 71d2f9f..8687b6b 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -17,6 +17,7 @@ For model API details, see the [Model Hub](../model-hub.md). | Notebook | What you'll learn | Prerequisites | |----------|-------------------|---------------| | [Chronos Family](chronos-family.ipynb) | Forecast with Chronos 1.x and 2.x checkpoints | Python 3.10+ | +| [TimesFM Family](timesfm-family.ipynb) | Forecast with TimesFM 1.0, 2.0, 2.5, and 3.0 with prediction intervals | Python 3.10+ | | [TiRex Family](tirex-family.ipynb) | Forecast with TiRex 1.0 and 2.0 | Python 3.11+ | | [Toto Family](toto-family.ipynb) | Forecast with Toto 1.0 and 2.0 | Python 3.10+ | | [Finetuning](finetuning.ipynb) | Adapt Chronos 2 and TimeGPT to your data | Python 3.10+; GPU recommended | diff --git a/mkdocs.yml b/mkdocs.yml index fc46526..eca8279 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -26,6 +26,7 @@ nav: - Compare Foundation Models: examples/ts-foundation-models-comparison-quickstart.ipynb - Family Guides: - Chronos: examples/chronos-family.ipynb + - TimesFM: examples/timesfm-family.ipynb - TiRex: examples/tirex-family.ipynb - Toto: examples/toto-family.ipynb - Finetuning: examples/finetuning.ipynb @@ -36,6 +37,10 @@ nav: - Community: - Getting Help: community/help.md - Contributing: contributing.md + - Changelogs: + - changelogs/index.md + - changelogs/v0.1.3.md + - changelogs/v0.1.2.md theme: name: material diff --git a/pyproject.toml b/pyproject.toml index 7082c96..c9337e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,22 @@ docs = [ authors = [ {email = "azul.garza.r@gmail.com", name = "Azul Garza"}, ] +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Information Technology", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Software Development :: Libraries :: Python Modules", +] dependencies = [ "gluonts[torch]", "huggingface-hub>=0.36.2,<2.0", @@ -55,7 +71,7 @@ license = "Apache-2.0" name = "foundationforecast" readme = "README.md" requires-python = ">=3.10" -version = "0.1.2" +version = "0.1.3" [project.optional-dependencies] plot = [ diff --git a/tests/docs/test_docs.py b/tests/docs/test_docs.py index b49bdec..5a8b115 100644 --- a/tests/docs/test_docs.py +++ b/tests/docs/test_docs.py @@ -1,3 +1,4 @@ +import re from pathlib import Path import pytest @@ -7,7 +8,7 @@ @pytest.mark.docs @pytest.mark.parametrize( "fpath", - [p for p in Path("docs").rglob("*.md")], + [p for p in Path("docs").rglob("*.md") if "changelogs" not in p.parts], ids=str, ) @pytest.mark.flaky(reruns=3, reruns_delay=80) @@ -21,6 +22,21 @@ def test_readme(): check_md_file("README.md", memory=True) +@pytest.mark.docs +def test_latest_changelog(): + def version_key(filename): + match = re.search(r"(\d+\.\d+\.\d+)", str(filename)) + if match: + version_string = match.group(1) + return tuple(map(int, version_string.split("."))) + return (0, 0, 0) + + changelog_dir = Path("docs/changelogs") + changelogs = sorted(changelog_dir.glob("v*.md"), key=version_key) + latest_changelog = changelogs[-1] if changelogs else None + check_md_file(latest_changelog, memory=True) + + @pytest.mark.docs @pytest.mark.parametrize( "fpath", diff --git a/uv.lock b/uv.lock index 766b274..266def1 100644 --- a/uv.lock +++ b/uv.lock @@ -1415,7 +1415,7 @@ dependencies = [ ] name = "foundationforecast" source = {editable = "."} -version = "0.1.2" +version = "0.1.3" [package.dev-dependencies] dev = [