Indexing 是否可以在RavenDb 5+;中计算时间序列上的移动平均/均线/加窗合计;?

Indexing 是否可以在RavenDb 5+;中计算时间序列上的移动平均/均线/加窗合计;?,indexing,mapreduce,time-series,ravendb,moving-average,Indexing,Mapreduce,Time Series,Ravendb,Moving Average,RavenDb 5+增加了对文档的timeseries存储的支持。此支持中包括索引功能,但为了创造存储和索引性能优势,索引功能是以时间段为单位进行的 RavenDb支持计算这些时间序列的基本计数/平均值/总和。然而,我找不到一种方法来计算移动平均线,在窗口上 例如,我可能有50天的值,每天一个值。使用内置的平均值,我可以轻松地索引所有50天的平均值。但是,我想创建一个索引字段,它包含一个窗口(比如5天)内的移动平均值。因此,前X-1天的值将为空/空白,从该点开始,将计算前X天的平均值 在Rave

RavenDb 5+增加了对文档的timeseries存储的支持。此支持中包括索引功能,但为了创造存储和索引性能优势,索引功能是以时间段为单位进行的

RavenDb支持计算这些时间序列的基本计数/平均值/总和。然而,我找不到一种方法来计算移动平均线,在窗口上

例如,我可能有50天的值,每天一个值。使用内置的平均值,我可以轻松地索引所有50天的平均值。但是,我想创建一个索引字段,它包含一个窗口(比如5天)内的移动平均值。因此,前X-1天的值将为空/空白,从该点开始,将计算前X天的平均值

在RavenDb的map/reduce索引策略中,我找不到一个简单的方法来实现这一点,但我希望我缺少一些聪明的方法(例如)从map操作中运行查询,以便查询以前的值,即使它们可能不在当前时间段内

如果可能的话,我还希望能够进一步计算出几个移动平均值的复合值,例如,一个值随时间的指数移动平均值

这是索引的理想操作,因为数据在写入后不会更改,但我不知道在定义RavenDb索引时是否支持窗口/光标样式

我可以在类似SQL的存储中而不是RavenDb中使用触发器等来实现这一点,但如果可能的话,我不希望将一些代码存储在存储过程中,而将一些代码存储在我的C#代码库中


蒂娅

不确定是否有更好的方法,但是map-reduce索引应该可以工作

地图:


Timeseries indexing:+查询索引:@Danielle谢谢,但这并不能说明是否可以创建一个包含在其他(确定性)值窗口上计算的值的索引,例如在移动平均值中。非常感谢您的回复!我不太明白如何让
timeseries
决定将
公司
作为一种财产(我在C#中,继承自AbstractTimeSeriesIndexCreationTask)——我一直在使用LoadDocument来获得孩子。但我会弄明白的!我的主要问题是-这个映射操作可以看到RavenDb中timeseries段边界之外的东西吗?我原以为这是不可能的,但如果我错了,我会很兴奋的!您可以尝试使用示例数据在上定义此索引。
timeseries.companys.StockPrices
是一种命名约定,告诉索引处理具有时间序列
StockPrices
companys
集合的时间序列数据。如果需要为每个公司单独编制索引,则应映射
段.DocumentId
,并按其进行缩减。您所说的
段边界是什么意思?这里索引在段中的每个条目上迭代(
来自段中的条目。条目
),谢谢!我试试看。我把它理解为Linq,而不是原始的索引定义。通过段边界,我了解到RavenDb timeseries索引仅在TimeSeriesSegment上调用Map。假设我有一年的数据,RavenDb将其分为500个部分。即使一个时间窗口跨越两个时间段,此方法能否正确计算所有数据的移动平均值?也许我误解了,这些片段只是raven如何存储时间序列数据的一个实现细节。一个段可能包含约2k-4k的一维数据点(数据点==条目)。在索引中,为了性能起见,段被公开,您可以访问段本身的最小/最大/平均值,并且在某些情况下不需要迭代该段中的条目。这里要提到的另一件事是,如果有任何一个条目发生了更改,raven将重新索引整个片段。希望有意义:-)
from segment in timeseries.Companies.StockPrices
from entry in segment.Entries
let window = Enumerable.Range(0,5).Cast<object>()
from i in window
select new {
    Date = entry.Timestamp.AddDays((int)i),
    Value = entry.Values[0]*((double)1/(i+1)),
    Count = 1
}
from r in results
group r by r.Date into g
select new 
{
    Date = g.Key,
    Value = g.Average(x=>x.Value),
    Count = g.Sum(x=>x.Count)
}