python - 访问 UnivariateSpline 曲线上的值

标签 python matplotlib scipy interpolation

我正在研究一个简单的函数来拟合 yield 曲线。我正在使用 Scipy.interpolate.UnivariateSpline 来完成任务。该函数应返回特定时间间隔(到期日)的 yield 值。

这是我编写的简单函数:

def curve_fit(spot_yields_df, a):
    x = spot_yields_df['INTERVAL']
    y = spot_yields_df['SPOT']

    s1 = inter.UnivariateSpline(x, y, s=0.5)

    plt.plot(x, y, marker="o", markerfacecolor='None', markersize=5, linestyle='None')
    plt.plot(x, s1(x))
    plt.show()

    return s1(a)

在下面的示例中作为输入提供的 datafrme 如下所示:

spot_yields_df
Out[53]: 
    CURVE_ID      ISIN    REL_DATE              SPOT   INTERVAL
0   crv_sagb  AU316223  2019-05-31  6.84543548187739   0.263014
1   crv_sagb  ED957814  2019-05-31  7.41912841796875   0.627397
2   crv_sagb  EF656651  2019-05-31  7.01629638671875   1.835616
3   crv_sagb  EJ235944  2019-05-31  7.58026123046875   3.750685
4   crv_sagb  CP507394  2019-05-31  9.12445068359375   7.564384
5   crv_sagb  EJ750004  2019-05-31  9.56756591796875  10.679452
6   crv_sagb  EI258596  2019-05-31  9.56085205078125  11.756164
7   crv_sagb  EJ750009  2019-05-31  10.1046752929688  12.843836
8   crv_sagb  EK773288  2019-05-31  10.2053833007813  15.758904
9   crv_sagb  EF556585  2019-05-31  10.2926635742188  16.846575
10  crv_sagb  EJ750019  2019-05-31  10.7022094726562  17.684932
11  crv_sagb  EK773306  2019-05-31  10.8700561523437  20.684932
12  crv_sagb  EI258592  2019-05-31  10.2859497070313  21.764384
13  crv_sagb  EJ749864  2019-05-31  10.8834838867188  24.687671
14  crv_sagb  EJ235914  2019-05-31  10.0711059570313  28.767123

这是绘图,表明该功能运行良好。

enter image description here

例如,根据图表,s1(30) 和 curve_fit(spot_yields_df, 30) 分别应返回 10 左右的值。而它返回 6 左右的值:

curve_fit(spot_yields_df, 30)
Out[52]: array(6.84325277)

如何返回与图表显示的内容相对应的值。非常感谢任何帮助。

最佳答案

看起来问题不在于程序,而在于插值方法本身(这也意味着问题更适合 cross-validated ,但有时你无法提前知道)。

如果您使用平滑因子(在您的情况下,s=0.5 是平滑因子,请参阅 the docs ),曲线不会完全触及数据集中的每个点。
如果您希望它命中每个点,请尝试设置 s=0 - 在这种情况下,外推到 30 将是从两个最高点的线性外推(您可以验证这一点) 。
或者,您可以设置 s=None (或者只是不为其填充值,这是默认值),在这种情况下,该函数将为 s 选择一个合理的值> - 从我这边运行代码来看,这看起来确实合理(并且产生的值为 9.87195):

enter image description here

关于python - 访问 UnivariateSpline 曲线上的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56932173/

相关文章:

python - 如何使用 python 生成 0 和 1 组合的 PBM

python - 在 matplotlib bar_label 中隐藏小于 n 的条形标签

python - matplotlib颜色表的直方图均衡化

python - scipy:基本说明

Python:当 readline() 使用 Popen() 调用的进程时收到垃圾

python - 查找一个数据集中的数据在另一数据集中的对应关系

python - : import scipy as sp/sc 的官方缩写

Python 等效于 MATLAB 的 lsqr(),第一个参数是一个函数

python - Pandas:如何从列中选择特定值并像在 SQL 中那样进行聚合?

python - Matplotlib 3D 图 - 输入数据的二维格式?