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

aha*_*ala 6 f# time-series

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

  1. 根据时间索引选择子集,
  2. 计算像mean,STD或几个子集(如相关性)之类的子集的基本统计数据,
  3. 为新数据附加项目并快速更新统计数据或技术指标,
  4. 在时间序列等之间进行线性回归

我读过它array有更好的性能,seq内存脚注更小,list更适合添加项目,F#vector更容易进行某些数学计算.为了平衡所有的权衡,你如何在f#中为股票价格时间序列建模?谢谢.

Tom*_*cek 10

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

因此,在编写数据处理时,您可以Seq默认使用(因为它为您提供了极大的灵活性 - 您使用的具体表示无关紧要),然后根据需要优化某些操作以使用具体表示(无论是什么)要跑得快的东西.

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

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

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

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

对于数值计算,F#PowerPack(和类似矢量的类型)仅提供非常有限的一组功能,因此您可能需要查看一些第三方库.极限优化是一个带有一些F#示例的商业库,Math.NET是一个开源替代品.

否则,很难提出任何具体的建议 - 你能否添加一些关于你的系统的更多细节?(例如,数据集有多大,需要多少项添加频率等等...)