Seite 1 von 1
Leeres DataFrame trotz Zuweisung
Verfasst: Donnerstag 27. Februar 2020, 17:18
von Gregoah
Hey,
ich bin auf etwas gestoßen, das ich beim besten Willen nicht verstehe.
Ich überführe einer Funktion die Variable 'Close'. Diese soll in einem DataFrame namens 'RSI_DATA_Append' an der Stelle 'Close' gespeichert werden. Code sieht wie folgt aus:
def Func(Close):
RSI_DATA_Append=[ ]
RSI_DATA_Append=pd.DataFrame(RSI_DATA_Append)
RSI_DATA_Append['Close']=Close
print(RSI_DATA_Append)
---> Empty DataFrame
Columns: [Close]
Index: []
Es sollen im späteren Funktionsverlauf noch sehr viele weitere Variablen eingespeichert werden (daher die DF Erstellung)
Wenn ich in der ersten Zeile print(Close) einfüge kann ich feststellen, dass der Wert richtig übergeben wurde. WARUM zur Hölle bleibt das DF dann leer?
DANKE IM VORAUS!
Grüße
Re: Leeres DataFrame trotz Zuweisung
Verfasst: Donnerstag 27. Februar 2020, 17:19
von Gregoah
Dass die Zeilen unter der Funktion eingerückt sein müssen weiß ich. Das wird von der Webseite hier falsch formatiert..
Re: Leeres DataFrame trotz Zuweisung
Verfasst: Donnerstag 27. Februar 2020, 17:24
von __deets__
Zur richtigen Formatierung gibt es die code-tags - das ist der </>-Button im vollstaendigen Editor.
Und zu deiner Frage: ich sehe nur, dass du einen DataFrame anlegst. Ich sehe nicht, das du ihn auch zurueck gibst. Daten kommen in eine Funktion als Parameter, und verlassen sie per return. Globale Variablen gibt es zwar, die sollte man allerdings tunlichst vermeiden.
Die Zuweisung RSI_DATA_Append=[] ist im uebrigen Unfug, wenn direkt in der Zeile danach ein DataFrame erzeugt wird. So wuerde ich das ganze machen (unter Nutzung der in Python ueblichen Namenskonvenitionen):
Code: Alles auswählen
def func(df, close):
df['Cloes'] = close
def main():
df = pd.DataFrame(RSI_DATA_Append) # wo auch immer RSI_DATA_Append herkommt...
func(df, close) # wo auch immer close herkommt.
if __name__ == "__main__":
main()
Re: Leeres DataFrame trotz Zuweisung
Verfasst: Donnerstag 27. Februar 2020, 17:44
von Gregoah
Danke schonmal.
RSI_DATA_Append soll nicht überführt werden, sondern zu jedem Aufruf der Funktion leer sein. Der volle DF wird dann am Ende zurückgegeben. Ich habe es jetzt leicht umgewandelt und stoße auf noch größere Verwirrung
Code: Alles auswählen
# angenommen Close sei 5
def Func(Close):
print(Close)
RSI_DATA_Append=pd.DataFrame( [ ] )
RSI_DATA_Append['Close']=Close
print(RSI_DATA_Append)
print(Close)
return RSI_DATA_Append
ausgegeben wird:
5
Empty DataFrame
Columns: [Close]
Index: []
5
------> ?!?!?!?
Re: Leeres DataFrame trotz Zuweisung
Verfasst: Donnerstag 27. Februar 2020, 17:52
von __deets__
Was erwartest du denn? Ist dir klar, das eine Spalte mit mehrerer Werten auch eine Liste erwartet, und nicht einen einzelnen skalaren Wert? Und warum denkst du Close waere irgendwie anders geworden?
Re: Leeres DataFrame trotz Zuweisung
Verfasst: Donnerstag 27. Februar 2020, 17:58
von __blackjack__
Mal so nebenbei: Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Und man kann sich den Zwischenschritt „leerer DataFrame“ → „hinzufügen von "Close"-Spalte“ sparen und gleich den `DataFrame` mit der Spalte erstellen. Dann stellt sich aber auch langsam die Frage wozu es da eine eigene Funktion für braucht.
Edit: Nochmal zur Erklärung des Phänomens: Du hast einen leeren DataFrame, also 0 Zeilen, und fügst da eine Spalte hinzu die dann natürlich auch 0 Zeilen hat, und jeder dieser 0 Zeilen wird in dieser Spalte der Wert 5 zugewiesen.
Was soll das denn überhaupt werden? Du hast hoffentlich nicht vor einen `DataFrame` Zeile um Zeile um Werte zu erweitern? Das macht man nicht, das ist auch gnadenlos ineffizient.
Re: Leeres DataFrame trotz Zuweisung
Verfasst: Donnerstag 27. Februar 2020, 18:17
von Gregoah
haha gut erkannt!

im groben das projekt: ich hole über eine API die letzten 60 preise (im 1 Min Abstand) eines Produkts. Zu jedem Berechne ich einen iterativen Index (RSI= Relative Strength Index).
Das stellt die Basis dar. Darauf frage ich im 1 Min Takt weiter den Momentanpreis ab, berechne den RSI für diesen neuen Wert, press das in einen DF und hänge ihn an den Basis DF an und speichere ihn in einer Excel. Das ganze läuft endlos.
--> Ich habe Maschinenbau studiert, mit Programmieren wenig Kontakt gehabt. Wie ist die Profi-Variante? (: