2

我想知道在 F# 中为时间序列表示时间序列的最标准和最有效的方法是什么,包括稀疏/非稀疏情况和定期间隔/非定期间隔情况。

有没有人有使用这种语言或 OCaml 表示这些的标准方法的经验?

我首先用数组表示它们,但意识到数组不能包含诸如采样频率之类的信息。

4

2 回答 2

3

这取决于您最有可能在这些时间序列中使用哪些常见操作。

  • 如果您只进行顺序访问,那么将时间序列公开为时间值序列可能会很好。

像这样

type TimedValue<'T> = { ts : DateTime; value: 'T}
type TimeSerie<'T> = TimedValue<'T> seq
  • 如果你打算进行一些精确的搜索,你可以用 Map 包装它

像这样

type TimeSerie (vals : TimedValue<double> seq) = 
   let mdata = Map.ofSeq (vals |> Seq.map(fun x -> x.ts, x ))

   static member inline LinearReturn vb  ve = ve / vb - 1.
   static member inline LogReturn vb ve = log ve - log vb

   member x.toReturns(times : TimeCollection, f) =
         times |> Seq.pairwise |> Seq.map(fun (l,n) -> {tfrom = l; tto= n; value= f (mdata.[l].value) (mdata.[n].value) } )

   member x.toLinReturns(times : TimeCollection) = x.toReturns(times, TimeSerie.LinearReturn)
   member x.toLogReturns(times : TimeCollection) = x.toReturns(times, TimeSerie.LogReturn)
于 2012-10-22T13:41:54.730 回答
1

也许函数响应式编程就是答案:它是一种范式,您将事件绑定到函数并定义“行为”和一直在发展的信号。

时间和事件以精心设计的方式表示。

一些链接开始: http: //erratique.ch/talks/react-ocamlum-2010.pdf http://erratique.ch/software/react

另一个库:https ://github.com/jaked/froc

于 2012-10-21T23:48:39.123 回答