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. Подбор дороже: около 2,5 с на 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                  # 361 тест
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.1

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.1
File Size Uploaded Provenance Actions
whittaker_trosna-0.2.1.tar.gz 20.4 kB Without provenance Details for whittaker_trosna-0.2.1.tar.gz

Built distribution (wheel)

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

Total release size: 45.9 kB

Release files / whittaker_trosna-0.2.1.tar.gz

Download URL whittaker_trosna-0.2.1.tar.gz
Size 20.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c70742a290f9d9ef20a0f1c7884b82831a6cb015374192830cf44034880336c3
BLAKE2b-256 checksum
How to use checksums
7cc1ac2f3b610c9d210ad7ce0797237e214eb4b79007a9dc3fe5074d2278c251
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.1-py3-none-any.whl

Download URL whittaker_trosna-0.2.1-py3-none-any.whl
Size 25.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
de81b1d398dfc5c425244d8b168d277c1dccc2b277f55a2bd75224c3121e0666
BLAKE2b-256 checksum
How to use checksums
dba2ef9ba3f9aee63148833c4c29840dce6bf41a20a38bfb101cd1b83abc98c8
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.1

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.1 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