Вы работаете над временем удвоения инфекций Covid-19?
Пожалуйста, внимательно проверьте результаты.
Я забыл, что вы используете Pandas, так что вы можете сначала это нужно:
y = df['val'].to_numpy()
Это первый выстрел:
import numpy as np
from scipy.interpolate import interp1d
y = np.array([197, 218, 256, 328, 413,525, 646, 646, 777,
1159, 1838, 2417, 3240, 4257, 4955, 4955,
5752, 6620, 7738, 8966, 10402],
dtype=float)
# get the deltas to check if there was no increase
# between two consecutive data points
dy = np.diff(y)
# these are the places without increase
idx = np.argwhere(dy) #could also be np.where(dy == 0.0)[0]
y_fixed = y.copy()
# create the x axis, probably days
x = np.arange(y.shape[0])
# Hack: increase the second identical value be a
# small amount so the interpolation works
# increase the indices by one to increment the second value
y_fixed[idx + 1] += 0.001
# you need scipy > 0.17 for extrapolation to work
f = interp1d(y_fixed, x, fill_value="extrapolate")
# there are the values you need?
y_half = y / 2.0
# get the according x values by interpolation
x_interp = f(y_half)
# delta between the current day and the date when
# the value was half
dbl = x - x_interp
# this already looks quite good, but double check!
print(dbl)
Возможно, необходимо сместить ось x. Или, может быть, это все-таки правильно. Я подумаю об этом завтра со свободным sh мозгом.
На следующем изображении показаны оба алгоритма с вычисленными экспоненциальными данными, где две позиции где установлены не увеличивающиеся значения.