Skip to main content

Python port of nonlinear nonparametric statistics from R NNS

Project description

NNS Python

PyPI package Python License

ovvo-nns brings Nonlinear Nonparametric Statistics to Python as the nns import package. It is a parity-focused port of the R NNS 13.0+ package, designed for real-world data that violate symmetry, linearity, or distributional assumptions.

NNS is built around partial moments, the lower and upper components of variance, and uses them across nonlinear dependence, correlation, causation, regression, classification, forecasting, stochastic dominance, stochastic superiority, Monte Carlo simulation, and numerical differentiation workflows.

NNS was created by Fred Viole as the companion R package to Viole, F. and Nawrocki, D. (2013), Nonlinear Nonparametric Statistics: Using Partial Moments. Book (2nd Edition): https://ovvo-financial.github.io/NNS/book/

Implementation: For a direct quantitative finance implementation of NNS, see OVVO Labs

Package at a glance

Item Value
Distribution package ovvo-nns
Import package nns
Current version 1.0.4
Python >=3.11
Required runtime dependencies NumPy, SciPy
R required at runtime No
Native acceleration Private, optional nns._nnscore kernels where available
Public API status Stable, parity-focused
License GPL-3.0-only

The public package is Python-native and does not call R at runtime. Some core kernels can use the private _nnscore extension when it is present, while public functions keep Python implementations and explicit fallback behavior.

Install

pip install ovvo-nns

This includes the matplotlib plotting API (nns.plotting); matplotlib is a regular dependency and is imported lazily, so import nns stays light. See docs/plot_parity_policy.md.

Use the package as nns:

import nns

print(nns.__version__)

Source builds use scikit-build-core and nanobind for the optional native extension. Published wheels should be preferred when available.

Quick start

import numpy as np
from nns import lpm, nns_dep, nns_reg, upm

x = np.array([-2.0, -1.0, 0.5, 3.0], dtype=np.float64)

lower = lpm(degree=2, target=0.0, x=x)
upper = upm(degree=2, target=0.0, x=x)

print("lower partial moment:", lower)
print("upper partial moment:", upper)

Measure nonlinear dependence:

import numpy as np
from nns import nns_cor, nns_dep

grid = np.linspace(-2.0, 2.0, 80, dtype=np.float64)
y = grid**2

print("NNS dependence:", nns_dep(grid, y))
print("NNS correlation:", nns_cor(grid, y))

Fit a nonlinear regression and estimate new points:

import numpy as np
from nns import nns_reg

x = np.linspace(-3.0, 3.0, 80, dtype=np.float64)
y = np.sin(x) + 0.2 * x
points = np.array([-1.5, 0.0, 1.5], dtype=np.float64)

fit = nns_reg(x, y, point_est=points, confidence_interval=None)

print("R2:", fit["R2"])
print(np.column_stack((points, fit["Point.est"])))

Forecast a univariate series:

import numpy as np
from nns import nns_arma, nns_seas

t = np.arange(1, 60, dtype=np.float64)
series = 10.0 + np.sin(t / 3.0) + 0.05 * t

seasonality = nns_seas(series, modulo=[3, 4, 6], mod_only=True)
forecast = nns_arma(series, h=3, seasonal_factor=4, method="lin")

print("best seasonal period:", seasonality["best.period"])
print("forecast:", forecast)

Main API areas

Area Representative functions
Partial moments lpm, upm, lpm_ratio, upm_ratio, pm_matrix
Classical moment helpers mean_pm, var_pm, skew_pm, kurt_pm, nns_moments
Dependence, correlation, copula nns_dep, nns_cor, nns_copula
Causation nns_causation, causal_matrix
Regression and classification nns_reg, nns_m_reg, nns_stack, nns_boost
Forecasting nns_seas, nns_arma, nns_arma_optim, nns_var
Distribution tools nns_cdf, nns_anova, nns_norm
Stochastic dominance fsd, ssd, tsd, nns_sd_cluster, sd_efficient_set
Stochastic superiority and simulation nns_ss, nns_mc, nns_meboot
Differentiation nns_diff, dy_dx, dy_d
Categorical helpers encode_factor_codes, factor_2_dummy, factor_2_dummy_fr, prepare_factor_predictors

See API status for implemented, partial, guarded, and known-gap paths.

Design boundaries

NNS Python prioritizes stable public behavior from installed R NNS 13.0+, not private helper parity. The package returns NumPy arrays and plain dictionaries rather than R data.table objects, uses explicit Python errors for several unsafe R coercions, and generally ignores plotting side effects.

