将pandas DataFrame转换为3D图,使用索引和列作为X轴和Y轴,使用值作为Z轴?

3

我正在尝试使用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,查找没有意义,而且 xy 没有定义。但是,Y 必须是数字类型,不能是 10/18/2019 - ImportanceOfBeingErnest
哦,实际上你把 XY 搞混了。X 应该是列,而不是 Y - ImportanceOfBeingErnest
@ImportanceOfBeingErnest 对于 X,Y 的问题我犯了错误。我的真实代码使用了稍微有点混乱的变量名,所以在发布之前我试图清理变量名,但是错过了大写字母。我尝试了你的方法,将 Z 设置为 dataframe.values。我还将列名设置为数字(1、2、3、4、5),现在我得到了一个新的错误:用序列设置数组元素。我不太确定这是什么意思,我正在四处寻找答案,我开始认为也许无法使用我拥有的数据绘制三维地图。 - user3002540
当然可以。不过你需要创建一个值的网格,X, Y = np.meshgrid(X,Y) - ImportanceOfBeingErnest
@ImportanceOfBeingErnest 喂!!!!! 成功了。非常感谢!但是我还有一点困惑,为什么我必须交换X和Y?我非常困惑这是什么问题。 - user3002540
X是列,Y是行。 - ImportanceOfBeingErnest
1个回答

1

这应该适用于:

在Google Colab上运行代码

import pandas as pd
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

d = {10: [1, 2], 20: [3, 4]}
my_dataframe = pd.DataFrame(data=d)
#  10  20
#  ------
#0  1   3
#1  2   4

X = my_dataframe.index

Y = my_dataframe.columns

Z = my_dataframe.values


fig = plt.figure()
ax = plt.axes(projection = '3d')

ax.contour3D(X,Y,Z)

不幸的是,当我设置 Z = my_dataframe.values 时,出现了新错误,提示“使用序列设置数组元素”。 - user3002540
你把列名也转换成数字了吗?也许这就是问题所在!如果不起作用,请在此处复制您的代码。 - Mahdiar
以上代码没有输出任何结果。 - Georg
刚刚尝试在在线编译器上运行它。你得到的错误是这个吗?“ModuleNotFoundError: No module named 'mpl_toolkits'” - Mahdiar
这段代码在Google Colab上运行良好: - Mahdiar
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接