2016-07-25 8 views
1

Ich importiere historische Daten für viele Aktien über bestimmte Daten in Java aus CSV-Dateien. Mein Ziel ist es, ein Programm in Java zu verwenden, das ich gebaut habe, um einige dieser Ticker zu bestimmten Terminen zu handeln (kaufen und verkaufen). Das Programm ist nur für die Arbeit mit einem Ticker konfiguriert, aber jetzt möchte ich es mit tausenden von Daten (über Tausende von Daten) erweitern.double inexing ein Array ohne int

Ich habe zwei Tabellen, eine mit dem Ticker und wann zu kaufen/zu verkaufen, und die andere (Bild unten) mit all den Preis und historische Informationen. Mit den beiden, wenn, in Tabelle 1 habe ich eine Anzeige nach Ticker x auf y Datum, möchte ich in der Lage sein, Ticker x zu verkaufen, wenn der Preis um sagen wir 80% vom Kaufpreis sinkt. Um diese Art der Entscheidungsfindung zu erleichtern, habe ich für jeden Ticker, den ich trade, die historischen Daten für etwa zehn Jahre. Ich habe mehrere zehn Millionen Zeilen in Tabelle zwei.

Ich würde gerne in der Lage sein, jede meiner Spalten (Marktkapitalisierung, p/e-Verhältnis, Beta ...) mit dem Ticker und Datum Identifikatoren verweisen. Ich möchte meine Daten so manipulieren, dass sie (in Java) das Minimum und Maximum eines P/E für einen bestimmten Ticker über einen bestimmten Zeitraum finden.

Ich dachte, ich sollte einen "numerischen Schlüssel" für jeden Ticker und Datum Combo erstellen. Jedes Zeichen im Ticker wird in ASCII konvertiert, verkettet und zum Datum hinzugefügt. Ich dachte, ich könnte jeden einzelnen als eindeutigen Identifikator für die Indexierung eines Arrays verwenden, aber dann erkannte ich, dass ich keine gute Möglichkeit hatte, herauszufinden, wann die Daten eines Tickers begannen und wann er endete.

Welcher Datentyp wäre dafür besser geeignet?

DataTable

+0

Sie möchten wahrscheinlich eine ['Map'] (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html) – bradimus

+0

@BasilBourque Ich habe mehrere Millionen Zeilen, aber nur 2500 Ticker – wizlog

Antwort

2

Wäre es nicht besser, einen HashMap und einen Schlüssel zu verwenden, die Ticker und Datum kombiniert?

Etwas wie:

public class TickerDate { 

    private final String ticker; 
    private final Date date; 

    public TickerDate(String ticker, Date date) { 
     this.ticker = ticker; 
     this.date = date; 
    } 

    // .. getters 

    // equals + hashcode 
} 

Es wäre im Code auf jeden Fall leichter zu verstehen.

Andere Option ist Table von Guava zu verwenden, müssen Sie nicht die TickerDate Klasse oben schreiben.

+0

Das klingt sehr ähnlich zu einer Implementierung, die ich in Access verwende. Vielen Dank! (Ich gebe Ihnen das Häkchen, nachdem ich es richtig umgesetzt habe.) – wizlog

+0

Ja, ziemlich, aber Sie müssen nicht so große Tabelle haben, Daten werden in Eimern sein. –

0

Datenbank

Verwenden Sie für eine große Datenmenge eine Datenbank. Eine gute Datenbank wie H2 Database Engine ist gebaut, um genau das zu tun, was Sie wollen (Suchen, Sortieren, Aggregatberechnungen), und zwar auf eine optimierte Art und Weise.

H2 ist speziell in reinem Java geschrieben. Es kann in Ihre Java-App eingebettet oder separat als Server verwendet werden.

Wenn auf Ihren Bereitstellungscomputern viel Arbeitsspeicher vorhanden ist und Daten nur vorübergehend benötigt werden, können Sie die Leistung maximieren, indem Sie H2 Tabellen im Speicher behalten und nicht auf Festplatte speichern.

H2 kann direkt aus CSV-Dateien importieren. Siehe this tutorial.

Apache Commons CSV

Die Apache Commons CSV ist eine handliche Bibliothek zum Import/Export von/nach CSV und tabstoppgetrennten Dateien.

Ich habe es genossen, es ein paar Mal erfolgreich zu verwenden. Vereinfacht das Lesen und Parsen.

+0

Bedeutet das, dass ich eine relationale Datenbank von Microsoft Access problemlos importieren kann? – wizlog

Verwandte Themen