Невозможно воссоздать функцию, сгенерировавшую данную таблицу данных, если не предоставлена информация о процессе, стоящем за этими данными.
При этом мы можем сделать некоторые предположения.
Поскольку это «процентильная» функция, она, вероятно, представляет собой совокупное значение некоторого распределения вероятностей. Очень распространенным распределением вероятностей является нормальное распределение, чьим «кумулятивным» аналогом (т.е. его интегралом) является так называемая «функция ошибки» (« erf »).
На самом деле ваши табличные данные очень похожи на функцию ошибки для переменной со средним значением 473.09:
ваш набор данных: оранжевый; встроенная функция ошибки ( erf ): синий
Однако соглашение не является совершенным, и это может быть вызвано тремя причинами:
- процедура подгонки, которую я использовал для генерации параметров для функции ошибки, не использовала правильные ограничения (потому что я понятия не имею, что я моделирую!)
- ваш набор данных не представляет собой точное нормальное распределение, а представляет собой данные реального мира, базовое распределение которых является нормальным распределением. Особенности ваших выборочных данных, которые отличаются от модели, полностью игнорируются.
- базовое распределение вовсе не является нормальным распределением, его интеграл просто случайно выглядит как функция ошибки.
Буквально я не могу сказать!
Если вы хотите использовать эту функцию, это ее определение:
import numpy as np
from scipy.special import erf
def fitted_erf(x):
c = 473.09090474
w = 37.04826334
return 50+50*erf((x-c)/(w*np.sqrt(2)))
Тесты:
In [2]: fitted_erf(439) # 17 from the table
Out[2]: 17.874052406601457
In [3]: fitted_erf(457) # 34 from the table
Out[3]: 33.20270318344252
In [4]: fitted_erf(474) # 51 from the table
Out[4]: 50.97883169390196
In [5]: fitted_erf(502) # 79 from the table
Out[5]: 78.23955071273468
однако я настоятельно рекомендую вам проверить, является ли подходящая функция, выполненная без ведома вашего источника данных, правильным инструментом для вашей задачи.
приписка
Если вам интересно, это код, используемый для получения параметров:
import numpy as np
from scipy.special import erf
from scipy.optimize import curve_fit
tab=np.genfromtxt('table.csv', delimiter=',', skip_header=1)
# using a 'table.csv' file generated by Google Spreadsheets
x = tab[:,0]
y = tab[:,1]
def parametric_erf(x, c, w):
return 50+50*erf((x-c)/(w*np.sqrt(2)))
pars, j = curve_fit(parametric_erf, x, y, p0=[475,10])
print(pars)
# outputs [ 473.09090474, 37.04826334]
и для генерации сюжета
import matplotlib.pyplot as plt
plt.plot(x,parametric_erf(x,*pars))
plt.plot(x,y)
plt.show()