【问题标题】:Time series modeling in f#-- seq vs array vs vector vs list vs generic listf#中的时间序列建模——seq vs array vs vector vs list vs generic list
【发布时间】:2011-02-12 13:55:26
【问题描述】:

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

  1. 根据时间索引选择子集,
  2. 计算一个子集(如均值、STD)或多个子集(如相关性)的基本统计数据,
  3. 为新数据和快速更新统计或技术指标附加项目,
  4. 在时间序列等之间做线性回归

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

【问题讨论】:

    标签: f# time-series


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 我不认为可变与不可变的问题是“至关重要的”。人们一直以不可变的方式使用数组,只是为了获得数组的性能(.NET 会有只读数组类型吗!),所以我认为其他语用学比可变性更受关注。
    • @Brian - 是的,你完全正确。事实上,我更多地将数组视为 immutable 因为你不能添加元素(并且假设历史数据不会改变,所以元素不会被变异)!我澄清了答案。
    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 2012-03-29
    • 1970-01-01
    • 2021-02-27
    • 2012-08-07
    • 1970-01-01
    • 2014-10-17
    • 2021-12-19
    相关资源
    最近更新 更多