我正在尝试使用Pandas数据框创建一个三维波动率曲面,我感觉我已经拥有了所有的信息,但是我不确定如何从中创建出一个三维图形。我阅读的每一篇指南似乎都使用了3个单独的数组,但我感觉我拥有的数据应该是可绘制的。
我的当前数据框如下:
我希望我的X值是数据框的索引,Y值是列名(即月份),而Z值则是数据框实际包含的数值(例如,在第一行第一列中,X=35,Y=2019年9月20日,Z=0.0879441)
09/20/2019 10/18/2019 11/15/2019 12/20/2019 01/17/2020
35 0.0879441 0.0883913 0.0909429 0.0987415 0.0987912
40 0.0833955 0.0837764 0.087088 0.0939974 0.0943858
45 0.0788468 0.0810964 0.084231 0.0905135 0.0912521
50 0.0766043 0.0784164 0.0820014 0.0891319 0.0871471
55 0.0743284 0.0744855 0.0757832 0.0729094 0.068998
60 0.0612799 0.0664453 0.0758287 0.0729539 0.0690739
65 0.0613116 0.0664716 0.0655504 0.0622985 0.0630833
在查看了一些资料后,我试图模仿这里的代码:特别是第5和6个单元格。以下是我的代码:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
X = my_dataframe.index
Y = my_dataframe.columns
def lookup(row, cols):
return(my_dataframe.loc[x,y])
Z = lookup(x,y)
fig = plt.figure()
ax = plt.axes(projection = '3d')
ax.contour3D(X,Y,Z)
我基本上把Z定义为X和Y的函数,希望可以工作,但是徒劳无功,出现了以下错误:
Length of x must be number of columns in z
我在这里做错了什么?顺便说一下,我尝试使用链接中的X,Y = np.meshgrid(),但那也不起作用,所以我发布了我的原始尝试。
编辑:根据一些评论的建议,我已经将代码更改为如下:
Y = my_dataframe.index
my_dataframe.columns = [1,2,3,4,5]
X = my_dataframe.columns
Z = my_dataframe.values
fig = plt.figure()
ax = plt.axes(projection = '3d')
ax.contour3D(X,Y, Z)
我将列从日期更改为数字,以确保它们是数值类型。我还将 Z 设置为数据框的值。现在出现了一个新错误:
setting an array element with a sequence.
Z = dataframe.values
,查找没有意义,而且x
和y
没有定义。但是,Y
必须是数字类型,不能是10/18/2019
。 - ImportanceOfBeingErnestX
和Y
搞混了。X
应该是列,而不是Y
。 - ImportanceOfBeingErnestX, Y = np.meshgrid(X,Y)
。 - ImportanceOfBeingErnest