Alternative zu Daten-Analyse (viel zu langsam)

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

Hallo,

ich habe einen Screener für Aktien programmiert, um es allgemein zu halten, werde ich es als Analyse vieler Datenpakete bezeichnen. Mir ist ebenso bewusst, dass ich mein "Problem" nicht in eine konkrete Frage formulieren kann. Ich danke euch für euer Verständnis!

Ich lese in einer For-Loop jeweils ein Datenpaket ein und speichere es in einen pandas.Dataframe. Dann gehe ich in Stufen vor und berechne Durchschnitte und andere Werte, prüfe diese per If-Elif und berechne somit nur die Werte für jedes Datenpaket bis eine Bedingung nicht erfüllt ist, dann geht es zum nächsten Paket. Diejenigen Pakete, die alle Bedingungen erfüllen, speichere ich in einem Array und gebe diesen nach Ende der For-Loop aus.

1. Da die Daten immer aktuell sein müssen, hole ich diese online in die Dataframes. Immer die letzte Row kommt täglich hinzu. Aber ich denke nicht, dass es viel Zeit einspart, nur die letzte Row abzufragen, da die Datenanzahl keine große Rolle spielt, sondern eher der Aufbau der Verbindung zum Daten-Server.

2. For-Loops sind nicht effizient, das weiß ich, aber ich habe keine Idee, wie ich das anders lösen könnte. Wenn ich zunächst alle Datenpakete in einem DataFrame-Array einlese, dann brauche ich auch wieder For-Loops zum Auswerten.

3. Die Berechnungen habe ich alle über pandas oder numpy gelöst, dadurch sehr effizient, wie ich denke.

Somit bliebe die Hauptfrage: Gibt es für meinen Fall eine Methode zur schnellen Online-Abfrage oder eine Alternative für den Loop?

Vielen Dank für alle Impulse, Links, Ideen u.a.!
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann so nicht beantwortet werden, da es auf die konkreten Operationen ankommt, die du durchfuehrst, um zu entscheiden, ob und wenn ja wie da optimiert werden kann.
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

Wie kann ich mich denn dann annähern, eine Lösung zu finden?
Soll ich eine vereinfachte Variante des Codes anhängen oder die Befehlszeilen einfügen, auf die es ankommt?
Wenn ich Stichworte hätte, was ich dabei genau wie optimieren möchte, dann könnte ich auch selbst danach suchen, aber ich tappe da etwas im Dunkeln.

Danke jedenfalls für die schnelle Rückmeldung!
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn die vereinfachte Version des Codes das gleiche Laufzeitverhalten zeigt, dann ja. Und Stichworte ist etwas schwierig. Es gibt die klassischen Themen der Komplexitaetstheorie, da lernt man halt, welche Datenstrukturen zB welche Zugriffscharakteristik haben. Aber ein "nach nur 3 YouTube Videos kannst du jedes Programm optimieren"-Tutorial gibt's halt nicht. Es kommt ja nunmal auf die konkreten Algorithmen an, die du entwickelt hast.
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Ich betreibe die Seite Divipedia.de und habe ein bisschen Erfahrung mit Datenanalyse von Finanzmarktdaten. Mein Projekt läuft mit Python / Django.
Du kannst mich gerne unter info@divipedia.de anschreiben und wir können mal skypen.

Der Jackpot wäre es natürlich, wenn du auch in Richtung Dividendenstrategie arbeitest und Bock auf Zusammenarbeit hast. :)
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

@_deets_:
Ich schaue, inwieweit ich den Code hier sinnvoll verkürzen kann.

@Bolitho:
Das ist natürlich spannend. Ich schreibe spätestens morgen eine E-Mail.
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Hast Du mal überlegt den Datenabruf (Webscraping) von der Auswertung zu trennen? Erfahrungsgemäß ist das Webscraping zeitintensiv.

Schau mal konkret: Es gibt effiziente Methoden, um Datasets von der Festplatte zu laden (z. B. csv -> pandas.DataFrame)...
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

pixewakb hat geschrieben: Donnerstag 4. April 2019, 16:11 Hast Du mal überlegt den Datenabruf (Webscraping) von der Auswertung zu trennen? Erfahrungsgemäß ist das Webscraping zeitintensiv.
Schau mal konkret: Es gibt effiziente Methoden, um Datasets von der Festplatte zu laden (z. B. csv -> pandas.DataFrame)...
Natürlich, ich nutze oft read_csv. Aber dann läuft zuerst ein Code, der lädt und in eine Datei speichert und danach wird ausgelesen. Klar, ich könnte das Einlesen auf nachts verlegen o.ä. - aber ideal wäre schon, wenn das in einem Zug passieren würde.
Oder denkst du, dass das Trennen auch in Summe eine Effizienzsteigerung bringt?
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Ich würde das separieren und dann schauen, wo die Zeitfresser stecken. Du weißt, dass es Tools zum Zeitnehmen gibt? (z. B. timeit usw. usf.)
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

pixewakb hat geschrieben: Donnerstag 4. April 2019, 16:29 Ich würde das separieren und dann schauen, wo die Zeitfresser stecken. Du weißt, dass es Tools zum Zeitnehmen gibt? (z. B. timeit usw. usf.)
Ich mache das einfach mit time.time() und der Differenz.
Ich checke übers Wochenende die einzelnen Zeiten eines Datenpakets und gebe euch das durch.

Danke dir. Gute Idee.
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

So, es ist definitiv die Datenabfrage.
Ich löse das entweder über pandas_datareader oder über eine API zu einem Data-Feed. Beides leider sehr langsam und zögerlich. Um genau zu sein, werden 99.5% der Zeit für den Abruf der Daten benötigt. Hätte gedacht, dass Loop und Berechnung auch einiges an Zeit verschlingen. Daher danke für den Tipp mit der Zeitmessung.

Somit bleibt mir nur übrig, die Daten entweder nachts zu laden oder eine andere, schnellere Quelle einzubinden oder habt ihr noch andere Ideen, wie ich das beschleunigen könnte?

Danke und ein schönes Wochenende!
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Oh, möglicherweise könntest Du auch eine andere, bessere Datenquelle suchen. pandas bietet m. E. bereits 'fertige' Datenquellen, die Du nutzen könntest, wodurch Dir das webscrapen erspart bliebe.

https://pydata.github.io/pandas-datarea ... index.html

Du müsstest mal schauen, ob da etwas für Dich dabei ist.
Antworten