Tia*_*adu 8 time-series clojure
我有以下问题:我有一个超过10000个条目的时间序列,我想对它们进行一些计算.仅此一点不会成为问题,但我需要获取最后一个计算值以获得下一个值.我需要的一个非常简单的形式如下:
Val(n) = Val(n-1) + (time-series-entry / 2) (或类似的东西!)
我不知道如何管理这个.简单地做这样的事情:
(defn calc-val
[time-series element]
(seq (cons (generate-val-element time-series element)
(calc-val time-series (inc element)))))
Run Code Online (Sandbox Code Playgroud)
不会工作因为不能(至少我不知道怎么做!)得到最后的计算值.然后我想:好吧,让我们使用Loop-Recur.这将给出对应于下一个时间序列条目BUT的值,我将不得不再次进行所有计算.迭代是正确的,但它不起作用,因为该函数有副作用.
所以我被困在这一个.如果有人能给我一个提示,那就太好了.
如果您只关心最终结果,请使用reduce; 如果你需要获得一系列依次转换每个值的结果(每个转换依赖于前面的转换),请使用reductions(clojure.contrib.seq-utils在1.1和clojure.core1.2中找到).
下面,transform-first-entry你想对第一个条目做什么(如果你不需要以任何方式对它进行转换,你可以省略第一个参数到reduce/ reductions并使用entries而不是(rest entries作为最后一个参数); transform-entry是一个函数,它获取转换前一个条目和当前条目(按此顺序)的结果,并生成当前条目的转换结果.
;;; only care about the final result
(reduce transform-entry
(transform-first-entry (first series))
(rest entries))
;;; need to get a seq of intermediate results
(reductions ...arguments as above...)
Run Code Online (Sandbox Code Playgroud)
注意reductions是懒惰的.
假设您希望保持第一个条目不变并将示例转换从问题文本应用到后续条目,则可以使用
(defn transform-entry [prev-transformed current]
(+ prev-transformed
(/ current 2)))
Run Code Online (Sandbox Code Playgroud)
作为减少函数
(reduce transform-entry series) ; ...or reductions
Run Code Online (Sandbox Code Playgroud)
如果你只是想要一个提示;考虑使用partition.
不仅仅是提示\xe2\x80\xa6
\n\n(defn calc-val\n [time-series element]\n (let [p (partition 2 1 time-series)]\n (for [t p]\n (let [first-value (first t)\n second-value (second t)]\n (do whatever you need to here)))))\nRun Code Online (Sandbox Code Playgroud)\n\n虽然这还没有经过测试,但它应该可以工作或接近工作:)
\n\n解释
\n\n(partition n i seq)分成seq长度列表n(本例中为 2)且重叠i(本例中为 1)的部分,然后我们用 迭代这些部分for,并对这些部分执行我们想要的操作。