时间序列的注意事项

Considerations for time-series

我们正在考虑将 Azure Table 存储 (ATS) 与 Deedle(或其他具有类似功能的库)一起用于我们的时间序列存储、操作和计算。据我所知,F# 似乎也是数组操作的不错选择。

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

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

这引发了一些问题:

任何意见将不胜感激!

F# 与 C# 的性能可能基本相同,除非您在两者之间做一些完全不同的事情(例如,不可变与可变数据集)。两者都在一天结束时编译为 IL。

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

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

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

BigDeedle. 正如 Isaac 提到的,我在 BigDeedle 中使用了 Azure Table 存储。如果您想使用 Deedle API 以交互方式探索数据,并在将数据放入内存和 运行 计算之前进行一些过滤和范围限制,这将非常有用。 BigDeedle 从潜在的非常大的外部数据源延迟加载数据。也就是说,如果您最终需要将所有数据加载到内存中,这对您来说可能不是那么有用。

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

效率。 我认为该组合应该适用于 10k 或 100k 数据点 - 无论您是从 F# 还是从 C# 执行此操作都没有区别。至于 Deedle,我肯定已经将它用于这种规模的数据集——我们优化了库 "as needed"。大多数功能已经非常高效,但可能有一些操作效率不高。如果您在 GitHub.

上打开问题,则可以解决此问题

重采样。 有线性插值的内置函数(参见 here), but I suspect you may need to write your own custom interpolation. Deedle does not "hide the underlying data" from you, so this is not too hard - the last example on this page 显示了使用线性插值填充缺失数据的自定义函数。如果你正在做像这样,您需要将数据存储在内存中(因此 BigDeedle 在这里不会很有用)。

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

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