尾随累计和公式我的配方奶粉需求可能非常简单。 我有一个温度数据集,需要计算过去 120 天的追踪累积总和(称为“温度加热周”,因为我将通过除以 7 将该总和转换为周)。 我知道如何获取追踪平均值,也知道如何获取累计总和,但是是否有可能获得追踪 120 天的累计总和? 在这种情况下,当温度超过31.3℃时,给出0.25的“分数”(公式参见“DH-6小时”栏)。 基本上,我想要 120 天窗口内这些 0.25 值的累积总和,但我只知道如何按日期/月/年等进行分区(例如,请参阅“#DHWs”脚本),而不是按实际窗口进行分区的时间。 我坚信这一定是可行的!
高级统计建模自动化和脚本编写消费者和市场研究预测建模和机器学习质量和工艺工程回复:尾随累积和公式下面是一个可用于调试的新公式。它将为您最后放入 If() 语句中的任何行号创建数据表。如果您不想创建数据表,只需将您要查找的行号更改为-1。永远不会有 -1 行,因此不会创建表。不管怎样,看看你是否能看到发生了什么以及哪里发生了错误。
确保表排序正确,并且从表中删除任何不想处理的行。该脚本不支持排除行。
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
rowMatrix = [];
);
If( Is Missing( :Name( "Date Time (UTC)" ) ) == 0,
If(
Is Missing( :Name( " Sea Surface Temperature (deg C)" ) ) == 1, holdMatrix = holdMatrix || 0,
:Name( " Sea Surface Temperature (deg C)" ) > 31.3, holdMatrix = holdMatrix || :time difference 2,
:Name( " Sea Surface Temperature (deg C)" ) <= 31.3, holdMatrix = holdMatrix || 0
);
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
rowMatrix = rowMatrix || Row();
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
While(
dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ) & N Cols( holdMatrix ) > 0 &
N Cols( dateMatrix ) > 0,
dateMatrix[1] = [];
holdMatrix[1] = [];
rowMatrix[1] = [];
);
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
x = Sum( holdMatrix ),
x = .
);
,
x = .
);
,
x = .
);
If( Row() == 22159,
New Table( "row" || Char( Row() ),
New Column( "RowNum", set values( rowMatrix ) ),
New Column( "Values", set values( holdMatrix ) ),
New Column( "dates", set values( dateMatrix ), Format( "m/d/y" ) )
)
);
(x / 24) / 7;
回复:尾随累积和公式如果将以下内容添加到公式中
If( Row() == ????,
new table("row" || char(row()),new column("Values", set values(holdMatrix)),<BR /> new column("dates", set values(dateMatrix), format("m/d/y")));
);
(x / 24) / 7;
并更换 ????通过您认为数据变得有趣的行号,您将看到一个数据表,其中包含添加到值中的所有值以及收集值的日期。这可能会给您提供有关正在发生的事情的线索。
回复:尾随累积和公式感谢您的坚持! 这确实是一个问题,现在数据更有意义。 2018 年 10 月至 2019 年 6 月期间仍然存在一个问题:尽管气温从未升至 31.3℃ 以上,但即使到 2019 年 6 月(远超过 120 天),该值也从未降至 0。 你能说出那里可能发生了什么吗?
回复:尾随累积和公式我发现之前的公式有问题。缺失值导致了问题。此外,数据需要按日期升序排列。所以请在应用公式之前对表格进行排序
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( Is Missing( :Name( "Date Time (UTC)" ) ) == 0,
If(
Is Missing( :Name( " Sea Surface Temperature (deg C)" ) ) == 1, holdMatrix = holdMatrix || 0,
:Name( " Sea Surface Temperature (deg C)" ) > 31.3, holdMatrix = holdMatrix || :time difference 2,
:Name( " Sea Surface Temperature (deg C)" ) <= 31.3, holdMatrix = holdMatrix || 0
);
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ) & N Cols( holdMatrix ) > 0 & N Cols( dateMatrix ) > 0,
dateMatrix[1] = [];
holdMatrix[1] = [];
);
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
x = Sum( holdMatrix ),
x = .
);
,
x = .
);
,
x = .
);
(x / 24) / 7;
回复:尾随累积和公式仍然有一些奇怪的事情发生。 如果您查看此数据表,您会在“#DHWs(过去 120 天)”列中找到您的公式(尽管略有修改)。 有些时期的 4-6 个月内气温没有超过 31.3C,但该值从未减弱(例如 2014 年 10 月至 2015 年 5 月)。 如果 120 天内气温没有高于 31.3C,“#DHWs”应降至 0。 我觉得你的公式应该这样做。 不知道是不是一年到一年穿越的问题? 也许我可以将“Day”从 1 重新编码到 20,000?
回复:尾随累积和公式如果您只想要总和,则不要将总和除以任何值
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || 0.25;
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
);
If( N Cols( dateMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ),
holdMatrix[1] = [];
dateMatrix[1] = [];
);
x = Sum( holdMatrix ) ;
,
x = .
);
x;
回复:尾随累积和公式吉姆,感谢您再次查看我的问题,尽管您的新公式得出的值似乎太低(尽管该公式似乎有意义)。 但也许我应该以不同的方式表述我的需求,在这种情况下可能有一个更简单(或至少更直接的解决方案):我想知道过去 120 天内温度超过的总小时数31.3C。 这通常相当于 3 小时的时间段,因为温度仅每三个小时测量一次(在大多数情况下),因此它基本上是一系列 3 的总和(请参阅附表中的“DHHs”列)。 因此,在最温暖的月份,该值可能会达到数百。 所以基本上,我需要 DHH 列的尾随 120 天总和,但考虑到每天测量次数不同的问题,这很棘手!
回复:尾随累积和公式我不太确定您正在使用什么除数,但我使用了数据矩阵范围内的小时数。这是我想出的公式
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || 0.25;
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
);
If( N Cols( dateMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ),
holdMatrix[1] = [];
dateMatrix[1] = [];
);
x = Sum( holdMatrix ) / ((dateMatrix[N Cols( dateMatrix )] - dateMatrix[1]) / In Hours( 1 ));
,
x = .
);
x;
回复:尾随累积和公式我有一个问题是由数据集中一个恼人的怪癖引起的:我需要评估过去 120 天期间以小时为单位(而不是我之前提到的以周为单位)的累积总和。 但时间间隔不一致(见附表)。 大多数情况下,每天测量 8 次,但有时会更少。 基本上,任何时候温度>31.3,我都想将时间差添加到列中。 使用“dif”函数这很容易。 然而,我遇到的困难是如何将“120 天”添加到矩阵公式中。 因此,在附表中,我想要计算过去 120 天期间“DHH”的累积总和。 我不需要公式中的“行”数,而是需要它来跟踪日期。 那可能吗?
回复:尾随累积和公式伟大的! 这就成功了。 我只是对其进行了修改,以反映每天有八次测量时间的事实(即每一行不是唯一的一天,因此我在评估中乘以 121 x 8 = 968)。 这些数据是有意义的,因为该值在我之前计算的年度最大值处达到最大值,然后才下降。 非常感谢。 我希望公式编辑器中有一个尾随累积和,它具有与列移动平均值(我一直使用的)类似的输入:之前的权重和 N。 也许我会把它添加到愿望清单中。
回复:尾随累积和公式如果我正确地解释了你想要的内容,我相信下面的公式将计算运行 120 尾随累积和
If( Row() == 1,
holdMatrix = []
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || Matrix( 0.25 ),
holdMatrix = holdMatrix || Matrix( . )
);
If( N Cols( holdMatrix ) == 121,
holdMatrix[1] = []
);
Sum( holdMatrix ) / 7;