Два кадра данных Панд, как интерполировать по строкам с помощью scipy

#pandas #scipy #interpolation

#панды #сципи #интерполяция

Вопрос:

Как я могу использовать интерполяцию scipy на двух кадрах данных, интерполируя рост строк?

Например, если у меня есть:

 dfx = pd.DataFrame({"a": [0.1, 0.2, 0.5, 0.6], "b": [3.2, 4.1, 1.1, 2.8]}) dfy = pd.DataFrame({"a": [0.8, 0.2, 1.1, 0.1], "b": [0.5, 1.3, 1.3, 2.8]}) display(dfx) display(dfy)  

введите описание изображения здесь

И скажите, что я хочу интерполировать для y(x=0,5), как я могу получить результаты в массив, который я могу поместить в новый фрейм данных?

Ожидаемый результат таков: [0.761290323 0.284615385 1.1 -0.022727273]

Например, для первой строки вы можете видеть, что ожидаемое значение равно 0,761290323:

 x = [0.1, 3.2] # from dfx, row 0 y = [0.8,0.5] # from dfy, row 0 fig, ax = plt.subplots(1,1) ax.plot(x,y)  f = scipy.interpolate.interp1d(x,y) out = f(0.5) print(out)  

введите описание изображения здесь

Я попробовал следующее, но получил ValueError: x and y arrays must be equal in length along interpolation axis.

 f = scipy.interpolate.interp1d(dfx, dfy) out = np.exp(f(0.5)) print(out)  

Комментарии:

1. Что значит интерполировать по строкам? Что x здесь такое?

2. @QuangHoang ОП обновлено

Ответ №1:

Поскольку вы ищете линейную интерполяцию, вы можете сделать:

 def interpolate(val, dfx, dfy):  t = (dfx['b'] - val) / (dfx['b'] - dfx['a'])  return dfy['a'] * t   dfy['b'] * (1-t)  interpolate(0.5, dfx, dfy)  

Выход:

 0 0.885714 1 0.284615 2 1.100000 3 -0.022727 dtype: float64  

Комментарии:

1. Я использовал линейную интерполяцию для простоты, в реальности я буду использовать сплайн, поэтому я указал модуль scipy