python - 使用索引和列作为 X、Y 和值作为 Z 将 pandas DataFrame 转换为 3d 图?
问题描述
我正在尝试使用 Pandas 数据框创建 3d 波动率表面,我觉得我拥有所有信息,但我不确定如何从中创建 3d 图。我读过的每个指南似乎都使用 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
我在这里做错了什么?Fwiw 我在链接中使用 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.
解决方案
这应该适用于:
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)
推荐阅读
- ios - webview没有显示css样式
- c++ - 如何在 Windows 中设置行缓冲区?
- go - cmd := exec.Command("ssh", "ec2-user@publicip") 退出权限被拒绝 (publickey,gssapi-keyex,gssapi-with-mic)
- selenium-webdriver - 我无法在 Intellij 的步骤定义文件中导入 Selenium Webdriver
- python - 如何用CV制作数字检测器
- python - 如何在 python 日期时间模块中自定义小时、月、年?
- android - Firebase 和登录,没有一个教程是最新的,甚至在谷歌上也没有。。正确的方法是什么?
- java - 无法将名为“entityManagerFactory”的 bean 识别为使用存储库的自动装配注释
- vaadin - SingleSelect 仍然保留一个选定的项目,尽管该项目已从网格中的显示中过滤掉 (Vaadin 14)
- node.js - 将 express 服务器实例传递给其他节点文件