Cubic spline approximation (smoothing)

## Project description

csaps is a Python package for univariate, multivariate and n-dimensional grid data approximation using cubic smoothing splines. The package can be useful in practical engineering tasks for data approximation and smoothing.

## Installing

Use pip for installing:

``````pip install -U csaps
``````

The module depends only on NumPy and SciPy. Python 3.6 or above is supported.

## Simple Examples

Here are a couple of examples of smoothing data.

An univariate data smoothing:

```import numpy as np
import matplotlib.pyplot as plt

from csaps import csaps

np.random.seed(1234)

x = np.linspace(-5., 5., 25)
y = np.exp(-(x/2.5)**2) + (np.random.rand(25) - 0.2) * 0.3
xs = np.linspace(x, x[-1], 150)

ys = csaps(x, y, xs, smooth=0.85)

plt.plot(x, y, 'o', xs, ys, '-')
plt.show()
``` A surface data smoothing:

```import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from csaps import csaps

np.random.seed(1234)
xdata = [np.linspace(-3, 3, 41), np.linspace(-3.5, 3.5, 31)]
i, j = np.meshgrid(*xdata, indexing='ij')
ydata = (3 * (1 - j)**2. * np.exp(-(j**2) - (i + 1)**2)
- 10 * (j / 5 - j**3 - i**5) * np.exp(-j**2 - i**2)
- 1 / 3 * np.exp(-(j + 1)**2 - i**2))
ydata = ydata + (np.random.randn(*ydata.shape) * 0.75)

ydata_s = csaps(xdata, ydata, xdata, smooth=0.988)

fig = plt.figure(figsize=(7, 4.5))
ax.set_facecolor('none')
c = [s['color'] for s in plt.rcParams['axes.prop_cycle']]
ax.plot_wireframe(j, i, ydata, linewidths=0.5, color=c, alpha=0.5)
ax.scatter(j, i, ydata, s=10, c=c, alpha=0.5)
ax.plot_surface(j, i, ydata_s, color=c, linewidth=0, alpha=1.0)
ax.view_init(elev=9., azim=290)

plt.show()
``` ## Documentation

More examples of usage and the full documentation can be found at https://csaps.readthedocs.io.

## Testing

pytest, tox and Travis CI are used for testing. Please see tests.

## Algorithm and Implementation

csaps Python package is inspired by MATLAB CSAPS function that is an implementation of Fortran routine SMOOTH from PGS (originally written by Carl de Boor).

Also the algothithm implementation in other languages:

• csaps-rs Rust ndarray/sprs based implementation
• csaps-cpp C++11 Eigen based implementation (incomplete)

## References

C. de Boor, A Practical Guide to Splines, Springer-Verlag, 1978.

MIT

# Changelog

## v0.11.0

• Internal re-design `SplinePPForm` and `NdGridSplinePPForm` classes #17:
• Remove `shape` and `axis` properties and reshaping data in these classes
• `NdGridSplinePPForm` coefficients array for 1D grid now is 1-d instead of 2-d
• Refactoring the code and decrease memory consumption
• Add `overload` type-hints for `csaps` function signatures

## v0.10.1

• Fix call of `numpy.pad` function for numpy <1.17 #15

## v0.10.0

• Significant performance improvements for make/evaluate splines and memory consumption optimization
• Change format for storing spline coefficients (reshape coeffs array) to improve performance
• Add shape property to `SplinePPForm`/`NdGridSplinePPForm` and axis property to `SplinePPForm`
• Fix issues with the smoothing factor in nd-grid case: inverted ordering and unnable to use 0.0 value
• Update documentation

## v0.9.0

• Drop support of Python 3.5
• `weights`, `smooth` and `axis` arguments in `csaps` function are keyword-only now
• `UnivariateCubicSmoothingSpline` and `MultivariateCubicSmoothingSpline` classes are deprecated and will be removed in 1.0.0 version. Use `CubicSmoothingSpline` instead.

## v0.8.0

• Add `csaps` function that can be used as the main API
• Refactor the internal structure of the package

Attention

This is the last version that supports Python 3.5. The next versions will support Python 3.6 or above.

## v0.7.0

• Add Generic-based type-hints and mypy-compatibility

## v0.6.1

• A slight refactoring and extra data copies removing

## v0.6.0

• Add "axis" parameter for univariate/multivariate cases

## v0.5.0

• Reorganize the project to package-based structure
• Add the interface class for all smoothing spline classes

## v0.4.2

• FIX: "smooth" value is 0.0 was not used

## v0.4.1

• First PyPI release

## Project details

This version 0.11.0 0.10.1 0.10.0 0.9.0 0.8.0 0.7.0 0.6.1 0.6.0 0.5.0 0.4.2 0.4.1