我试图找到时间序列的滚动均值,同时忽略不遵循趋势的值。
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,或者它是否必须完全是其他东西。任何帮助将不胜感激。
答案 0 :(得分:2)
我相信我可以帮助你解决问题。前三个注意事项:
1)在我看来,您正在尝试在平滑的生产配置文件上执行DCA,忽略没有完整记录或没有数据的月份。我提出这个假设,因为你提到这是时间序列数据,但没有给出采样率。 2)我已经添加了一些额外的数据'为了演示。 3)在您分享的示例中,您的' Y'中的最后两个值。专栏看起来你可能已经总结但却忘了划分。
我提出的解决方案有三个部分:1)创建一个指标来识别'异常值&#39 ;; 2)旗帜'异常值&#39 ;; 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),"")
这使用LARGE功能来查找第n个&#39;最大值,其中 n 是从当前时间步长到平均值的先前值的数量。然后它构建一个范围,从找到的单元格延伸到当前时间步长。然后它将标志(0&#39; s和1&#39; s)乘以每个月的生产值,将它们相加并除以 n 。这样,被标记为坏的月份被设置为0并且不包括在总和中。
这是一种更清洁的方式来实现所需的结果,并具有平均不同时间段的灵活性。请参阅下面最终值的示例。