Leeres DataFrame trotz Zuweisung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gregoah
User
Beiträge: 9
Registriert: Sonntag 5. Januar 2020, 15:36

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
Gregoah
User
Beiträge: 9
Registriert: Sonntag 5. Januar 2020, 15:36

Dass die Zeilen unter der Funktion eingerückt sein müssen weiß ich. Das wird von der Webseite hier falsch formatiert..
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

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()
Gregoah
User
Beiträge: 9
Registriert: Sonntag 5. Januar 2020, 15:36

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

------> ?!?!?!?
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13109
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Gregoah
User
Beiträge: 9
Registriert: Sonntag 5. Januar 2020, 15:36

haha gut erkannt! :D
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? (:
Antworten