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.1
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
Nowcast panels nns_nowcast_panel, CsvNowcastProvider
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
Nowcast panel nowcast_panel.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.

Attribution

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

Contributors: Roberto Spadim, Rasheed Khoshnaw

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.1.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.1-cp313-cp313-win_amd64.whl (232.2 kB view details)

Uploaded CPython 3.13Windows x86-64

ovvo_nns-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl (729.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

ovvo_nns-1.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (270.4 kB view details)

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

ovvo_nns-1.0.1-cp313-cp313-macosx_11_0_arm64.whl (247.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

ovvo_nns-1.0.1-cp313-cp313-macosx_10_14_x86_64.whl (270.0 kB view details)

Uploaded CPython 3.13macOS 10.14+ x86-64

ovvo_nns-1.0.1-cp312-cp312-win_amd64.whl (232.2 kB view details)

Uploaded CPython 3.12Windows x86-64

ovvo_nns-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl (729.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

ovvo_nns-1.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (270.4 kB view details)

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

ovvo_nns-1.0.1-cp312-cp312-macosx_11_0_arm64.whl (247.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

ovvo_nns-1.0.1-cp312-cp312-macosx_10_14_x86_64.whl (270.0 kB view details)

Uploaded CPython 3.12macOS 10.14+ x86-64

ovvo_nns-1.0.1-cp311-cp311-win_amd64.whl (233.0 kB view details)

Uploaded CPython 3.11Windows x86-64

ovvo_nns-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl (730.3 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

ovvo_nns-1.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (270.6 kB view details)

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

ovvo_nns-1.0.1-cp311-cp311-macosx_11_0_arm64.whl (247.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

ovvo_nns-1.0.1-cp311-cp311-macosx_10_14_x86_64.whl (270.3 kB view details)

Uploaded CPython 3.11macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: ovvo_nns-1.0.1.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.1.tar.gz
Algorithm Hash digest
SHA256 7bb0291d8786392b33df460eece57634b728c158a322a82dc7f48b59fe5c38c4
MD5 86539a633f0376db3effa985fc5daac4
BLAKE2b-256 c2376adadba7da45dd03f5f073db7efdf8addf636ac43e74a1d2fca98368ab84

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1.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.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: ovvo_nns-1.0.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 232.2 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.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ef41a0cf66f6f369854b07bc5ba0b681975b1f505a88c86bda809656ea82d51f
MD5 8fccaf240b78892a54acfd4f1ddefba9
BLAKE2b-256 12e4b99a69cc2a81c0aac8e64a5874bcd276111a59515f708fd296c1a921e84f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e1b1bb91c89a2e488ee2b6f9eecf9cb8e9d97d4b8f1ed354ddc5645cb72fab60
MD5 eefc2117a589b7da1caf605fd8eae476
BLAKE2b-256 ae3cc5f8fc62b6109ae7e99fee7d54c6ae8284a3235155911a4b25b15f89aed1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d8858a0126c4a8dbe0da560473ce3553ddfd5aa306f929026120c36690a1cf10
MD5 768bbb3cb6df672458629ad74427b9f2
BLAKE2b-256 2c4ab73a7d0bf42d17a98929be8d7f7a4046f0ff24cc8365d289b99b68f34d74

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f0cfc15e5c22a10e6ea78a6e95c49d4ae527013600b674140bfdc6f24c44ed98
MD5 db7f29f6f05a54338f36a6350af10922
BLAKE2b-256 093196df03d80a7755878b78fbf965d15b008e5a0380c7b4881dfaf517fcc27e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp313-cp313-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp313-cp313-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 c13b4f0e478f542c9f8fd27ef6d774f3e51cdc98f3e2b7187669d6f2192b2999
MD5 d64de20835953e2e9f2471560e54e70b
BLAKE2b-256 c8310e368afcfa568c9bdabf79a35d5c0722e106874067bcffa7f54e65fa3833

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ovvo_nns-1.0.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 232.2 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.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b8d908229e6d1ecffa0161f5b7e9431f7e3a6f11aa707095a99b337f95925078
MD5 3fe59382d649c7cd30663e38edb095af
BLAKE2b-256 6ddd83f8e27543bc68828b8b608e4210b122ee0217135113edaa7218ee6d9db5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 96376f4d7c795bfa5515518c3af922dcf5702a5b324b20eb4c431811b9a82c53
MD5 1ced6790308b8be7b48b0ff5336d1eab
BLAKE2b-256 faa03ce8438d3bf1aaed3d086d7fb4913c10cf6b0a0a6e0a781827647a871641

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5534af7af00f388356e21993f2031459533a1fb1bb68c2e1ea73619369f6576e
MD5 e1c94d7df1c8e6a5e85aca3729cb6192
BLAKE2b-256 a800bd01e51d37f41ff423d030d0b6ed240fe098f0c8b68a87d26f5987193659

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fb449c09a29fcdb687d4c228e7d6d500c2c7d2949126decb239af1b7272779c2
MD5 f487e30917ca90b2eae009a2a2157306
BLAKE2b-256 e2e6329ba0426170c902c65510d22926da0c7ffb667053a70fdf254535e58f3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp312-cp312-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp312-cp312-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e1eecf8b83883b2d08fbec1158bcb4e575db2a8ca6a0a2dcda422c95782dffb0
MD5 65a12b10ebd046be335190c98558c90a
BLAKE2b-256 5705b6bf70b105f7e6e154f15a0a687d4d2254907c6ea5fd5984563b4d8d75a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: ovvo_nns-1.0.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 233.0 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.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0a184788b12cc3dcf54bddccc85ebbc23655e457fba8eefaedcee56b2dbfb014
MD5 03426e0f4898e7764025f994f59c5b0d
BLAKE2b-256 6f515d6bebcb11edcb013bd71468bb8dcb3f9e18805f0d1ff7bce2fa5feaa508

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 da4b5d352e9b02b9f3df140773052d02b990adc8ad85b8e14a60a1e56d0f89b7
MD5 f83efdd7bdac6237b0f8c72f822b59e7
BLAKE2b-256 beac91805ab8444a534a500ac5817b4bf08e0e4f0238435cf0051027822457fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b028c782c8161a46f76ffd65afd5d46e3fc1ab7e1270fe05b7b3bbcb641e7825
MD5 ac774f76f420318055598519e26a0582
BLAKE2b-256 970502c22abb7e5cdf7effddca7d55a5df85b9ce7184d02be3d67410ce4e2f63

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5c7876b24eb8b3523a4a5c4ebe2f069baaf71f2d5ebe86fc72463fa33cc088d8
MD5 ad27241367c0ae4017b7f65fdde6c89d
BLAKE2b-256 470c5a43f52a26c95eea1202fa7f7015ba7508751cc8233d43fd52cdbdad1d72

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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.1-cp311-cp311-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for ovvo_nns-1.0.1-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 b1c8634512f79be0ba1666690d8fda2e2257c745d43c9d4f37fb718a6b464ef7
MD5 ac77188c942de64128853b323ac71153
BLAKE2b-256 0cf10d87cc701b97873aeaef8d0c1802475b74e1fef395bd380577b4a40787e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for ovvo_nns-1.0.1-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