Important boundaries:

  • R is used only for parity tests and local cache regeneration, not normal runtime use.
  • Stochastic exact stream parity is not expected because Python paths use NumPy random generation.
  • Factor and class ordering should be passed explicitly when ordering matters.
  • Direct raw-factor nns_m_reg(..., factor_2_dummy=True) is intentionally guarded. Use prepare_factor_predictors(...) before nns_m_reg(...).
  • Compute functions still return values, not figures; passing plot=True (where R has it) additionally renders a Matplotlib figure as a side effect via the nns.plotting layer, which is color/element-faithful to R but not pixel-diffed. The plot functions can also be called directly on a computed result.

See behavior conventions for detailed compatibility notes.

Examples and notebooks

Runnable examples live in docs/examples:

Topic Script
Partial moments partial_moments.py
Dependence dependence.py
Distributions and ANOVA distributions_anova.py
Regression regression.py
Classification classification.py
Forecasting forecasting.py

Run one example:

uv run python docs/examples/partial_moments.py

Run all script examples:

for example in docs/examples/*.py; do uv run python "$example"; done

Notebook workflows are also available under docs/examples/notebooks.

Documentation

Development

uv sync --group dev
uv run pytest
uv run ruff check .
uv run mypy

Run benchmark tests explicitly:

uv run pytest -n0 -m benchmark --benchmark-enable tests/benchmarks/

The default parity suite is cache-backed and does not require Rscript. Rscript and the R NNS package are needed only when regenerating parity caches or running live R comparison scripts.

Benchmarks

Benchmarks compare selected Python paths with installed R NNS 13.0+ baselines. Many core operations are faster in Python, while some large stochastic-dominance workloads remain faster in R because the R package uses compiled kernels for those paths. See benchmarks for current measurements and commands.

Authors and contributors

  • Fred Viole — author and maintainer
  • Roberto Spadim — contributor
  • Rasheed Khoshnaw — contributor

Attribution

Upstream R package and reference implementation: OVVO-Financial/NNS

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ovvo_nns-1.0.4.tar.gz (8.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ovvo_nns-1.0.4-cp313-cp313-win_amd64.whl (231.6 kB view details)

Uploaded CPython 3.13Windows x86-64

ovvo_nns-1.0.4-cp313-cp313-musllinux_1_2_x86_64.whl (730.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

ovvo_nns-1.0.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (270.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

ovvo_nns-1.0.4-cp313-cp313-macosx_11_0_arm64.whl (246.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

ovvo_nns-1.0.4-cp313-cp313-macosx_10_14_x86_64.whl (270.3 kB view details)

Uploaded CPython 3.13macOS 10.14+ x86-64

ovvo_nns-1.0.4-cp312-cp312-win_amd64.whl (231.6 kB view details)

Uploaded CPython 3.12Windows x86-64

ovvo_nns-1.0.4-cp312-cp312-musllinux_1_2_x86_64.whl (730.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

ovvo_nns-1.0.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (270.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

ovvo_nns-1.0.4-cp312-cp312-macosx_11_0_arm64.whl (246.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

ovvo_nns-1.0.4-cp312-cp312-macosx_10_14_x86_64.whl (270.4 kB view details)

Uploaded CPython 3.12macOS 10.14+ x86-64

ovvo_nns-1.0.4-cp311-cp311-win_amd64.whl (231.9 kB view details)

Uploaded CPython 3.11Windows x86-64

ovvo_nns-1.0.4-cp311-cp311-musllinux_1_2_x86_64.whl (730.7 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

ovvo_nns-1.0.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (270.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

ovvo_nns-1.0.4-cp311-cp311-macosx_11_0_arm64.whl (247.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

ovvo_nns-1.0.4-cp311-cp311-macosx_10_14_x86_64.whl (270.6 kB view details)

Uploaded CPython 3.11macOS 10.14+ x86-64

File details

Details for the file ovvo_nns-1.0.4.tar.gz.

File metadata

  • Download URL: ovvo_nns-1.0.4.tar.gz
  • Upload date:
  • Size: 8.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ovvo_nns-1.0.4.tar.gz
Algorithm Hash digest
SHA256 ab5a5b1d943ed47e8fee48879cf13ee9d710feb8cc2f01d506b03e24bafb9906
MD5 dc04c382e1fd0f2b92e20ffe1256350e
BLAKE2b-256 90d21d0e019a7d53af5756651fceef4765ae26d40388a02b554b47815a0d5ff6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4.tar.gz:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: ovvo_nns-1.0.4-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 231.6 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ovvo_nns-1.0.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5d53fe23fddf8430ff49452c49a02f702c034c98648188f2ceec160eefb72c0e
MD5 c34badae81833557d0e4729b426e24c3
BLAKE2b-256 451136ea21040ec0910899130b1794e1b507803af51c494921f172b49cbc5567

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp313-cp313-win_amd64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 78bc1f6d459b1591a59069f6df50a5c9479de5f6b8da221188ad6a1bbf93e7bf
MD5 0f9dee763f71348f22fdce7c70855a9b
BLAKE2b-256 c5b05b50457ca470636062fbdc6eb48ceb84f2fec4e57a9cdf998d78a61e664b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 92eca55e4d80520eace95384487f210a08aef0c32521fd8d5442e02728c5fac7
MD5 793f2a1b7232635db6fc3546d0ff3ef9
BLAKE2b-256 c196098c5841ccffadb945893a57ad801d6d572f8fba97cd9ccc3c0e032e198c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 48b118a4da4c5f16775a59a6bb2bcde2e5f60f3fa86bc884b197d2f941563643
MD5 07ed922dbffe4fc5717d0e3ac30b4c28
BLAKE2b-256 51bc103546c5d8b0fbfd5ed2ac9917af969ce6676952766a0c91a029245f53c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp313-cp313-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp313-cp313-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 84a0c72699489155f9355b69a7d967ac25869858f50caff8cf69f267e3968518
MD5 363bfb5a76f86d41ed1e024a34365c59
BLAKE2b-256 87a6a3dc1a1bb75c2b0a8abbe292c6049013041171eb1abbc67e287deb77ec1a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp313-cp313-macosx_10_14_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ovvo_nns-1.0.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 231.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ovvo_nns-1.0.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3b7ff3f271ee63111547fda21150469c885473070eec6fe359bb7fa3ad6b2a20
MD5 90da8f7ad9c5c2d262b1ee5f8504124b
BLAKE2b-256 0666e1456d1ea5204befd1be3d57f6973fd6f991581da279943e550e73d69e82

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp312-cp312-win_amd64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ba1822fd51817786bbe2c22d4c916bfac57436355361b3857d89d83574f6847f
MD5 fbc332b4003b9867bb73bd7fae18033b
BLAKE2b-256 a85273782e8c372fe786fe736455d44785fce68f8b820065fc9547d0525dd7b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 de19a355bbdc05ab01bc1914e5c108f4b1c305b355765ea25c143755529c93c2
MD5 dd4489116ef1770cf51e5de776e9c758
BLAKE2b-256 a6124833b3bab76e4bf1a86c27d49353cc262c3d784b85d9d5ad07105053cbd3

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a70ce7caa45f29bf9b87d69131f77c22074d5924a8a0d2a4b510ef67f512c76e
MD5 3df8921aff572dd7c487aad030e5ed60
BLAKE2b-256 a5016b7b6f1273b8a1225a40087d946f7949cc581ebb8b55d41b6be32db5726f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp312-cp312-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp312-cp312-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 315f078a70f6d7083df6b7b37fdd490c74cd53c6e6f4c181e989731570203386
MD5 3fd6d1b0a20bd9564746ee2edf983ed7
BLAKE2b-256 5f0764ccbe71f6e4c32bf3c5d821b2e75cbbfdd5683cb29f1e2537e0bdeb27d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp312-cp312-macosx_10_14_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: ovvo_nns-1.0.4-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 231.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ovvo_nns-1.0.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 859347457e02a4a0a7770b47c65e007b70e258ea3f2f79fa77e54d90860f3afc
MD5 386ec88d68a3304da2ee3d3a7dd5ffb5
BLAKE2b-256 8fe1d37a4b0551f3f43a7d0ac6a00e1ba2478d62c1f95810938f91735f606cf6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp311-cp311-win_amd64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 dd41a35b61dee5235e1673840cbc9e8131d7b83ff7d0fee1a646c3ee4f0d6dcd
MD5 f8b22b41f92dc687f09485f7618673d1
BLAKE2b-256 c2ff33a450fbe5974ed23bc42747d9558861a86b903b52955ea74ccc75668a9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ea317bf356316e6e6b9f7ccfc75524d165fc550cbfa12127571b63d6d92f3ed5
MD5 9d98e241c2a28797f94e8e0e5328baa1
BLAKE2b-256 f6901f4275da1d469d1c1cc49247615c9c7baf53ad776b0dc0fe4d588aa5c5a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5e4e5ec620299fba5c9d40a7dee2ac3b9a5fbb9665f9adfe377e67c84999bf9c
MD5 107b3e7972fd408bb8ba9ef07de2d670
BLAKE2b-256 68777ed146d0dd64773bd934879e027e926b00d0d5197ec9ec24f0431251609d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ovvo_nns-1.0.4-cp311-cp311-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.4-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 74098af0e985e917c88e693402a1754fd6fea6b8d9bb7c38c31dfc7b6c22d97a
MD5 5638ca354656aaef381699f157d17a2b
BLAKE2b-256 467293909ed568b78a9e99bd0e71d4fd4bbfcb57e80ff12363e71bb663508fa3

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.4-cp311-cp311-macosx_10_14_x86_64.whl:

Publisher: release.yml on OVVO-Financial/NNS-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page