__blackjack__ hat geschrieben: Mittwoch 19. Mai 2021, 21:13
@CSchilling: `append()` fügt nicht zu dem `DateFrame` hinzu, sondern erstellt einen neuen in den die alten Daten kopiert werden und am Ende die neuen hinzugefügt werden. Ist also nicht besonders effizient.
ah alles klar. Dann macht das Sinn.
Gibt es denn eine effizientere Lösung dafür?
Bisher habe ich immer über eine "einfache" "with open(....) as file:" die Dateien in eine Liste eingelesen und dann im Programm die neu errechneten Werte an diese Liste angehängt.
Jedoch kam es gelegentlich zu Problemen, wenn mein Programm aufgrund eines Verbindungsverlusts zum Websocket-Server neugestartet hat. Das Problem lag daran, dass ich jedesmal wenn das Programm neustartet, die Daten aus einer csv Datei neu einlesen lasse.
Diese Daten stehen Tagsüber in einer Datei. Jedoch immer um 0:00 wird eine neue Datei erstellt. Wenn nun das Programm kurz nach 0:00 Uhr neustartet, dann sind in der kürzlich erstellen csv. Datei nicht ausreichend Daten vorhanden, deswegen müssen die restlichen Daten aus der csv. des vortages gelesen werden. Das funktioniert einfach und schnell mit pandas funktion ".append()".
Mein Programm bekommt im weitern Verlauf alle 250ms Daten von einem Websocket-Server. Alle 5 Minuten wirdaus diesen Daten ein Indikator berrechnet, welcher dann ans Ende einer Liste oder eben dem DataFrame angehängt werden soll um später im Programm damit zu arbeiten.
Das Programm hängt halt quasi in der on_message() funktion fest, solange der Websocket-Server Daten sendet.
Unterhalb habe ich einen Teil des Codes eingefügt, welcher sich mit dem "Problem" beschäftigt.
Code: Alles auswählen
.....
df = pd.read_csv(path_storage('Historical-Data', 0, symbol, interval))
if df.shape[0] < max(period_l_t, period_l_a, period_u_a, period_u_t):
df_add = pd.read_csv(path_storage('Historical-Data', 1, symbol, interval))
df = df_add.append(df, ignore_index=True)
def on_message(wsapp, message):
# Receiving data from websocket request message (every ~~250ms).
stream_data = json.loads(message) # raw Data send back from websocket for the recent active candle.
# Process the data from the websocket stream.
if stream_data['k']['x']: # the send datapackage does contain the candle closing data.
rsi_5m = shortterm_rsi(float(stream_data['k']['c']),
df['CLOSES'].iloc[-1],
period_length_5m_rsi,
df['EMA_UP'].iloc[-1],
df['EMA_DOWN'].iloc[-1])
df = df.append({'DATE': datetime.fromtimestamp(int(((stream_data['k']['t']) * 0.001))),
'OPEN': stream_data['k']['o'],
'HIGH': stream_data['k']['h'],
'LOW': stream_data['k']['l'],
'CLOSES': float(stream_data['k']['c']),
'EMA_UP': rsi_5m[1],
'EMA_DOWN': rsi_5m[2],
'RSI': rsi_5m[0]
}, ignore_index=True)
df = df.drop([0])
.....