Große Datensätze im laufenden Betrieb interpolieren

8

Große Datensätze interpolieren

Ich habe einen großen Datensatz von etwa 0,5 Millionen Datensätzen, die den Wechselkurs zwischen dem USD / GBP im Laufe eines bestimmten Tages darstellen.

Ich habe eine Anwendung, die in der Lage sein möchte, diese Daten oder vielleicht eine Teilmenge grafisch darzustellen. Aus offensichtlichen Gründen möchte ich keine 0,5 Millionen Punkte auf meinem Graphen darstellen.

Was ich brauche, ist ein kleinerer Datensatz (100 Punkte oder so), der genau die gegebenen Daten darstellt (wie möglich). Weiß jemand von irgendwelchen interessanten und performanten Weisen, wie diese Daten erreicht werden können?

Prost, Karl

    
Karl 25.03.2010, 11:11
quelle

6 Antworten

3

Ein Gedanke ist, verwenden Sie das DBMS, um die Daten für Sie mit einer entsprechenden Abfrage zu komprimieren. Etwas wie ein Median für einen bestimmten Bereich, eine Pseudo-Abfrage:

%Vor%

Wo truncate_to_hour etwas ist, das zu Ihrem DBMS passt. Oder ein ähnlicher Ansatz mit einer Art Funktion, um die Zeit in einzelne Blöcke zu segmentieren (z. B. auf das nächste 5-Minuten-Intervall) oder eine andere mathematische Funktion, um die Gruppe zu gruppieren, die anstelle des Median angemessen ist. Angesichts der Komplexität der Zeitsegmentierungsprozedur und der Optimierung Ihres DBMS ist es möglicherweise effizienter, eine Abfrage für eine temporäre Tabelle mit dem segmentierten Zeitwert auszuführen.

    
M. Jessup 25.03.2010, 11:50
quelle
4

Es gibt mehrere statistische Methoden, um einen großen Datensatz auf einen kleineren, besser darstellbaren Datensatz zu reduzieren. Es ist nicht klar aus Ihrer Frage, welche zusammenfassende Statistik Sie wollen. Ich habe gerade angenommen, dass Sie sehen möchten, wie sich der Wechselkurs als Funktion der Zeit ändert, aber vielleicht interessieren Sie sich dafür, wie oft der Wechselkurs über einen bestimmten Wert steigt, oder eine andere Statistik, die ich nicht in Betracht ziehe.

Zusammenfassung eines Trends im Zeitverlauf

Hier ist ein Beispiel, das die Methode lowess in R (aus der Dokumentation zu Streudiagramm glätten ):

%Vor%

Der Parameter f steuert, wie genau die Regression zu Ihren Daten passt. Verwenden Sie etwas Nachsicht mit diesem, wie Sie etwas wollen, das genau Ihre Daten ohne Überanpassung passt. Statt Geschwindigkeit und Distanz können Sie den Wechselkurs gegenüber der Zeit darstellen.

Es ist auch einfach, auf die Ergebnisse der Glättung zuzugreifen. So geht das:

%Vor%

Das Datenobjekt, das Sie zurückerhalten, enthält Einträge mit den Namen x und y, die den x- und y-Werten entsprechen, die an die lowess-Funktion übergeben wurden. In diesem Fall stehen x und y für Geschwindigkeit und Dist.

    
James Thompson 02.04.2010 21:35
quelle
1

Wenn Sie Ihre eigenen schreiben wollten, wäre eine naheliegende Lösung, Ihren Datensatz in feste Punkte zu zerlegen, für die der Wert der Durchschnitt wäre (Mittelwert, Median, ... wählen Sie einen). Dies hat den wahrscheinlichen Vorteil, der schnellste zu sein, und zeigt allgemeine Trends.

Aber es fehlt das Drama der Preis-Ticks. Eine bessere Lösung würde wahrscheinlich darin bestehen, nach den Wendepunkten zu suchen und dann unter Verwendung von Schiebefenstern auszuwählen. Dies hat den Vorteil, dass die tatsächlichen Ereignisse des Tages besser angezeigt werden, aber langsamer.

    
CPerkins 02.04.2010 16:59
quelle
1

Etwas wie RRDTool würde automatisch das tun, was Sie brauchen - das tutorial sollte Ihnen den Einstieg erleichtern und drraw wird die Daten grafisch darstellen.

Ich benutze dies bei der Arbeit für Dinge wie Fehlerdiagramme, ich brauche keine 1-Minuten-Auflösung für einen Zeitraum von 6 Monaten, nur für die letzten paar Stunden. Danach habe ich für einige Tage eine 1-Stunden-Lösung, dann für ein paar Monate eine 1-Tages-Lösung.

    
Maelstrom 02.04.2010 16:03
quelle
1

Der naive Ansatz berechnet einfach einen Durchschnittswert pro Zeitintervall, der einem Pixel entspricht.

Ссылка

Dies zeigt keine Fluktuationen. Ich würde vorschlagen, auch die Standardabweichung in jedem Zeitintervall zu berechnen und das auch zu zeichnen (im Wesentlichen jedes Pixel höher als ein einzelnes Pixel zu machen). Ich konnte kein Beispiel finden, aber ich weiß, dass Gnuplot dies kann (aber nicht in Java geschrieben ist).

    
quelle
0

Wie wäre es, einen Enumerations- / Iterator-Wrapper zu erstellen? Ich bin mit Java nicht vertraut, aber es sieht vielleicht ähnlich aus:

%Vor%     
ony 04.04.2010 07:39
quelle

Tags und Links