Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3次类似连续观测的Excel滚动平均值_Excel_Vba - Fatal编程技术网

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

3次类似连续观测的Excel滚动平均值,excel,vba,Excel,Vba,我试图找到时间序列的滚动平均值,同时忽略不符合趋势的值 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个趋势值,并找出

我试图找到时间序列的滚动平均值,同时忽略不符合趋势的值

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个趋势值,并找出它们的平均值,但如果它是一个非趋势值,我希望它只为零。有时,我可能不得不跳过前面的2或3行,以获得3个趋势值来取平均值


到目前为止,我一直在VBA宏形式中使用数组、RC公式,但我不确定我是否可以在这里使用RC,或者它是否必须完全是其他形式。任何帮助都将不胜感激。

我相信我能帮助你解决你的问题。前三点注意:

1) 在我看来,您试图在平滑的生产配置文件上执行DCA,忽略了没有完整记录或没有数据的月份。我做这个假设是因为你提到这是时间序列数据,但没有给出采样率。2) 为了演示,我添加了一些额外的“数据”。3) 在您共享的示例中,“Y”列中的最后两个值看起来可能已求和,但忘记了除法

我提出的解决方案有三个部分:1)创建一个度量来识别“异常值”;2) 标记“异常值”;3) 平滑未标记的数据。让我们建立一些工作表基础结构,并假设您的生产值在B列中,相关时间在A列中,如下所示:

第1部分)在“C”列中,根据从当前时间步长任一侧的两点近似得出的趋势估计粗略的数据值。从该近似值中减去实际值。结果将始终是积极的,并且对于很少或没有生产的时间步来说是相当大的

=(INTERCEPT(B1:B6,A1:A6)+(A4*SLOPE(B1:B6,A1:A6)))-B4
第2部分)在“D”列中,添加一个条件,说明上面计算的值何时大于实际数据点。让它使用“0”来确定不应包含在平均值中的点。也将其复制到数据的末尾

=IF(C4>B4,0,1)
我们的工作表现在如下所示:

3) 您的三要素平均值现在可以计算。在“E”列的最后一个单元格中,输入以下数组公式。您必须通过按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),"")
这将平均最近的三个值,并允许在每个问题陈述中跳过最多三个离群数据时间步。要了解完整图纸的外观,请执行以下操作:

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

干杯

[编辑]

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

3Alt)在单元格G2中,输入一些要平均的先前值,在本例中,我坚持使用3。在单元格E4中输入以下数组表达式(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),"")
这将使用大函数查找“n”个最大值,其中n是从当前时间步长到平均值的前面值的数目。然后它构建一个从找到的单元格到当前时间步长的范围。然后将这些标志(0和1)乘以每个月的产值,求和并除以n。这样,标记为“坏”的月份将设置为0,并且不包括在总和中

这是一种更干净的方法,可以实现预期的结果,并且可以灵活地平均不同的时间段。请参见下面的最终值示例


如何识别“不符合趋势的价值”?我想这是另一个问题。我还没有找到一个确定他们身份的方法。为了实验起见,假设整个向量的平均值有+2个标准差。时间序列数据从高开始,然后随着x接近无穷大(理论上)曲线向下接近0。不知道你是否熟悉,但这是石油生产。这很有效,谢谢!我想知道的一件事是,为什么匹配项(查找值,…)有2个?为什么要用find()除以1?还有,如果有非常量标记的entires,有没有办法让它继续寻找1?比如,从R15的平均值的例子来看,如果R9和R10的标记值是0而不是1,代码会如何寻找它来取R15、R11和R8的平均值?如果有超过1个连续的零值,您会如何修改?我很高兴这对您有效。现在,回答你们的问题。“1/FIND”和“MATCH(2)”是我如何找到最后一个标志=1的。您的问题要求我们从下到上(最后三个)搜索标记为OK的行.Match返回的位置,因此我们通过使用“查找”,然后反转小于或等于搜索条件的最大值来实现这一点。使用“2”可以保证我们找到最后一个结果。我不确定我是否遵循您的其他评论。工作表目前确实找到了非连续的1。也就是说……(续)我确实提到过,我想找到一种更干净或更有效的方法来查找标记的值。我提出了一种不同的方法,允许您包括任何数量的先前标记的数据,并将编辑我的答案以将其作为替代。