【问题标题】:Convert pandas DataFrame to a 3d graph using Index and Columns as X,Y and values as Z?使用索引和列作为 X、Y 和值作为 Z 将 pandas DataFrame 转换为 3d 图?
【发布时间】:2019-08-27 03:06:33
【问题描述】:

我正在尝试使用 Pandas 数据框创建 3d 波动率表面,我觉得我掌握了所有信息,但我不确定如何从中创建 3d 图。我读过的每个指南似乎都使用 3 个单独的数组,但我觉得我拥有的数据应该是可绘制的。

我当前的数据框如下所示:

我希望我的 X 值是我的索引,Y 值是列名(月份),Z 值是框架中包含的实际值(例如,第一个值第一行第一列... X = 35, Y = 9/20/2019, 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

环顾四周后,我尝试模仿代码here:特别是在单元格 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() 进行验证,但这也不起作用,所以我发布了我最初的尝试。

编辑:根据一些 cmets 的建议,我将代码更改为:

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
  • 哦,实际上您混淆了XYX 必须是列,而不是 Y
  • @ImportanceOfBeingErnest 我在 X、Y 上的错误。我的真实代码我使用了稍微凌乱的变量名,所以我在发布之前尝试清理这些名称,但我错过了大写。我尝试了设置 Z = dataframe.values 的方式。我还将列名设置为数字(1,2,3,4,5),现在我得到一个新错误:设置一个带有序列的数组元素。我不完全确定这意味着什么,我环顾四周,我开始想也许不可能按照我的方式用数据绘制 3d 地图
  • 肯定有可能。不过,您将需要创建一个值网格,X, Y = np.meshgrid(X,Y)
  • @ImportanceOfBeingErnest 哟!!!!那行得通。非常感谢!我仍然对一件事感到有些困惑,为什么我必须切换 X 和 Y?我很困惑为什么这是一个问题

标签: python pandas matplotlib


【解决方案1】:

这应该适用于:

Run the code on 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 时,我遇到了一个新错误,它给了我一个错误提示:使用序列设置数组元素。
  • 您的索引、列和值的类型是什么?它们不应该是情节的字符串。
  • 嗯我把它们都转换成了数字,所以我认为我们没有问题
  • 您是否也将列名转换为数字?也许这就是问题所在!如果不起作用,请在此处复制您的代码。
  • 以上代码没有输出任何结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2018-01-01
  • 2011-06-12
相关资源
最近更新 更多