Main Content

テキスト ファイル内のデータを使用するファイル アンサンブル データストア

予知保全アルゴリズムの設計では、コンマ区切り値 (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 を再び呼び出すと、これは次のアンサンブル メンバーからデータを読み取り、そのアンサンブルのファイル名が反映されるように fensembleLastMemberRead プロパティを次に進めます。処理手順を繰り返してそのメンバーの平均燃費効率を計算することができます。実際には、データの読み取りと処理のプロセスを自動化するとさらに便利です。これを行うには、アンサンブル データストアをデータが読み取られていない状態にリセットします。次にアンサンブルをループ処理して各メンバーに読み取りと処理の手順を実行し、各自動車の 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

参考

|

関連するトピック