Skip to main content

whittaker-trosna

Сглаживание Уиттекера для временных рядов, взвешенное по свежести точек: самую свежую точку сдвигать нельзя, самая старая сглаживается с классической силой.

Постановка

Классический метод (Whittaker, 1923; Eilers, 2003):

min_z  Σ (y_i − z_i)²  +  λ Σ (Δ^d z)_i²

Вариант со свежестью: каждой точке сопоставлен коэффициент подвижности c_i = f(t_i) ∈ [0, 1], где t_i = (n−1−i)/(n−1) — нормированное расстояние от самой свежей точки, а f — весовая функция с f(0) = 0, f(1) = 1:

min_z  Σ_{c_i>0} (y_i − z_i)² / c_i  +  λ Σ (Δ^d z)_i²,    z_i = y_i при c_i = 0
  • c ≡ 1 — в точности классический метод;
  • c_i → 0 — штраф за сдвиг растёт как 1/c_i, в пределе точка закрепляется.

Решение — симметричная положительно определённая ленточная система для свободных точек (ленточный Холецкий, O(n·d²); 200 000 точек обрабатываются меньше чем за секунду).

Использование

from whittaker_trosna import StreamingWhittaker, lambda_for_cutoff, recency_whittaker, whittaker

z = recency_whittaker(y, lam=300)  # линейная c(t) = t
z = recency_whittaker(y, lam=300, weight="power", p=3)  # сильнее защищает свежие точки
z = recency_whittaker(y, lam="cv")  # λ подбирается перекрёстной проверкой ("cv", "gcv", "forward", "bcv")
z = recency_whittaker(y, lam="bcv")  # то же, но устойчиво к коррелированному шуму (телеметрия)
z = recency_whittaker(y, lam="cv", strength=5)  # сила сглаживания: в 5 раз сильнее подобранной
z = recency_whittaker(y, lam=lambda_for_cutoff(60.0), t=t)  # подавить колебания короче 60 с
z = recency_whittaker(y, lam="cv", t=t, horizon=120.0)  # время + горизонт 120 с
z = recency_whittaker(y, lam=300, weights=w)  # w = 0 — пропуск

# Поток: телеметрия памяти ВМ раз в 1–5 с, сглаживание последнего часа
s = StreamingWhittaker("bcv", window=3600.0, horizon=120.0, strength=2.0, retune_every=60)
for t_i, mem_i in telemetry:  # NaN в mem_i — пропуск
    s.append(mem_i, t_i)
    snapshot = s.smooth()  # snapshot.t, snapshot.y, snapshot.z, snapshot.lam

Сила сглаживания задаётся тремя способами: числом λ; частотой среза lambda_for_cutoff(period) — колебания с периодом period (в единицах времени) ослабляются вдвое, короче — сильнее; или автоматически ("cv", "gcv", "bcv") с поправочным множителем strength.

Коррелированный шум. В телеметрии соседние отсчёты похожи не только из-за сигнала, но и из-за шума. Обычная перекрёстная проверка тогда «узнаёт» исключённую точку по соседям и почти не сглаживает. "bcv" (блочная проверка, h-block CV) исключает вместе с точкой по cv_block соседей с каждой стороны (по умолчанию n // 20, от 1 до 10; на рядах из 100 точек — 5) и считает ошибку точно, без пересчёта. На шуме AR(1) с φ = 0,3…0,8 ошибка "bcv" — 1,01–1,04 от наилучшей возможной, у "cv" — 2,0–2,6, у break_serial_correlation из whittaker-eilers — 1,8–1,9. На 100 точках: "bcv" — 1,08–1,13, "cv" — до 1,46, W-E — до 2,13. Подбор дороже: около 3 с на 3600 точек, на 100 точках — доли секунды.

Поддерживаются Python 3.11–3.14 (тесты проходят на каждой версии, а также с минимальными numpy 1.26 и scipy 1.11).

Поток. При взвешивании по свежести каждая новая точка меняет возраст всех остальных, поэтому окно пересчитывается целиком, но ленточным решателем: около 1,3 мс на точку для окна в 1600 точек. Подбор λ повторяется раз в retune_every точек.

Сравнение с аналогами

Таблица фич всех поддерживаемых (релиз за последние 3 года) реализаций метода Уиттекера на PyPI лежит в docs/comparison.md.

Разработка

uv sync
uv run pytest                  # 354 теста
uv run ruff check . && uv run ruff format --check .
uv run python examples/demo.py # графики в examples/figures

Metadata

Release files for whittaker-trosna 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for whittaker-trosna 0.2.0
File Size Uploaded Provenance Actions
whittaker_trosna-0.2.0.tar.gz 20.4 kB Without provenance Details for whittaker_trosna-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for whittaker-trosna 0.2.0
File Interpreter ABI Platform Actions
whittaker_trosna-0.2.0-py3-none-any.whl Python 3 none any Details for whittaker_trosna-0.2.0-py3-none-any.whl

Total release size: 45.9 kB

Release files / whittaker_trosna-0.2.0.tar.gz

Download URL whittaker_trosna-0.2.0.tar.gz
Size 20.4 kB
Tags Source
SHA-256 checksum
How to use checksums
10dc4891eb2f5ff7be8548ac24545cc56817f37fe6c8276c5e01d0b16c1216f6
BLAKE2b-256 checksum
How to use checksums
06b31316aa56c18bac1e449c7f4acb791a638552ee2c497c04005238c65b5a05
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / whittaker_trosna-0.2.0-py3-none-any.whl

Download URL whittaker_trosna-0.2.0-py3-none-any.whl
Size 25.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
13c2cf6bc17d0c250ee82655a6c3c8d824cf9ec4ccccab7d72cb9d3562d538fc
BLAKE2b-256 checksum
How to use checksums
e8fd0be6ff0a8c955450f0d355f918d3f130b9b2b2b7ccbed87b09ea111f96bc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for whittaker-trosna 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page