Excel的3次相似连续观测滚动均值

我试图find时间序列的滚动平均值,而忽略不符合趋势的值。

x 869 1570 946 0 1136 

所以,我想结果看起来像是…

 x | y 869 | 0 1570 | 0 946 | 1128.33 3 | 0 1136 | 1217.33 ([1136+1570+946]/3) 900 | 2982 ([946+1136+900]/3) 860 | 2896 

这里困难的部分是,如果我所在的行是一个趋势值,我想采取3个以前的趋势值,并find他们的意思,但如果这是一个非趋势值,我希望它只是零。 有时候,我可能不得不跳过2或3条线以获得3个趋势值来取平均值。

到目前为止,我一直在使用VBAmacros窗体中的数组,RC公式,但我不确定我可以在这里使用RC,或者如果它必须完全是其他的东西。 任何帮助将不胜感激。

我相信我可以帮助你解决你的问题。 前三个笔记:

1)在我看来,您正在尝试对平滑的生产configuration文件执行DCA,忽略没有完整logging或没有数据的月份。 我提出这个假设,因为你提到这是时间序列数据,但没有给出一个采样率。 2)为了演示,我添加了一些额外的“数据”。 3)在你分享的例子中,你的'Y'列中的最后两个值看起来像你可能已经总结,但已经忘记分裂。

我提出的解决scheme有三个部分:1)创build一个度量来标识“exception值”; 2)标记“exception值”; 3)平滑无标记的数据。 让我们build立一些工作表基础架构,并说您的生产值在列B中,相关时间在列A中,如下所示:

开始设置

第一部分)在'C'栏中,根据当前时间步的两侧近似的趋势估计一个粗略的数据值。 从这个近似值减去实际值。 结果总是正面的,而且在很less或没有生产的情况下,时间步长相当大。

 =(INTERCEPT(B1:B6,A1:A6)+(A4*SLOPE(B1:B6,A1:A6)))-B4 

第2部分)在'D'列中,添加上面计算的值大于实际数据点的条件。 让它使用“0”来确定一个不应该包含在平均值中的点。 将其复制到数据的末尾。

 =IF(C4>B4,0,1) 

我们的表格现在看起来像这样:

被标记的异常值

3)现在可以计算你的三元素平均值。 在“E”列的最后一个单元格中,input以下数组公式。 你必须按ctrl + shift + enter来接受这个公式。 一旦完成,从下到上填充列:

 =IFERROR(IF(D17=1,AVERAGE(INDEX(B12:B17,MATCH(2,1/(FIND(1,D12:D17)))),INDEX(B12:B16,MATCH(2,1/(FIND(1,D12:D16)))-COUNTIF(D17,"=0")),INDEX(B12:B15,MATCH(2,1/(FIND(1,D12:D15)))-COUNTIF(D16:D17,"=0"))),0),"") 

这要求取最近三个值的平均值,并允许每个问题语句最多跳过三个exception值数据的时间步。 有关完成的工作表的外观的一个想法:

平滑的时间序列

这是一个有趣的挑战,我有一些更有效的公式的想法,但这应该完成工作。 请让我知道这是如何适用于你!

干杯

[编辑]

下面详细描述允许用户指定要包括的先前条目的数量的另一种方法。 这是一个更一般的(首选的替代),并取代了前面描述的步骤3。

3Alt)在单元格G2中input以前的平均数值,对于这个例子我坚持3.在单元格E4中input下面的数组expression式(ctrl + shift + enter)并拖动到E列的末尾:

 =IFERROR(IF(D4=1,SUM(INDEX(D:D,LARGE(($D$4:D4=1)*ROW($D$4:D4),$G$2)):D4 * INDEX(B:B,LARGE(($D$4:D4=1)*ROW($D$4:D4),$G$2)):B4)/$G$2,0),"") 

这使用LARGE函数来查找“第n个”最大值,其中n是从当前时间步到先前值的平均值。 然后它build立一个范围,从find的单元格延伸到当前时间步骤。 然后它将旗标(0和1)乘以每个月份的产值,将它们相加并除以n 。 这样标记为坏的月份被设置为0,并且不包括在总和中。

这是实现预期结果的更简洁的方法,并且具有平均不同时间段的灵活性。 请参阅下面最终值的示例。

替代方案