什么';在F#中存储大型时间序列是一种简洁、有用且高效的方法?
我目前正在学习F#,我正在探索用它来分析金融时间序列。有人能推荐一种好的数据结构来存储时间序列数据吗 F#提供了丰富的本地类型选择,我正在寻找一些简单的组合,以提供优雅、简洁和高效的解决方案 我正在查找store tick数据,它由数百万条记录组成,每条记录都有一个时间戳,还有几个(~5-20)数字和文本数据字段,可能缺少值 我的第一个想法可能是一系列元组或记录,但我想知道是否有人能提出一些在现实世界中运行良好的建议 编辑: 需要澄清的另外几点: 我可能需要的常见操作有:什么';在F#中存储大型时间序列是一种简洁、有用且高效的方法?,f#,finance,time-series,F#,Finance,Time Series,我目前正在学习F#,我正在探索用它来分析金融时间序列。有人能推荐一种好的数据结构来存储时间序列数据吗 F#提供了丰富的本地类型选择,我正在寻找一些简单的组合,以提供优雅、简洁和高效的解决方案 我正在查找store tick数据,它由数百万条记录组成,每条记录都有一个时间戳,还有几个(~5-20)数字和文本数据字段,可能缺少值 我的第一个想法可能是一系列元组或记录,但我想知道是否有人能提出一些在现实世界中运行良好的建议 编辑: 需要澄清的另外几点: 我可能需要的常见操作有: 基于时间的查找-即查
- 基于时间的查找-即查找给定时间的最新数据点
- 基于时间的联接
- 附加 (更新和删除将非常罕见。)
再次感谢所有花时间帮助我的人。数据结构的最佳选择取决于您希望对其执行的操作 最简单的是一个结构数组。这具有快速随机查找、未压缩表示的良好空间效率和良好的局部性的优点。如果子结构(如字符串)之间存在共享,则对它们进行内部处理以确保它们共享
另一种选择可能是按需从磁盘加载的
seq
,一个允许您快速预编元素的单链表,或者一个允许在随机位置高效插入等操作的平衡二叉树。听起来您的数据真的应该在关系数据库中存储和查询(它当前存储在哪里?:将数百万条带有多个字段的记录加载到内存中肯定是一项昂贵的操作,可能会导致数据过时,并且难以持久保存更改)。然后,您可以使用F#LINQ to SQL实现(我相信您可以在电源组中找到)将F#表达式转换为SQL表达式
下面是Don Syme关于F#Power Pack中LINQ支持的链接:我不是很确定,但是……你真的需要加载数百万条记录进行时间序列分析吗?据我所知,数据挖掘模型可以从随机采样的数据中构建,并在其他随机采样的数据上进行测试。(除非您有从所有数据库行构建模型的严格要求)我将数百万条记录包括在内,以便对这个问题进行一定的衡量。当然,许多应用程序通常不需要加载许多记录,而在其他应用程序中,在方便性、加载效率和使用的内存等方面会有一个折衷。可以使用子采样、移动窗口等。但在某些情况下,一大堆滴答声会被忽略方便—例如,如果我正在试验在广泛的时间尺度上聚合数据的影响。这也可能意味着,您应该首先将数据聚合到一些数据库存储中。(通常这种聚合是在数据仓库中完成的)。然后,您可以从已聚合的数据(高效/小型)中进行数据挖掘数据。谢谢Jon,这是几个值得尝试的好建议。如果你不介意的话,我有几个问题:对于前两个建议,我如何基于时间点访问?我不确定你所说的“实习”字符串是什么意思?(对不起,我在过去10年中一直在使用Matlab)哪一个最符合F#?优雅的函数性质?例如,我喜欢按需排序的思想如果数组的元素按时间排序,您可以使用二进制搜索在O(logn)中找到它们。A
seq
或list
需要线性搜索。以时间为键的平衡二进制搜索树也可以是O(logn).阅读hash consing和.NET上的System.String.Intern
(这意味着重用结构上相等的值)。顺便说一句,F#中的Map
提供了一个平衡的二叉树,它将键与值关联(即字典),但您需要知道确切的时间(键)找到关联的值。如果你建立了自己的平衡搜索树,那么你也可以高效地在不同的时间范围内找到值,但正如我所说的,这完全取决于你需要如何有效地处理你的数据。谢谢Stephen。我将对此进行研究。我们当然计划将这些数据移动到数据库中。但作为一项研究r、 我必须做一些实验来理解这些数据,以及我们将如何使用这些数据来指定数据库的设置。我需要研究的一个问题是:我们使用这些数据进行大量计算,例如在不同的时间范围内维护多个自适应模型。并非所有这些模型都可以以递归的方式进行编码。因为数据库是有问题的绝对不是