Interpolate without having negative values in python
Question: I've been trying to create a smooth line from these values but I can't have
negative values in my result. So far all the methods I tried do give negative
values. Would love some help.

    
    
    import matplotlib.pyplot as plt
    from scipy.interpolate import UnivariateSpline
    import numpy as np
    y = np.asarray([0,5,80,10,1,10,40,30,80,5,0])
    x = np.arange(len(y))
    
    plt.plot(x, y, 'r', ms=5)
    spl = UnivariateSpline(x, y)
    xs = np.linspace(0,len(y)-1, 1000)
    spl.set_smoothing_factor(2)
    
    plt.plot(xs, spl(xs), 'g', lw=3)
    plt.show()
    

[![enter image description
here](https://i.stack.imgur.com/RY5hW.png)](https://i.stack.imgur.com/RY5hW.png)


Answer: Spline fitting is known to overshoot. You seem to be looking for one of the
so-called _monotonic_ interpolators. For instance,

    
    
    In [10]: from scipy.interpolate import pchip
    
    In [11]: pch = pchip(x, y)
    

produces

    
    
    In [12]: xx = np.linspace(x[0], x[-1], 101)
    
    In [13]: plt.plot(x, y, 'ro', label='points')
    Out[13]: [<matplotlib.lines.Line2D at 0x7fce0a7fe390>]
    
    In [14]: plt.plot(xx, pch(xx), 'g-', label='pchip')
    Out[14]: [<matplotlib.lines.Line2D at 0x7fce0a834b10>]
    

[![enter image description
here](https://i.stack.imgur.com/xuYMR.png)](https://i.stack.imgur.com/xuYMR.png)

