【问题标题】:python (reverse) Interpolate assign a tenor-point value to two closest tenor pointpython (reverse) Interpolate 将一个中点值分配给两个最近的中点
【发布时间】:2021-03-31 08:08:42
【问题描述】:

我正在寻找一种反向类型的 (numpy) 插值。

考虑一下我的“风险”值为 2.2,并且映射到这个中点值 1.50 的情况。 考虑一个有一个列表(或数组)= [0.5, 1.0, 2.0, 3.0, 5.0] 的 Tenor-list。 现在,我想以线性插值的形式将这个风险值 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 代码可以做到这一点?

谢谢!

【问题讨论】:

  • 在我看来这不是线性的。基本上1.02.0 的值是1.5 的值除以2
  • 嗨@QuangHoang,这是我能想到的最简单的例子......现实情况类似于给定的(a)风险值数组[0.422、1.053、100.423、-99.53],以及(b) 映射到 [1.0, 2.0, 5.0, 10.0] 的期限数组,如何将风险值数组分配给更大的 [1.0, 2.0, 3.0, 5.0, 7.0, 10.0, 12.0, 15.0],其中使用线性插值将原始风险值重新分配到粒度较小的网格

标签: python numpy interpolation


【解决方案1】:

好吧,我尝试了一些不同的方法,但也许这对你有帮助。我尝试使用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)]

但请注意,我不确定您的数据“表现如何”,插值或外推可能会超出范围,因此请谨慎使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多