Быстрая интерполяция рассеянного DataFrame - PullRequest
1 голос
/ 13 июня 2019

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

no

1 Ответ

1 голос
/ 13 июня 2019

Благодаря комментарию @ Jdog мне удалось это выяснить:

Создание сплайна перед циклом с scipy.interpolate.RectBivariateSpline и считывание определенных координат с scipy.interpolate.RectBivariateSpline.ev сократило время выполнения интерполяции с 255 с до 289 мс.

def Interpolation(mesh, a, b):

    #interpolation at specific coordinates
    value = mesh.ev(stroke, current)

    return(value)

#%%

#import external modules
import pandas as pd
from scipy import interp

#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])

mesh = interp.RectBivariateSpline(a_index, b_index, matrix)

for iterations in loop:
    value = Interpolation(mesh, a, b)
...