python(反向)插值将tenorpoint值指定给两个最近的tenor点

2024-05-16 12:54:46 发布

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

我想做一个反向类型的(numpy)插值

考虑具有“风险”值为2.2的情况,并将其映射到1.50的Tor点值。 考虑A有一个列表(或数组)= 0.5,1,2,3,5。 现在,我想将2.2的风险值归因于它将是什么,以线性插值的形式映射到最近的两个期限点(在本例中为1.0和2.0)

在本例中,函数将生成风险值2.0(映射到到期值1.50)以

  1. 对于1.0期限点:2.2*(1.5-1.0)/(2.0-1.0)
  2. 对于2.0期限点:2.2*(2.0-1.5)/(2.0-1.0)

是否有numpy/scipy/panda或python代码可以做到这一点

谢谢


Tags: 函数代码numpy类型列表情况scipy数组
1条回答
网友
1楼 · 发布于 2024-05-16 12:54:46

嗯,我尝试了一些不同的方法,但也许这对你有帮助。我尝试使用interpolate.interp1d(带有外推点fill_value="extrapolate"的选项)为新网格点插值点,以将范围扩展到给定的间隔之外。在您的第一个示例中,新的点始终是内部的,在注释示例中也是外部的,因此我使用了更一般的情况。这可能仍然需要改进,但应该给出一个想法:

import numpy as np
from scipy import interpolate

def dist_val(vpt, arr):
    dist = np.abs(arr-np.full_like(arr, vpt))
    i0 = np.argmin(dist)
    dist[i0] = np.max(dist) + 1
    i1 = np.argmin(dist)
    return (i0, i1)

def dstr_lin(ra, tnl, tnh):
    '''returns a risk-array like ra for tnh based on tnl'''
    if len(tnh) < len(tnl) or len(ra) != len(tnl):
        return -1
    rah = []
    for vh in tnh:
        try:
            rah.append((vh, ra[tnl.index(vh)]))
        except ValueError:
            rah.append((vh, float(interpolate.interp1d(tnl, ra, fill_value="extrapolate")(vh))))
    return rah

ra =  [0.422, 1.053, 100.423, -99.53]
tn_low = [1.0, 2.0, 5.0, 10.0]
tn_high = [1.0, 2.0, 3.0, 5.0, 7.0, 10.0, 12.0, 15.0]

print(dstr_lin(ra, tn_low, tn_high))

这导致

[(1.0, 0.422), (2.0, 1.053), (3.0, 34.17633333333333), (5.0, 100.423), (7.0, 20.4418), (10.0, -99.53), (12.0, -179.51120000000003), (15.0, -299.483)]

但请小心,我不确定您的数据是否“表现良好”,插值或外推可能超出范围,因此请小心使用

相关问题 更多 >