Python 在大熊猫中跨稀疏栅格插值

Python 在大熊猫中跨稀疏栅格插值,python,pandas,numpy,scipy,quantitative-finance,Python,Pandas,Numpy,Scipy,Quantitative Finance,我有一个数字网格(期权波动率,见下图),其中在网格末端的条目很少(即非常稀疏)。我想使用整个网格的数据,即二维插值方法,对该网格进行插值\填充。我看过一些例子(例如),但我不熟悉scipy和numpy API,看起来他们正在做一些与实际插值无关的绘图工作 明确地说,我目前正在将此数据存储在熊猫数据帧中,索引为OPT_EXPIRE_DT和OPT_stroke_PX,并希望最后使用另一个熊猫数据帧,但我可以根据需要转换为其他数据类型 谢谢你的帮助 下面是一个例子。让我们先创建一些缺少值的数据帧: N

我有一个数字网格(期权波动率,见下图),其中在网格末端的条目很少(即非常稀疏)。我想使用整个网格的数据,即二维插值方法,对该网格进行插值\填充。我看过一些例子(例如),但我不熟悉scipy和numpy API,看起来他们正在做一些与实际插值无关的绘图工作

明确地说,我目前正在将此数据存储在熊猫数据帧中,索引为
OPT_EXPIRE_DT
OPT_stroke_PX
,并希望最后使用另一个熊猫数据帧,但我可以根据需要转换为其他数据类型

谢谢你的帮助


下面是一个例子。让我们先创建一些缺少值的数据帧:

N = 5
df = pd.DataFrame(np.empty((N, N)))
df.iloc[:] = np.nan
df.iloc[:2] = 1
df.iloc[-2:] = 2
df
输出:

     0    1    2    3    4
0  1.0  1.0  1.0  1.0  1.0
1  NaN  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN  NaN
3  NaN  NaN  NaN  NaN  NaN
4  2.0  2.0  2.0  2.0  2.0
      0     1     2     3     4
0  1.00  1.00  1.00  1.00  1.00
1  1.25  1.25  1.25  1.25  1.25
2  1.50  1.50  1.50  1.50  1.50
3  1.75  1.75  1.75  1.75  1.75
4  2.00  2.00  2.00  2.00  2.00
然后我们可以使用
griddata
插值:

# create meshgrid
x, y = np.mgrid[0:N, 0:N]

# find indices of non-missing values
ix_notna = df.notna().values

# interpolate
z_interpolated = interpolate.griddata(
    (x[ix_notna], y[ix_notna]),
    df.values[ix_notna],
    (x, y),
    method='linear')

# griddata returns numpy array, so we convert it back to DataFrame
df_interpolated = pd.DataFrame(z_interpolated)
df_interpolated
输出:

     0    1    2    3    4
0  1.0  1.0  1.0  1.0  1.0
1  NaN  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN  NaN
3  NaN  NaN  NaN  NaN  NaN
4  2.0  2.0  2.0  2.0  2.0
      0     1     2     3     4
0  1.00  1.00  1.00  1.00  1.00
1  1.25  1.25  1.25  1.25  1.25
2  1.50  1.50  1.50  1.50  1.50
3  1.75  1.75  1.75  1.75  1.75
4  2.00  2.00  2.00  2.00  2.00
我们可以目视检查它是否按预期工作:

fig, ax = plt.subplots(1, 2)
ax[0].imshow(df.values)
ax[0].set_title('original')
ax[1].imshow(df_interpolated.values)
ax[1].set_title('interpolated')
输出:

     0    1    2    3    4
0  1.0  1.0  1.0  1.0  1.0
1  NaN  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN  NaN
3  NaN  NaN  NaN  NaN  NaN
4  2.0  2.0  2.0  2.0  2.0
      0     1     2     3     4
0  1.00  1.00  1.00  1.00  1.00
1  1.25  1.25  1.25  1.25  1.25
2  1.50  1.50  1.50  1.50  1.50
3  1.75  1.75  1.75  1.75  1.75
4  2.00  2.00  2.00  2.00  2.00

所以,我认为您需要做的是转换成numpy数组并返回,这应该相当简单。下面的代码通过线性插值计算简单数组的NaN项的值。输出数组变成np.array([[1,2,3],[2,3,4],[5,5.5,6]])


嘿,注意填写遗漏的价格或隐含的波动率。有很多方法可以通过期权市场从双方手中转移资金,因此存在一些“奇怪”的合同和价格。我也会在谷歌上搜索微笑和傻笑选项,阅读预期的IV曲线,并在插入数据时考虑这些。请不要发布代码、数据或回溯的图像。将其复制并粘贴为文本,然后将其格式化为代码(选择它并键入
ctrl-k
)。。。你的问题是什么?当您尝试一些您发现的方法时,它们是否产生了看起来正确的解释值?