python – Visualización en 3D de las columnas de un dataframe

Quiero hacer una visualización en 3D de las columnas beta1, beta2 y cost del siguiente marco de datos.

>>> df_thetas_value.head()
    beta0   beta1   beta2   cost
0   0.511275    0.404934    0.783799    2.820328e+07
1   34.486883   123.591098  143.711200  1.122274e+06
2   36.435332   163.909685  118.786188  8.688915e+05
3   40.692430   204.987832  113.643168  8.072207e+05
4   42.270578   237.838460  91.286946   6.112149e+05

Entonces queria hacer como en este articulo:

# print(len(df_thetas_value))
world = np.zeros((len(df_thetas_value), len(df_thetas_value)))
for i, row in df_thetas_value.iterrows():
    print(item)
    i,j = row("beta1"), row("beta2")
    world(i)(j) = row("cost")
world

Pero hay un problema: los i,j no son int en mi caso. Entonces me devuelve:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-38-2732bcd8c872> in <module>
      3 for i, row in df_thetas_value.iterrows():
      4     i,j = row("beta1"), row("beta2")
----> 5     world(i)(j) = row("cost")
      6 world
      7 

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Pensaba hacer un dicionario de las posiciones {(1,1): (0.404934, 0.783799) ...

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from mpl_toolkits.mplot3d import Axes3D

## Matplotlib Sample Code using 2D arrays via meshgrid
X, Y = np.meshgrid(df_thetas_value('beta1').values, df_thetas_value('beta2').values)
Z = df_thetas_value('cost').values
fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)
plt.title('Original Code')
plt.show()

Pero Z no esta en la buena diemnsion. Todos los elementos necesitan haber un tamano de 2. En efecto, esto devuelve:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-36-b836e6304023> in <module>
     14 ax = Axes3D(fig)
     15 surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
---> 16                        linewidth=0, antialiased=False)
     17 ax.set_zlim(-1.01, 1.01)
     18 

/opt/conda/lib/python3.7/site-packages/mpl_toolkits/mplot3d/axes3d.py in plot_surface(self, X, Y, Z, norm, vmin, vmax, lightsource, *args, **kwargs)
   1554 
   1555         if Z.ndim != 2:
-> 1556             raise ValueError("Argument Z must be 2-dimensional.")
   1557         if np.any(np.isnan(Z)):
   1558             cbook._warn_external(

ValueError: Argument Z must be 2-dimensional.

Tambien intenté:

ax.plot_trisurf(df_thetas_value('beta1').values, df_thetas_value('beta2').values, df_thetas_value('cost').values, cmap=cm.jet, linewidth=0.2)
plt.show()

Pero no se muestra nada.

Al final hizé:

from scipy.interpolate import griddata

# 2D-arrays from DataFrame
df = df_thetas_value
x1 = np.linspace(df('beta1').min(), df('beta1').max(), len(df('beta1').unique()))
y1 = np.linspace(df('beta2').min(), df('beta2').max(), len(df('beta2').unique()))

"""
x, y via meshgrid for vectorized evaluation of
2 scalar/vector fields over 2-D grids, given
one-dimensional coordinate arrays x1, x2,..., xn.
"""

x2, y2 = np.meshgrid(x1, y1)

# Interpolate unstructured D-dimensional data.
z2 = griddata((df('beta1'), df('beta2')), df('cost'), (x2, y2), method='cubic')

# Ready to plot
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x2, y2, z2, rstride=1, cstride=1, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)
plt.title('Meshgrid Created from 3 1D Arrays')

plt.show()

Pero solo se muestra el background:

introducir la descripción de la imagen aquí