f#中的时间序列建模 - seq vs array vs vector vs list vs generic list

时间:2011-02-12 13:55:26

标签: f# time-series

如果我想在F#中设置时间序列类型以保存股票价格,我应该使用哪种基本类型?我们需要

  1. 根据时间索引选择子集
  2. 计算子集的基本统计数据,如均值,STD或多个子集,如相关性,
  3. 为新数据和快速更新统计信息或技术指标添加项目,
  4. 时间序列之间的线性回归等
  5. 我已经读过array表现更好,seq内存脚注更小,list更适合添加项目而F#vector更容易进行某些数学运算计算。为了平衡所有的权衡,你如何在f#中为股票价格时间序列建模?感谢。

1 个答案:

答案 0 :(得分:10)

作为具体表示,您可以选择数组或列表或其他一些.NET colllection类型。序列seq<'T>是一种抽象类型,数组和列表都是自动序列 - 这意味着当您编写一些与序列一起使用的代码时,它将适用于任何具体数据类型(数组,列表或任何其他类型)。 NET集合)。

因此,在编写数据处理时,您可以默认使用Seq(因为它为您提供了极大的灵活性 - 您使用的具体表示无关紧要)然后优化一些如果你需要更快的运行速度,可以使用具体的表示(无论是什么)。

关于具体表示 - 我认为关键问题是你是否想要在不改变原始数据结构的情况下添加元素(以不可变的方式使用不可变列表或数组)或者是否要改变数据结构(例如使用一些可变的.NET集合)。

如果你需要频繁地添加新项目,那么你可以使用不可变列表(它支持向前添加元素)或可变集合(数组不会这样做,因为它不能调整大小)。

  • 如果您正在开发更复杂的系统,我建议您查看ObservableCollection<T>(请参阅MSDN)。这是一个在更改时自动通知您的集合。在响应通知时,您可以更新统计信息(它还会告诉您添加了哪些元素,因此您无需重新计算所有内容)。但是,F#没有任何用于此类型的库,因此您需要自己编写很多东西。

  • 如果您很少添加数据或将其添加到较大的组中,则可以使用数组(并在每次添加项目时分配新数组)。如果集合中只有相对较少的项目,则可以使用列表(添加项目很容易)。

对于数值计算,F#PowerPack(以及类似矢量的类型)仅提供非常有限的一组功能,因此您可能需要查看一些第三方库。 Extreme optimizations是一个包含一些F#示例的商业图书馆,而Math.NET是一个开源替代方案。

否则,很难提出任何具体建议 - 您能否添加一些有关系统的更多详细信息? (例如,数据集的大小,需要多少项目需要多久添加......)