時系列データから条件抽出し、カウントや累積和を出す方法
조회 수: 24 (최근 30일)
이전 댓글 표시
以下のような時系列データから、2列目の前後Indexを比較し、条件によってTrue,False判定し、
その値に応じてカウントアップをさせたいのですが、なにか良い方法はありませんでしょうか?
イメージは以下のようなデータ1,2列のデータがあり、3~5列のようなデータを付与したいです。
① Index前後によって比較する方法(上記2列目のRoomTempデータから、3列目のような列を作成する方法)
For loopやcircshiftなどを使って、配列をずらし、条件比較し算出する方法は浮かぶのですが、なにかもっと良い別の手法があればご教授いただきたく。
② 他の列の条件によってカウントアップする方法(上記3や4列目のデータから、4や5列目のカウントアップや累積和を作成する方法)
他列の条件により、累積和を出す方法でできると思うのですが、条件により累積和をリセットする方法がわかりません。
カウント自体は条件によって異なるので、常にIndex数が同じとは限らないので、ForLoopで特定数で回すこともできません。
上記①②について、何か良い方法が無いかアドバイスいただきたく、よろしくお願いいたします。
댓글 수: 0
채택된 답변
Atsushi Ueno
2021년 7월 18일
편집: Atsushi Ueno
2021년 7월 18일
① Index前後によって比較する方法:データ内容から「局所的ピークを検出」していると判断しました
局所的最大値 - MATLAB findpeaks - MathWorks 日本:3列目のピーク判定にはfindpeaks関数が最も適します。
局所的最大値を検出 - MATLAB islocalmax - MathWorks 日本:3列目のピーク判定にはislocalmax/min関数も適します。
② 他の列の条件によってカウントアップする方法
連長圧縮 - Wikipedia:4列目のカウントアップは連長圧縮の応用です。専用のMATLAB関数は無いと思いますが関連記事は多数あります。工夫してfor文を無くす事も可能ですがトリッキーなので、普通にfor文でリセットするのが無難だと思います。同様の問題がCodyにもあります。Make a run-length companion vector - MATLAB Cody - MATLAB Central (mathworks.com)
累積和 - MATLAB cumsum - MathWorks 日本:5列目の累積和にはcumsum関数が適しています。
Timestamps = repelem(datetime(2021,7,17,0:8,1,3),2)';
Timestamps(2:2:end).Minute = Timestamps(2:2:end).Minute + 30; % 1列目の時刻
RoomTemp = [25.9467 26.0536 26.191 26.3284 26.0325 26.5575 26.6185 26.6287...
26.153 26.6287 26.6385 26.712 26.835 26.315 26.5982 26.7203 26.7814 26.9]'; % 2列目の室温データ
Var5 = islocalmin(RoomTemp) + 0; % 3列目のピーク判定(0加算はLogical→double値変換の為)
Var3 = 0; % 4列目のカウントアップ(ここから)
for k = ~Var5' % ピーク判定の反転値(ピーク時に0⇒カウントリセット)
Var3 = [Var3; k*Var3(end)+1];
end
Var3 = Var3(2:end); % 4列目のカウントアップ(ここまで)最後に先頭に付けた0を除く
Var4 = cumsum(Var5);% 5列目の累積和
myTable = table(Timestamps, RoomTemp, Var5, Var3, Var4)
추가 답변 (1개)
Hernia Baby
2021년 7월 18일
편집: Hernia Baby
2021년 7월 18일
まずは下準備
clc,clear;
TT = readtimetable('Sample.xlsx');
①Index前後によって比較する方法
diff関数を使います
idx = diff(TT.RoomTemp)<0;
idx = [0; idx]; %最初の行は0
TT.Var5 = double(idx);
②他の列の条件によってカウントアップする方法
純粋にwhileとifで条件分けします。
その1:カウントアップ
Var3 = zeros(length(idx),1);
idx1 = idx;
idx1(1) = 1;
cnt = 1;
num = 0;
while cnt <= length(Var3)
if idx1(cnt) == 1;
num = 1;
else
num = num + 1;
end
Var3(cnt) = num;
cnt = cnt +1;
end
TT.Var3 = Var3;
その2:1がきたら1を足す
Var4 = zeros(length(idx),1);
cnt = 1;
num = 0;
while cnt <= length(Var3)
if idx(cnt) == 1
num = num +1;
end
Var4(cnt) = num;
cnt = cnt +1;
end
TT.Var4 = Var4;
確認してみましょう
head(TT)
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!