2016-07-09 6 views
2

У меня есть две точки данных x и y:линейная интерполяция между двумя точками данных

x = 5 (value corresponding to 95%) 
    y = 17 (value corresponding to 102.5%) 

Нет, я не хотел, чтобы вычислить значение для xi, которая должна соответствовать 100%.

x = 5 (value corresponding to 95%) 
xi = ?? (value corresponding to 100%) 
y = 17 (value corresponding to 102.5%) 

Как это сделать с помощью python?

+0

Вне темы: Обратите внимание, что вы буквально просите линейную интерполяцию. При сборе данных в реальном времени распределение данных не обязательно будет линейным. – Aguy

ответ

5

это то, что вы хотите?

In [145]: s = pd.Series([5, np.nan, 17], index=[95, 100, 102.5]) 

In [146]: s 
Out[146]: 
95.0  5.0 
100.0  NaN 
102.5 17.0 
dtype: float64 

In [147]: s.interpolate(method='index') 
Out[147]: 
95.0  5.0 
100.0 13.0 
102.5 17.0 
dtype: float64 
+0

да @MaxU, спасибо. Это в основном это. –

+0

11 неверный результат, хотя решение выглядит правильно. что-то не так с интерполяционной функцией? –

+0

@Al_Iskander pass 'method = 'index'', если вы хотите, чтобы он учитывал индекс. – ayhan

4

Мы легко можем построить это на графике без Python:

Это показывает нам, что ответ должен быть (13).

Но как мы это вычислим? Во-первых, мы находим градиент с этим:

Цифры подставляются в уравнения дают это:

Итак, мы знаем 0,625 увеличиваем значение Y на, мы увеличиваем значение Х на 1.

Нам дано, что Y равно 100. Мы знаем, что 102.5 относится к 17. 100 - 102.5 = -2.5. -2.5/0.625 = -4, а затем 17 + -4 = 13.

Это также работает с остальными цифрами: 100 - 95 = 5, 5/0.625 = 8, 5 + 8 = 13.

Мы также можем вернуться назад, используя обратный градиент (1/m).

Нам дано, что X равно 13. Мы знаем, что 102.5 относится к 17. 13 - 17 = -4. -4/0.625 = -2.5, а затем 102.5 + -2.5 = 100.

Как это сделать в python?

def findXPoint(xa,xb,ya,yb,yc): 
    m = (xa - xb)/(ya - yb) 
    xc = (yc - yb) * m + xb 
    return 

А найти точку Y заданную точку X:

def findYPoint(xa,xb,ya,yb,xc): 
    m = (ya - yb)/(xa - xb) 
    yc = (xc - xb) * m + yb 
    return yc 

Эта функция также экстраполировать из точек данных.

+0

Да, я также получаю ответ 13. Но ответ 11 принимается !!! – Eular

+0

См. 1-й ответ с использованием серии pandas, он получил 11 для ввода 100 – Eular

+0

действительно странно. Я впервые принял, потому что решение выглядело формально правильным, но результат 11 неверен, а 13 - лучше. –