時系列データから条件抽出し,カウントや累積和を出す方法

9次浏览(最近30天)
Takafumi天野之弥
Takafumi天野之弥 2021年7月17日
以下のような時系列データから,2列目の前後指数を比較し,条件によって真的,假判定し,
その値に応じてカウントアップをさせたいのですが,なにか良い方法はありませんでしょうか吗?
イメージは以下のようなデータ1,2列のデータがあり,3 ~ 5列のようなデータを付与したいです。
①指数前後によって比較する方法(上記2列目のRoomTempデータから,3列目のような列を作成する方法)
For循环やcircshiftなどを使って,配列をずらし,条件比較し算出する方法は浮かぶのですが,なにかもっと良い別の手法があればご教授いただきたく。
②他の列の条件によってカウントアップする方法(上記3や4列目のデータから,4や5列目のカウントアップや累積和を作成する方法)
他列の条件により,累積和を出す方法でできると思うのですが,条件により累積和をリセットする方法がわかりません。
カウント自体は条件によって異なるので,常に指数数が同じとは限らないので,ForLoopで特定数で回すこともできません。
上記①②について,何か良い方法が無いかアドバイスいただきたく,よろしくお願いいたします。

接受的答案

Atsushi上野
Atsushi上野 2021年7月18日
编辑:Atsushi上野 2021年7月18日
①指数前後によって比較する方法 :データ内容から”局所的ピークを検出“していると判断しました
局所的最大値- MATLAB findpeaks MathWorks日本 : 3列目のピーク判定にはfindpeaks関数が最も適します。
局所的最大値を検出- MATLAB islocalmax MathWorks日本 : 3列目のピーク判定にはislocalmax /分钟関数も適します。
②他の列の条件によってカウントアップする方法
連長圧縮——维基百科 : 4列目のカウントアップは連長圧縮の応用です。専用のMATLAB関数は無いと思いますが関連記事は多数あります。为文工夫してを無くす事も可能ですがトリッキーなので,普通に为文でリセットするのが無難だと思います。同様の問題が科迪にもあります。 Make a run-length companion vector - MATLAB Cody - MATLAB Central (mathworks.com)
累積和- MATLAB cumsum MathWorks日本 : 5列目の累積和にはcumsum関数が適しています。
时间戳= repelem (datetime(0:8 2021、7、17日,1,3),2)';
时间戳(2:2:结束)。分钟=时间戳(2:2:结束)。分钟+ 30;% 1列目の時刻
RoomTemp = [25.9467 26.0536 26.191 26.3284 26.0325 26.5575 26.6185 26.6287 ....
'; ';% 2列目の室温データ
Var5 = islocalmin(RoomTemp) + 0;% 3列目のピーク判定(0加算は逻辑→双値変換の為)
Var3 = 0;% 4列目のカウントアップ(ここから)
k = ~ Var5 '%ピーク判定の反転値(ピーク時に0⇒カウントリセット)
Var3 = [Var3;k * Var3(结束)+ 1);
结束
Var3 = Var3(2:结束);% 4列目のカウントアップ(ここまで)最後に先頭に付けた0を除く
Var4 = cumsum (Var5);% 5列目の累積和
myTable = table(timestamp, RoomTemp, Var5, Var3, Var4)
myTable =18×5表
时间戳 RoomTemp Var5 Var3 Var4 ____________________ ________ ____ ____ ____17 - 7 - 2021 00:01:03 25.947 0 1 0 17 - 7 - 2021 00:31:03 26.054 0 2 0 17 - 7 - 2021 01:01:03 26.191 0 3 0 17 - 7 - 2021 01:31:03 26.328 0 4 0 17 - 7 - 2021 02:01:03 26.032 1 1 1 2021年- 7月17日02:31:03 26.558 0 2 1 2021年- 7月17日03:01:03 26.619 0 3 1 2021年- 7月17日03:31:03 26.629 0 4 1 2021年- 7月17日04:01:03 26.153 - 1 1 2 2021年- 7月17日04:31:03 26.629 0 2 217- juli -2021 05:01:03 26.639 03 2 17- juli -2021 05:31:03 26.712 0 4 2 17- juli -2021 06:01:03 26.835 05 2
1评论
Takafumi天野之弥
Takafumi天野之弥 2021年7月18日
回答ありがとうございました。
連長圧縮というのは初めて知り,たいへん勉強になりました。
ありがとうございました。

登录评论。

答案(1)

疝的婴儿
疝的婴儿 2021年7月18日
编辑:疝的婴儿 2021年7月18日
まずは下準備
clc,清晰;
TT = readtimetable (“Sample.xlsx”);
①指数前後によって比較する方法
diff 関数を使います
idx = diff (TT.RoomTemp) < 0;
idx = [0;idx];%最初の行は0
TT。Var5 =双(idx);
②他の列の条件によってカウントアップする方法
純粋に虽然と如果で条件分けします。
その1:カウントアップ
Var3 = 0(长度(idx), 1);
idx1 = idx;
idx1 (1) = 1;
问= 1;
num = 0;
问< =长度(Var3)
如果idx1(问)= = 1;
num = 1;
其他的
Num = Num + 1;
结束
Var3(问)= num;
CNT = CNT +1;
结束
TT。Var3 = Var3;
その2:1がきたら1を足す
Var4 = 0(长度(idx), 1);
问= 1;
num = 0;
问< =长度(Var3)
如果idx(问)= = 1
Num = Num +1;
结束
Var4(问)= num;
CNT = CNT +1;
结束
TT。Var4 = Var4;
確認してみましょう
头(TT)
ans =8×4时间表
时间戳 RoomTemp Var5 Var3 Var4 ____________________ ________ ____ ____ ____ 17 - 7 - 2021 00:01:0325.947 0 1 017 - 7 - 2021 00:31:0326.054 0 2 017 - 7 - 2021 01:01:0326.191 0 3 017 - 7 - 2021 01:31:0326.328 0 4 017 - 7 - 2021 02:01:0326.032 1 1 117 - 7 - 2021 02:31:035 . 1 .詹妮弗17 - 7 - 2021 03:01:032 . 1 .保险精算师17 - 7 - 2021 03:31:035 . 1 .詹妮弗
1评论
Takafumi天野之弥
Takafumi天野之弥 2021年7月18日
回答ありがとうございました。
diff関数をすっかり忘れていました。
ありがとうございました。

登录评论。

s manbetx 845


释放

R2020b

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!