换班/变动你好 ...
回到我在这个论坛上最喜欢的话题。
我需要帮助构建以下逻辑。
在数据 (Y) 大小恒定的移动窗口内,数据 (Y) 根据某些日期时间参数按时间顺序排序
1-需要找到Y最小值=min
2-需要求Y最大值=max
3-计算偏移 = max - min(如果 max 是在 min 的记录之后按时间顺序确定的)
要不然
shift = min- max (如果 max 按时间顺序在 min 的记录之前被识别)
我可以在公式中执行 1 和 2,但找不到任何计算移位的技巧
公式解决方案是首选,但如果不是,脚本也可以工作。 (特别是如果脚本可以在公式窗口中运行)
注意:我明天(2020 年 9 月 2 日)有一些紧急情况需要计算这些,任何帮助将不胜感激。
谢谢 ...
消费者和市场研究回复:换班/变动我一直发现工作代码应该受到赞扬,而不是错误,所以如果它工作......使用它。
回复:换班/变动吉姆
我相信我已经完成了我的逻辑和以下形式(它不像你的那么紧凑)..
我的 Y 是指数加权函数,因此第一项是空白,这是我的我需要“+1”
AssetRecordNumber == 列编号( :Name( "Y" ), :ASSET ) + 1
感谢您对此的大力支持。如果您发现任何问题,请告诉我,但我已经对其进行了测试,它似乎适用于所有 3 个场景。
-------------------------------------------------- ------------------------
If( 列编号( :名称( "Y" ), :ASSET ) >= :检测窗口 & :AssetRecordNumber >= :检测窗口,
If( :AssetRecordNumber == :检测窗口,
conSize = :检测窗口;
allVals = :Name( "Y" ) << 获取值;
);
开始 = Row() - (:检测窗口 - 1);
subMat = allVals[Index( 开始, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
如果( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
调动,转移;
,
If( 列号( :Name( "Y" ), :ASSET ) >= :window_min & :AssetRecordNumber == 列号( :Name( "Y" ), :ASSET ) + 1,
(conSize = Col Number( :Name( "Y" ), :ASSET ) ; allVals = :Name( "Y" ) << 获取值);
开始 = Row() - (列号(:Name("Y"), :ASSET) - 1);
subMat = allVals[Index( 开始, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
如果( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
调动,转移;
,
。
)
)
回复:换班/变动吉姆,对此还有一个要求。
我的分析首先从恒定滚动窗口开始,但随后我必须考虑一些没有目标记录数的资产(如在 detector_window 中),因此我需要通过插入第二个表变量 window_min 来放松对它们的约束(滚动窗口尺寸的最小值)。
举个例子,如果我的 detector_window = 30 且 window_min=15,这意味着
1) 所有记录多于 30 的资产,将有一个大小为 30 的滚动窗口
2) 所有包含 30 -15 条记录的资源都将有一个最大长度的窗口
3)所有其他小于15的资产不会有任何东西
您能否对您的原始解决方案提出修改建议?
谢谢 ...
回复:换班/变动吉姆,
再次感谢您及时的大力支持(一如既往)
我做了 2 处更改...
1)检测窗口是我的表变量,定义滚动窗口长度
2)我认为开始应该是Detection_window -1(在第二行)
更重要的是,我的 Y 列还需要按第二个资产变量 Z 拉入(围绕“获取值”阶段)
(即 Y 和 Z 是两列,需要计算最小最大计算偏移作为资产 Z 的函数。 )
现在,我针对一项特定的 Z 资产绘制了此图,结果是正确的。
我在开头确实有一个 IF 语句,当每个资产 Z 的行数 = detector_window 独立时,该语句开始计算... 我认为这就是它起作用的原因。
[row()- (detection_window -1) ] 从每个资产的正确开头开始。
start =1 让我有点困惑..希望这不会从第 1 行启动窗口。
感谢你的帮助。
如果(行()== 1,
conSize = :检测窗口;
allVals = Y << 获取值;
);
如果(行()<= conSize,
开始= 1,
开始 = Row() - (:检测窗口 - 1)
);
subMat = allVals[Index( 开始, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
如果( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
调动,转移;
回复:换班/变动我认为这会给你转变值。只需更改公式中的常量大小(conSize)值和 Y 列名称(Y),我相信它会计算出您想要的结果
If( Row() == 1,
conSize = 5;
allVals = :Y << get values;
);
If( Row() <= conSize,
start = 1,
start = Row() - conSize
);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
theShift;