Ich habe folgendes Problem: Ich habe eine Zeitreihe mit mehr als 10000 Einträgen und möchte mit jedem von ihnen einige Berechnungen durchführen. Dies allein wäre kein Problem, aber ich muss den letzten berechneten Wert erhalten, um den nächsten zu bekommen. Eine sehr einfache Form von dem, was ich brauche, würde so aussehen:
Val(n) = Val(n-1) + (time-series-entry / 2)
(oder so ähnlich!)
Ich habe keine Ahnung, wie ich das schaffen soll. Einfach so etwas tun:
%Vor%würde nicht funktionieren, weil ich nicht (zumindest ich weiß nicht wie!) den letzten berechneten Wert bekommen kann. Dann dachte ich: OK, lass uns Loop-Recur benutzen. Dies würde mir den Wert geben, der dem Zeitreiheneintrag entspricht, ABER für den nächsten würde ich alle Berechnungen erneut durchführen müssen. Iterate wäre das Richtige, aber es hat nicht funktioniert, weil die Funktion Nebenwirkungen hat.
Also ich stecke hier fest. Es wäre toll, wenn mir jemand einen Hinweis geben könnte.
Wenn Sie nur das Endergebnis interessieren, verwenden Sie reduce
; Wenn Sie eine Reihe von Ergebnissen für die Transformation jedes Werts der Reihe nach benötigen (wobei jede Transformation von den vorherigen abhängt), verwenden Sie reductions
(gefunden in clojure.contrib.seq-utils
in 1.1 und in clojure.core
in 1.2).
Im Folgenden macht transform-first-entry
was auch immer Sie mit dem ersten Eintrag machen wollen (wenn Sie es nicht transformieren müssen, können Sie das erste Argument auf reduce
/ reductions
weglassen und verwenden entries
anstatt (rest entries
als letztes Argument); transform-entry
ist die Funktion, die das Ergebnis der Transformation des vorherigen Eintrags und des aktuellen Eintrags (in dieser Reihenfolge) übernimmt und das Transformationsergebnis für den aktuellen Eintrag erzeugt.
Beachten Sie, dass reductions
faul ist.
Angenommen, Sie möchten den ersten Eintrag unverändert lassen und Ihre Beispieltransformation vom Fragetext auf die nachfolgenden Einträge anwenden, können Sie
verwenden %Vor%als Reduktionsfunktion in
%Vor% Wenn Sie nur einen Hinweis möchten; Sehen Sie sich in partition
um.
Für ein wenig mehr als einen Hinweis ...
%Vor%Obwohl dies nicht getestet wurde, sollte es funktionieren oder in der Nähe arbeiten :)
Erläuterung
(partition n i seq)
trennt seq
in Teile der Liste der Länge n
(2 in diesem Fall) mit der Überlappung i
(in diesem Fall 1), und dann iterieren wir über denen mit for
und tun was wir mit den Teilen wollen.
Tags und Links clojure time-series