時系列データから条件抽出し、カウントや累積和を出す方法
24 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Takafumi Amano
am 17 Jul. 2021
Kommentiert: Takafumi Amano
am 18 Jul. 2021
以下のような時系列データから、2列目の前後Indexを比較し、条件によってTrue,False判定し、
その値に応じてカウントアップをさせたいのですが、なにか良い方法はありませんでしょうか?
イメージは以下のようなデータ1,2列のデータがあり、3~5列のようなデータを付与したいです。
① Index前後によって比較する方法(上記2列目のRoomTempデータから、3列目のような列を作成する方法)
For loopやcircshiftなどを使って、配列をずらし、条件比較し算出する方法は浮かぶのですが、なにかもっと良い別の手法があればご教授いただきたく。
② 他の列の条件によってカウントアップする方法(上記3や4列目のデータから、4や5列目のカウントアップや累積和を作成する方法)
他列の条件により、累積和を出す方法でできると思うのですが、条件により累積和をリセットする方法がわかりません。
カウント自体は条件によって異なるので、常にIndex数が同じとは限らないので、ForLoopで特定数で回すこともできません。
上記①②について、何か良い方法が無いかアドバイスいただきたく、よろしくお願いいたします。
0 Kommentare
Akzeptierte Antwort
Atsushi Ueno
am 18 Jul. 2021
Bearbeitet: Atsushi Ueno
am 18 Jul. 2021
① 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)
Weitere Antworten (1)
Hernia Baby
am 18 Jul. 2021
Bearbeitet: Hernia Baby
am 18 Jul. 2021
まずは下準備
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)
Siehe auch
Kategorien
Mehr zu Calendar finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!