移動シフト/変更こんにちは ...
この掲示板での私のお気に入りのトピックに戻ります。
次のロジックを構築するのに助けが必要です。
特定の日時パラメーターに対して時系列に並べられたデータ (Y) を介した一定サイズの移動ウィンドウ内
1-Y 最小 = 最小を見つける必要があります
2-Y最大=最大を見つける必要があります
3-Compute shift = max - min (最大が最小のレコードの後に時系列で識別された場合)
またはそうでなければ
shift = min-max (min のレコードの前に max が年代順に識別された場合)
数式内で 1 と 2 を実行できますが、シフトを計算するためのトリックが見つかりませんでした
数式ソリューションが推奨されますが、そうでない場合はスクリプトも機能します。 (特に、スクリプトが数式ウィンドウ内で機能する場合)
注: 明日 (2020 年 9 月 2 日) にこれらを計算する必要があります。
どうも ...
分析他のスクリプティングRe: 移動シフト/変更私は常に、動作するコードは賞賛されるべきであり、失敗するのではなく、動作している場合は.....それを使用してください。
Re: 移動シフト/変更ジム
次のフォーム(あなたのものほどコンパクトではありません)を使用して、私のロジックですべて完了したと思います..
私のYは指数加重関数なので、最初の項は空白です。これは私の「+1」が必要です
AssetRecordNumber == 列番号( :Name( "Y" ), :ASSET ) + 1
これに対するあなたの素晴らしいサポートに感謝します。何か問題がある場合はお知らせください。ただし、テストしたところ、3 つのシナリオすべてで機能するようです。
-------------------------------------------------- ------------------------
If( Col Number( :Name( "Y" ), :ASSET ) >= :detection_window & :AssetRecordNumber >= :detection_window,
If( :AssetRecordNumber == :検出ウィンドウ、
conSize = :detection_window;
allVals = :Name( "Y" ) << 値を取得します。
);
start = Row() - (:detection_window - 1);
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;
、
If( 列番号( :Name( "Y" ), :ASSET ) >= :window_min & :AssetRecordNumber == 列番号( :Name( "Y" ), :ASSET ) + 1,
(conSize = Col Number( :Name( "Y" ), :ASSET ) ; allVals = :Name( "Y" ) << get values);
start = Row() - (Col Number( :Name( "Y" ), :ASSET ) - 1);
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;
、
.
)
)
Re: 移動シフト/変更ジム、これについてもう 1 つお願いがあります。
私の分析は、最初は一定のローリング ウィンドウとして開始されましたが、(detection_window のように) 目標レコード数を持たないアセットを考慮に入れる必要があるため、2 つ目のテーブル変数 window_min を挿入して、それらの制約を緩和する必要があります。 (ローリング ウィンドウ サイズの最小値)。
例として、私のdetection_window = 30およびwindow_min = 15の場合、それは
1) 30 を超えるレコードを持つすべてのアセットには、サイズ 30 のローリング ウィンドウがあります。
2) 30 ~ 15 のレコードを含むすべてのアセットには、最大長の単一のウィンドウがあります。
3) 15 より小さい他のすべてのアセットには何もありません
元のソリューションから変更を推奨していただけますか?
ありがとう ...
Re: 移動シフト/変更ジム、
迅速なサポートに感謝します (これまでもそうでした)
私は2つの変更を加えました...
1) detection_window は、ローリング ウィンドウの長さを定義するテーブル変数です。
2)開始はdetection_window -1(2行目)にする必要があると思います
さらに重要なことに、私の Y 列も、1 秒の資産変数 Z ごとに (「値を取得」する段階で) 取り込まれる必要があります。
(つまり、Y と Z は 2 つの列であり、資産 Z の関数として最小最大計算シフトを計算する必要があります。 )
これを 1 つの特定の Z アセットに対してプロットしたところ、正しい結果が得られました。
最初に、資産 Z ごとに個別に行数 = detection_window があるときに計算を開始する IF ステートメントがあります ... これが機能する理由だと思います。
[row()- (detection_window -1) ] は、各アセットの正しい先頭から開始します。
start =1 は私を少し混乱させました..これが行#1からウィンドウを開始しないことを願っています.
あなたの助けに感謝。
If( 行() == 1,
conSize = :detection_window;
allVals = Y << 値を取得します。
);
If( Row() <= conSize,
開始 = 1、
start = Row() - (:detection_window - 1)
);
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;
Re: 移動シフト/変更これでシフト値が得られると思います。式の定数サイズ(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;