Python中多级线性插值的高效方法

2024-09-30 01:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个项目,估计流量计的不确定性。仪表不确定度基于四个不同的值:

  1. 液体流量(liq)
  2. 流体粘度(cP)
  3. 水液比(wlr)
  4. 气体体积分数(gvf)

第三方提供多个不同liq、cP、wlr和gvf值的仪表表。正如你所猜测的那样,仪表上的数据永远不会完全落入预定义的值中。例如,一分钟的数据可以读取:

  1. 液体流量:6532
  2. 流体粘度:22
  3. 水液比:0.412
  4. 气体体积分数:0.634

利用上述数据,对表格进行四次插值,找出不确定度的大小。你知道吗

我已经想出了一个解决办法,但它似乎笨重,我想知道是否有人有任何想法。我对熊猫游戏还是个新手,非常感谢看到其他人的解决方案。你知道吗

最初,我对数据进行排序,将表缩小为高于或低于我要查找的实际点的值。你知道吗

aliq = 6532 # stbpd
avisc = 22 # centipoise
awlr = 0.412 # water liquid ratio
agvf = 0.634 # gas volume fraction

def findclose(num, colm):

    arr = colm.unique()

    if num in arr:
        clslo = num
        clshi = num

    else:
        clslo = arr[arr > num].min() # close low value
        clshi = arr[arr < num].max() # close high value

    return [clslo, clshi]

df = tbl_vx52[
    (tbl_vx52['liq'].isin(findclose(aliq,tbl_vx52['liq']))) & 
    (tbl_vx52['visc'].isin(findclose(avisc,tbl_vx52['visc']))) & 
    (tbl_vx52['wlr'].isin(findclose(awlr,tbl_vx52['wlr']))) & 
    (tbl_vx52['gvf'].isin(findclose(agvf,tbl_vx52['gvf'])))
                   ].reset_index(drop=True)

该表从2240个值减少到16个值。而不是包括所有的数据(tbl\U vx52)。我已经创建了一些要加载的代码,这样您就可以看到子数据帧是什么样子的,称为df,它只包含本例中区域上方和下方的值。你知道吗

df = pd.DataFrame({'liq':[5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 7000, 7000, 7000, 7000, 7000, 7000, 7000, 7000],
                  'visc':[10, 10, 10, 10, 30, 30, 30, 30, 10, 10, 10, 10, 30, 30, 30, 30],
                  'wlr':[0.375, 0.375, 0.5, 0.5, 0.375, 0.375, 0.5, 0.5, 0.375, 0.375, 0.5, 0.5, 0.375, 0.375, 0.5, 0.5],
                  'gvf':[0.625, 0.75, 0.625, 0.75, 0.625, 0.75, 0.625, 0.75, 0.625, 0.75, 0.625, 0.75, 0.625, 0.75, 0.625, 0.75],
                  'uncert':[0.0707, 0.0992, 0.0906, 0.1278, 0.0705, 0.0994, 0.091, 0.128, 0.0702, 0.0991, 0.0905, 0.1279, 0.0704, 0.0992, 0.0904, 0.1283],
                  })

一些相当粗糙的循环是基于单个输入(liq、visc、wlr或gvf)开始配对的。下面显示的是gvf上的第一个循环。你知道吗

pairs = [
    slice(0,1),
    slice(2,3),
    slice(4,5),
    slice(6,7),
    slice(8,9),
    slice(10,11),
    slice(12,13),
    slice(14,15)]

for pair in pairs:

    df.loc[pair,'uncert'] = np.interp(
        agvf, 
        df.loc[pair,'gvf'], 
        df.loc[pair,'uncert']
    )
    df.loc[pair,'gvf'] = agvf

df = df.drop_duplicates().reset_index(drop=True)

删除重复值,从16行减少到8行。然后再次对wlr重复此操作。你知道吗

pairs = [
    slice(0,1),
    slice(2,3),
    slice(4,5),
    slice(6,7)
]

for pair in pairs:

    df.loc[pair,'uncert'] = np.interp(
        awlr, 
        df.loc[pair,'wlr'], 
        df.loc[pair,'uncert']
    )
    df.loc[pair,'wlr'] = awlr

df = df.drop_duplicates().reset_index(drop=True)

对visc(四行)和liquid(两行)重复上述结构,直到子数组中只剩下一个值。它给出了你工作点的不确定度。你知道吗

我知道它很笨重。如果您对不同方法有任何意见或想法,我们将不胜感激。你知道吗


Tags: 数据dfslicenumlocdroptblarr

热门问题