web-dev-qa-db-fra.com

TypeError: l'objet de type 'DataFrame' n'est pas sérialisable JSON

J'essaie de créer un graphique de complot avec certaines données de mon serveur PostgreSQL, mais lorsque j'essaie de représenter graphiquement, un message d'erreur s'affiche: "TypeError: un objet de type" DataFrame "n'est pas sérialisable JSON"

Voici le code jusqu'à présent:

import dash
import numpy as np
import pandas as pd
import plotly.offline as py
import plotly.graph_objs as go
import psycopg2 as pg2
import datetime

conn = pg2.connect(database='X',user='X',password=secret)

cur = conn.cursor()

cur.execute("SELECT * FROM times;")
a = cur.fetchall()
str(a)


df = pd.DataFrame([[ij for ij in i] for i in a])
df.to_json()
df.rename(columns={0: "Serial Number", 1: "Status", 2: "Date", 3: "Time", 4: "Number"}, inplace=True);

x = df["Date"]
data = [go.Scatter(
            x=x,
            y=df["Status"])]

layout = go.Layout(title="Server Data Visualization",
                   xaxis = dict(
                   range = [df.head(1),
                            df.tail(1)]),
                    yaxis=dict(title = "Status"))

fig = go.Figure(data = data, layout = layout)
py.plot(fig)

Le df ["Date"] est la date au format "2018-08-03" et le df ["Statut"] est "Uptime" ou "Temps mort".

Quelqu'un peut-il me dire ce que je fais mal? J'essaie de faire en sorte que ce graphique soit essentiellement une date sur l'axe des x lue sur le serveur SQL, puis deux valeurs sur l'axe des y qui représentent la valeur de "temps de disponibilité" ou de "temps d'indisponibilité".

Traceback (most recent call last):
  File "\\srv31data1\users$\User\Desktop\basic.py", line 37, in <module>
    py.plot(fig)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\offline\offline.py", line 469, in plot
    '100%', '100%', global_requirejs=False)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\offline\offline.py", line 184, in _plot_html
    cls=utils.PlotlyJSONEncoder)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'DataFrame' is not JSON serializable

Edit: Désolé, j'ai oublié de poster le suivi!

12
peolss

Votre df est toujours un bloc de données car vous ne l'avez pas assigné comme json.

   df = df.to_json()

Cela devrait marcher. Faites le moi savoir si non.

19
Upasana Mittal