TL; DR: Вопрос: Существует ли быстрый способ интерполировать разбросанный набор 2D-данных по определенным координатам?
И если да, то может ли кто-нибудь привести пример спредоставил пример данных и переменных, использованных в «Текущем решении» (поскольку я, по-видимому, глуп, чтобы реализовать его самостоятельно).
Проблема:
Мне нужно интерполировать (и, если возможно, также экстраполировать) DataFrame (размер = (34, 18)) разбросанных данных в определенных координатных точках.DataFrame всегда остается неизменным.
Интерполяция должна быть быстрой, поскольку она выполняется более 10 000 раз в цикле.
Координаты, при которых будет производиться интерполяция, заранее неизвестны, посколькуони меняют каждый цикл.
Текущее решение:
def Interpolation(a, b):
#import external modules
import pandas as pd
from scipy import interpolate
#reading .xlsx file into DataFrame
file = pd.ExcelFile(file_path)
mr_df = file.parse('Model_References')
matrix = mr_df.set_index(mr_df.columns[0])
#interpolation at specific coordinates
matrix = Matrix.stack().reset_index().values
value = interpolate.griddata(matrix[:,0:2], matrix[:,2], (a, b), method='cubic')
return(value)
Этот метод неприемлем для длительного использования, так как только две строки кода под #interpolation at specific coordinates
- это более 95% времени выполнения.
Мои идеи:
- scipy.interpolate.Rbf кажется лучшим решением, еслиданные должны быть интерполированы и экстраполированы, но, насколько я понимаю, это только создает более тонкую сетку из существующих данных и не может вывести интерполированное значение в определенных координатах
- , создавая меньшую матрицу 4x4 области вокруг определенных координат(a, b), возможно, уменьшит время выполнения цикла, но я борюсь за то, чтобы использовать
griddata
с меньшей матрицей.Я создал матрицу 5x5, где первая строка и столбец являются индексами, а остальные записи 4x4 - это данные с конкретными координатами в середине.Но я получаю TypeError: list indices must be integers or slices, not tuple
, который я не понимаю, так как я ничего не изменил.
Образец данных:
0.0 0.1 0.2 0.3
0.0 -407 -351 -294 -235
0.0001 -333 -285 -236 -185
0.0002 -293 -251 -206 -161
0.00021 -280 -239 -196 -151