'How to create synthetic data for a decaying curve in order to extrapolate it beyond some point?

In the following curve, I would like to extend the measurements beyond x=1 in order to have a better estimate of the green curve compared to red line.

Note: I do not have the analytical form of the function but only x, y data sets in the range (0, 1). enter image description here Is there any package in python in order to extrapolate a curve beyond some value given that we have the interpolated form of the curve?


Here is my attempt assuming a linear drop:

from scipy.interpolate import interp1d
import numpy as np

CURVE_CUT_INDEX = #the index corresponding to x=1 in the x array


def extrapolator_function(x_vals, y_vals, x_list):
    interpolator = interp1d(x_vals, y_vals, kind='cubic')
    x_1 = x_vals[-1]
    y_1 = interpolator(x_1)
    y_grad, x_grad = (np.gradient(y_vals, np.arange(y_vals.size)),
                      np.gradient(x_vals, np.arange(x_vals.size)))
    slope = np.divide(y_grad, x_grad, out=np.zeros_like(y_grad), where=x_grad != 0)[-1]
    x_out = x_list[CURVE_CUT_INDEX + 1:]
    y_pred = np.array([slope * (x-x_1) + y_1 for x in x_out])
    return x_vals, y_vals, x_out, y_pred

def plotter(ax, x_list, y_list):
    x_vals, y_vals = x_list[0:CURVE_CUT_INDEX + 1], y_list(x_list)[0:CURVE_CUT_INDEX + 1]
    x_vals, y_vals, x_out, y_pred = extrapolator_function(x_vals, y_vals, x_list)
    return ax.plot(x_vals, y_vals, 'g-', x_out, y_pred, 'r-', alpha=1, lw=2)

which will result in the following extrapolation scheme (which is not what I want). enter image description here



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source