使用Scipy.interpolate.splev进行推断以填充缺失的数据Python / Pandas

时间:2019-12-30 12:30:49

标签: python pandas scipy extrapolation

我正在尝试使用外推法获取一些缺失数字的数据,并且确实很挣扎。

以下是一些期权数据,行使价格为指数,波动率为MidVol。我要尝试做的是找到MidVol来查找未列出的各种警示,例如2000.0、3000.0或30000.0或40000.0。

         MidVol    CallDelta PutDelta
4000.0   0.757832  0.910918 -0.089082
5000.0   0.739650  0.844523 -0.155477
6000.0   0.742915  0.766228 -0.233772
7000.0   0.733530  0.685637 -0.314363
8000.0   0.753219  0.610900 -0.389100
9000.0   0.750366  0.539006 -0.460994
10000.0  0.756793  0.476428 -0.523572
11000.0  0.774761  0.426470 -0.573530
12000.0  0.781004  0.379058 -0.620942
14000.0  0.795634  0.303317 -0.696683
16000.0  0.812305  0.247911 -0.752089
18000.0  0.831367  0.207874 -0.792126
20000.0  0.852848  0.179159 -0.820841

我已经使用poly1dinterp1d绘制了当前数据的曲线,由于interp1d是唯一似乎具有外推功能的曲线,您会认为将是一个很好的使用。我对该曲线的代码是:

curve = interp1d(df.index, df['MidVol'], kind='cubic', fill_value='extrapolate')

然后将使用以下代码来计算丢失的警告:

missing = [20000, 22000,24000,26000,28000,30000]
extrap = [f(x).item() for x in sample]

但是,当我然后尝试外推并获取df中不在的点的数据时,我得到了这样一个笑话:

enter image description here

首先,有人知道为什么外推失败了吗? 30000.0打击的MidVol应该约为0.95。

此后,我偶然发现scipy.splev实际上比interp1d更适合数据。我使用的代码是:

ipo = spi.splrep(df.index, df['MidVol'], k=5, s=6)
iy = spi.splev(df.index, ipo)

我还注意到文档中有一个ext变量。这是否意味着我可以用它来推断?如果可以的话,有谁能像我上面用if ext=0, return the extrapolated value.一样解释我的操作方式,然后为每个丢失的罢工计算missing = [20000, 22000,24000,26000,28000,30000]

如果任何人都可以阐明我的任何一个问题(为什么MidVol不能正确推断或如何用interp1d推断),我将非常感激。

1 个答案:

答案 0 :(得分:0)

您可以使用make_interp_splineCubicSpline bc_type参数来控制外推模式。例如。您可以使用bc_type =“ natural”强制进行线性外推。