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
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.
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.
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.
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.
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).
Tags und Links java interpolation collections