テキスト ファイル内のデータを使用するファイル アンサンブル データストア
予知保全アルゴリズムの設計では、コンマ区切り値 (CSV) などのプレーン テキスト形式でシステム データを扱うことがよくあります。この例では、そのような形式で保管されているデータのアンサンブルを管理するために、fileEnsembleDatastore
オブジェクトを作成して使用する方法を説明します。
アンサンブル データ
この例の圧縮データを解凍します。
unzip fleetdata.zip % extract compressed files
アンサンブルは、それぞれが自動車フリートの自動車 1 台のデータを含む 10 個のファイル fleetdata_01.txt, ..., fleetdata_10.txt
で構成されています。各ファイルにはラベル付けされていないデータ列が 5 つ含まれ、以下の日次読み取り値に対応します。
その日の終わりのオドメーター読み取り値 (マイル)
その日の消費燃料 (ガロン)
その日の最大 rpm
その日の最高エンジン温度 (摂氏)
その日の終わりのエンジン警告灯ステータス (0 = オフ、1 = オン)
各ファイルに約 80 ~ 120 日分の運行データが含まれています。データセットはこの例のために人工的に生成されたもので、実在のフリート データには対応していません。
アンサンブル データストアの構成
データを管理する fileEnsembleDatastore
オブジェクトを作成します。
location = pwd;
extension = '.txt';
fensemble = fileEnsembleDatastore(location,extension);
提供されている関数 readFleetData.m
を使用してファイルからデータを読み取るように、アンサンブル データストアを構成します。
fensemble.ReadFcn = @readFleetData;
データ ファイルの列にはラベルがないため、関数 readFleetData
によって、対応するデータに事前定義されたラベルが付加されます。readFleetData
に定義されているラベルと一致するように、アンサンブル データ変数を構成します。
fensemble.DataVariables = ["Odometer";"FuelConsump";"MaxRPM";"MaxTemp";"EngineLight"];
関数 readFleetData
はまた、ファイル名を解析してデータが収集された自動車の ID を返します。これは 1 ~ 10 の数字です。この ID はアンサンブルの独立変数です。
fensemble.IndependentVariables = "ID";
すべてのデータ変数と独立変数を、アンサンブル データストアから読み取るために選択した変数として指定します。
fensemble.SelectedVariables = [fensemble.IndependentVariables;fensemble.DataVariables]; fensemble
fensemble = fileEnsembleDatastore with properties: ReadFcn: @readFleetData WriteToMemberFcn: [] DataVariables: [5x1 string] IndependentVariables: "ID" ConditionVariables: [0x0 string] SelectedVariables: [6x1 string] ReadSize: 1 NumMembers: 10 LastMemberRead: [0x0 string] Files: [10x1 string]
アンサンブル データの読み取り
read
は、アンサンブル データストアに対して呼び出されると、readFleetData
を使って最初のアンサンブル メンバーから選択した変数を読み取ります。
data1 = read(fensemble)
data1=1×6 table
ID Odometer FuelConsump MaxRPM MaxTemp EngineLight
__ _________________ _________________ _________________ _________________ _________________
1 {120x1 timetable} {120x1 timetable} {120x1 timetable} {120x1 timetable} {120x1 timetable}
オドメーター データを確認してプロットします。
odo1 = data1.Odometer{1}
odo1=120×1 timetable
Time Var1
_______ ______
0 days 180.04
1 day 266.76
2 days 396.01
3 days 535.19
4 days 574.31
5 days 714.82
6 days 714.82
7 days 821.44
8 days 1030.5
9 days 1213.4
10 days 1303.4
11 days 1416.9
12 days 1513.5
13 days 1513.5
14 days 1697.1
15 days 1804.6
⋮
plot(odo1.Time,odo1.Var1)
フリートのこのメンバーの平均燃費効率を計算します。この値は前日のオドメーター読み取り値を合計消費燃料で除算したものです。
fuelConsump1 = data1.FuelConsump{1}.Var1; totalConsump1 = sum(fuelConsump1); totalMiles1 = odo1.Var1(end); mpg1 = totalMiles1/totalConsump1
mpg1 = 22.3086
すべてのアンサンブル メンバーからのデータのバッチ処理
read
を再び呼び出すと、これは次のアンサンブル メンバーからデータを読み取り、そのアンサンブルのファイル名が反映されるように fensemble
の LastMemberRead
プロパティを次に進めます。処理手順を繰り返してそのメンバーの平均燃費効率を計算することができます。実際には、データの読み取りと処理のプロセスを自動化するとさらに便利です。これを行うには、アンサンブル データストアをデータが読み取られていない状態にリセットします。次にアンサンブルをループ処理して各メンバーに読み取りと処理の手順を実行し、各自動車の ID と平均燃費効率を含む table を返します (Parallel Computing Toolbox™ がある場合、これを使用してより大規模なデータ アンサンブルの処理を高速化できます)。
reset(fensemble) mpgData = zeros(10,2); % preallocate array for 10 ensemble members ct = 1; while hasdata(fensemble) data = read(fensemble); odo = data.Odometer{1}.Var1; fuelConsump = data.FuelConsump{1}.Var1; totalConsump = sum(fuelConsump); mpg = odo(end)/totalConsump1; ID = data.ID; mpgData(ct,:) = [ID,mpg]; ct = ct + 1; end mpgTable = array2table(mpgData,'VariableNames',{'ID','mpg'})
mpgTable=10×2 table
ID mpg
__ ______
1 22.309
2 19.327
3 20.816
4 27.464
5 18.848
6 22.517
7 27.018
8 27.284
9 17.149
10 26.37