#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