Hallo zusammen,
ich bin neu mit python unterwegs und habe eigentlich eine recht simple
Aufgabe vor mir (habe ich gedacht).
Ich habe ein json File mit verschiedenen Keys Obejekten und möchte diese
plotten.
1
import numpy as np
2
import matplotlib.pyplot as plt
Ich erstelle mir ein def zum plotten
1
def chart_plot(x,y):
2
plt.plot(x,y)
3
plt.grid(True)
4
plt.ylabel('wert')
5
plt.xlabel('time')
6
plt.show()
Ich lade also die json:
1
chart = json.loads(open('base.json').read())
Dann soll er die numpy arrays solange füllen, wie es die Anzahl der
Zeitstempel (key date) vorgibt.
1
for i in range(0,len(chart['date'])):
2
x = np.array(chart['date'])
3
y = np.array(chart['wert'])
4
chart_plot(x,y)
Leider kommt immer ein Fehler:
1
TypeError: list indices must be integers or slices, not str
Ich habe echt alles versucht.
Habe es sogar über pandas und dataframe versucht, mit dem gleichen
Ergebnis/Fehler.
Kann mir jemand sagen, wo mein Fehler ist bzw kann mir ein einfaches Bsp
zeigen, wie ich eine json auslese und zwei Objekte davon in einem
x-y-Diagramm plotten kann?
Ich dachte die Aufgabe ist einfach, aber auch nach 2h komme ich nicht
zum Ziel.
Vielen Dank!
Andi :)
Chart hat genau den Inhalt der json Datei.
Print(Chart) gibt in der Ausgabe das aus, was man auch in einem Editor
sehen würde.
An anderer Stelle funktioniert der Zugriff auf die Objekte aber auf
diese Art und Weise... Mhm...
Andi schrieb:> Chart hat genau den Inhalt der json Datei.> Print(Chart) gibt in der Ausgabe das aus, was man auch in einem Editor> sehen würde.
Jetzt wissen wir immer noch nicht, wie Deine JSON-Datei aussieht. Aber
um Deine Frage zu beantworten, wäre dieses Wissen essentiell.
>> Die Klammern sind also etwas anders... Aber das sollte dem Finden der> Keys doch keinen Abbruch tun?
Doch, natürlich. Was Du da hast, ist eine Liste von Dictionaries. Auf
die Liste kannst Du nur mit Integer-Indices zugreifen. Was Du also
machen willst, ist:
Vielen herzlichen Dank!
Sheeva P. schrieb:> meineListe = [{"date":12345,"wert":6789},{"date":23456,"wert":2763}]> x = [e['date'] for e in meineListe]> y = [e['wert'] for e in meineListe]
Wie kann ich in diesen Plot eine einfache rote Linie plotten mit einem
float Wert?
Offenbar sind x unx y nicht mit int/float in einem Plot vereinbar...
Vielen Dank!
Andi
Andi schrieb:> Wie kann ich in diesen Plot eine einfache rote Linie plotten mit einem> float Wert?> Offenbar sind x unx y nicht mit int/float in einem Plot vereinbar...
Aber ja doch:
1
from matplotlib import pyplot as plt
2
import dateutil.parser
3
4
# statt json.load()...
5
d = [{'date': '2017-01-01', 'wert': 5},
6
{'date': '2017-02-01', 'wert': 4},
7
{'date': '2017-03-01', 'wert': 5},
8
{'date': '2017-04-01', 'wert': 6},
9
{'date': '2017-05-01', 'wert': 6}]
10
11
x = [dateutil.parser.parse(e['date']) for e in d]
12
y1 = [e['wert'] for e in d]
13
y2 = len(y1) * [4.4]
14
15
plt.plot(x, y1)
16
plt.plot(x, y2, 'r')
17
plt.show()
Ach so, kleiner Hinweis am Rande: matplotlib ist eine leistungsfähige
und IIRC an Matlab angelehnte Python-Library, und daher wahrscheinlich
keine besonders gute Übung für den Einstieg ist. Auch wenn Du gerade
Dein ganz konkretes Problem lösen möchtest, erscheint es mir
zielführender, zuerst einmal die Grundzüge der Sprache zu erwerben:
Datentypen wie Listen und Dictionaries, List- und Dict-Comprehensions,
die Builtinfunktionen sowie vielleicht eine kleine Tour durch die
Standardmodule. YMMV. ;-)