代码之家  ›  专栏  ›  技术社区  ›  AK88

在两个动态日之间插值

  •  0
  • AK88  · 技术社区  · 7 年前

          ID            Code    Days  Yield
    KZW1KM093436    NTK273_1343 4    2.1781
    KZW1KD913708    NTK091_1370 11   2.1683
    KZK1KY011222    MKM012_0122 17   2.1602
    KZW1KM063603    NTK182_1360 32   2.1419
    KZW1KM093477    NTK273_1347 32   2.1419
    KZW1KD913740    NTK091_1374 39   2.1342
    KZW1KM063629    NTK182_1362 46   2.1269
    KZW1KM093501    NTK273_1350 53   2.1202
    

    我需要以下静态数据点(天) Yields

    28
    91
    182
    273
    364
    730
    1825
    2555
    3640
    

    当文件更新时,数据的结构也会改变(按 Days ). 有几种可能的情况:

    • 如果值在 数据列等于 Static 数据,然后我想取相应的 Yield
    • 然后插值 产量 28 中的天数 KZK1KY011222 MKM012_0122 17 2.1602 KZW1KM063603 NTK182_1360 32 2.1419
    • 如果没有最适用的起始值或结束值 到 28 3640 ,那么我想 从最近的 .

    产量 根据以下公式计算:

    enter image description here

    28 我会有几天 (28 - 17)*(2.1419-2.1602)/(32-17)+2.1602 = 2.1468

    1 回复  |  直到 7 年前
        1
  •  2
  •   Onyambu    7 年前
     A=read.table(text="ID            Code    Days  Yield
                    KZW1KM093436    NTK273_1343 4   2.1781
                    KZW1KD913708    NTK091_1370 11  2.1683
                    KZK1KY011222    MKM012_0122 17  2.1602
                    KZW1KM063603    NTK182_1360 32  2.1419
                    KZW1KM093477    NTK273_1347 32  2.1419
                    KZW1KD913740    NTK091_1374 39  2.1342
                    KZW1KM063629    NTK182_1362 46  2.1269
                    KZW1KM093501    NTK273_1350 53  2.1202",header=T)
    
     k=c(28L, 91L, 182L, 273L, 364L, 730L, 1825L, 2555L, 3640L)
    

    现在首先找到要预测的值所在的区间

     funfun=function(x){
                 if(x%in%A$Days)return(A[A$Days==x,3:4])
                 v=findInterval(x,A$Days);na.omit(A[c(v,v+1),3:4])}
    

     funfun(28)
      Days  Yield
    3   17 2.1602
    4   32 2.1419
    funfun(34)
      Days  Yield
    5   32 2.1419
    6   39 2.1342
    funfun(4)
      Days  Yield
    1    4 2.1781
    funfun(0)
      Days  Yield
    1    4 2.1781
    funfun(345)
      Days  Yield
    8   53 2.1202
     funfun(11)
      Days  Yield
    2   11 2.1683
    

    接下来,我们编写一个计算预测值的函数:

     funfun1=function(i){
       s=funfun(i)
       if(nrow(s)==1)return(s$Yield)
       (i-s$Days[1])*Reduce("/",rev(sapply(s,diff)))+s$Yield[1]
     }
    
    sapply(k,funfun1)
    [1] 2.14678 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020
    

    K中给出的大多数值都不在天数范围内,因此只取最后一个值。如果我们有不同的价值观呢?说:

      k=c(4,11,17,18,20,33,48,50)
      sapply(k,funfun1)
      [1] 2.178100 2.168300 2.160200 2.158980 2.156540 2.140800 2.124986 2.123071
    

    我们看到,对于数据中已经存在的那些值,我们得到了它们的收益率。对于上述数据,我们获得了数据中的最后收益率,以及我们根据需要估计的中间收益率。