时间序列的考虑因素

时间:2017-04-18 09:01:37

标签: azure f# time-series resampling deedle

我们正在研究将Azure表存储(ATS)与Deedle(或具有类似功能的其他库)一起用于我们的时间序列存储,操作和计算。从我可以阅读的内容来看,F#似乎也是阵列操作的不错选择。

我们的出发点是一组能耗时间序列。该系列将是一个区间内的消耗(固定或不规则的间隔)或一个计数器(我们可以从中计算从一个读数到下一个读数的消耗量)。由于数据点只是一个标记(用作分区键),时间戳(rowkey)和值,因此它非常适合ATS。

从用户的角度来看,他们希望对给定时期和分辨率的系列进行计算,例如:计算第三个系列作为另一个系列之间的差异,对于一个给定的年份,每月解决。

这提出了许多问题:

  • ATS和F#一起足够快吗?如果我们有10.000个数据点? 100.000?与C#相比?
  • 重新取样需要计算系列时间戳之间的点数。我没有看到(线性)插值的任何Deedle示例,但我认为这只是传递一个可以查看必要数据点的函数?这对于我们的点数来说是否足够快?
  • 计算将由用户确定,我们必须将其作为配置。到目前为止,我最好的猜测是将公式以某种格式轻松解析为反向抛光表示法,并特别注意代表系列的标签(即从ATS读取,重新采样,然后进行操作)。

任何评论都将受到高度赞赏!

2 个答案:

答案 0 :(得分:2)

除非你在两者之间做了完全不同的事情(例如,不可变与可变数据集),否则F#与C#可能基本相同。两者都在当天结束时编译成IL。

Azure表存储 - 确保正确选择分区+行键。有很多关于选择Azure表存储分区键的文档,特别是在时间序列中 - 确保将行分组到正确的级别以确保数据的分布,分区不会太大或太小。您可能还想查看Azure存储类型提供程序和/或Azure存储F#库,这使得使用ATS比使用标准.NET SDK更容易。

Deedle AFAIK确实能够跨时间序列替换缺失值,并且至少有一个名为BigDeedle的项目直接在ATS上运行(尽管我不确定这个项目有多准备好)。

答案 1 :(得分:2)

我认为艾萨克已经提到了最重要的一点,但由于这个问题涉及我所涉及的一些事情,我想我还要分享一些额外的评论!

BigDeedle。正如Isaac所说,我在BigDeedle中使用了Azure表存储。如果您希望使用Deedle API以交互方式浏览数据,并在将数据存入内存并运行计算之前执行一些过滤和范围限制,则此功能非常有用。 BigDeedle从可能非常大的外部数据源中懒洋洋地加载数据。也就是说,如果您最终需要将所有数据加载到内存中,这对您来说可能并不那么有用。

BigDeedle中使用的存储模型可能很有用 - 它根据日期对数据进行分区,因此当您想要获取给定日期范围内的值时,它知道要查看哪些分区。根据我的经验,从ATS加载数据效果非常好,特别是如果你可以在Azure中运行的MBrace集群上进行(这是我的NDC演示最终的作用)。

效率。我认为组合应该适用于10k或100k数据点 - 无论您是使用F#还是C#进行此操作都没有区别。至于Deedle,我肯定会将它与这种大小的数据集一起使用 - 我们根据需要优化库#34;"。大多数功能已经非常有效,但可能有些操作效率不高。如果您在GitHub上打开问题,这可以修复。

重新采样。有线性插值的内置函数(请参阅here),但我怀疑您可能需要编写自己的自定义插值。 Deedle不会隐藏基础数据"来自你,所以这不是太难 - this page上的最后一个例子显示了一个自定义函数,用于填充使用线性插值的缺失数据。如果您正在做这样的事情,那么您需要将数据存储在内存中(因此BigDeedle在这里不会非常有用)。

指定计算。我怀疑这是一个单独的问题,但F#非常适合特定于域的语言。我做了talk on that at earlier NDC。通常,您可以指定自己的DSL(并解析它),也可以使用嵌入式DSL来编写F#的子集。 F#对两者都有很好的支持。

PS:如果您想获得有关F#,Deedle和Azure表格的更多帮助,请随时与我们联系。我很高兴分享我的经验 - 您应该能够通过我的个人资料找到联系人。