快速插值分散的DataFrame

时间:2019-06-13 09:40:58

标签: python python-3.x interpolation

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似乎是最好的解决方案,但据我了解,它只能创建现有数据的更细网格,而无法在特定坐标处输出插值
  • 为特定坐标(a,b)周围的区域创建较小的4x4矩阵可能会减少每个循环的执行时间,但是我确实很难在较小的矩阵上使用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 个答案:

答案 0 :(得分:1)

由于 @Jdog 的评论,我得以弄清楚:

使用scipy.interpolate.RectBivariateSpline在循环之前创建一次样条,并使用scipy.interpolate.RectBivariateSpline.ev读取特定坐标,将插值的执行时间从255s减少到289ms。

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)