Main Content

텍스트 파일에 있는 데이터를 사용하는 파일 앙상블 데이터저장소

예측 정비 알고리즘을 설계할 때는 쉼표로 구분된 값(CSV)과 같은 일반 텍스트 형식으로 된 시스템 데이터를 사용하게 되는 경우가 많습니다. 이 예제에서는 fileEnsembleDatastore 객체를 만들어서 이러한 형식으로 저장된 데이터의 앙상블을 관리하는 데 사용하는 방법을 보여줍니다.

앙상블 데이터

압축된 데이터를 예제에서 사용하기 위해 추출합니다.

unzip fleetdata.zip  % extract compressed files

앙상블은 각각 자동차 한 대에 대응하는 데이터를 포함하는 열 개의 파일 fleetdata_01.txt, ..., fleetdata_10.txt로 구성됩니다. 각 파일은 다음 값에 대한 일일 측정값에 해당하는 다섯 개의 레이블 없는 데이터 열을 포함합니다.

  • 그날의 끝에 측정한 주행 기록계 측정값(마일)

  • 그날에 소비된 연료(갤런)

  • 그날의 최대 rpm

  • 그날의 최대 엔진 온도(섭씨)

  • 그날의 끝의 엔진 점검등 상태(0 = 꺼짐, 1 = 켜짐)

각 파일은 80~120일 분량의 운행 데이터를 포함합니다. 데이터 세트는 이 예제를 위해 인공적으로 만들어졌으며 실제 자동차 데이터에 대응되지 않습니다.

앙상블 데이터저장소 구성

데이터를 관리할 fileEnsembleDatastore 객체를 만듭니다.

location = pwd;
extension = '.txt';
fensemble = fileEnsembleDatastore(location,extension);

제공된 함수 readFleetData.m을 사용하여 파일에서 데이터를 읽어 들이도록 앙상블 데이터저장소를 구성합니다.

addpath(fullfile(matlabroot,'examples','predmaint','main')) % Make sure functions are on path
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)

Figure contains an axes object. The axes object contains an object of type line.

이 자동차 멤버의 평균 연비를 계산합니다. 이 값은 그날의 주행 기록계 측정값을 소비된 총 연료로 나눈 값입니다.

fuelConsump1 = data1.FuelConsump{1}.Var1;
totalConsump1 = sum(fuelConsump1);
totalMiles1 = odo1.Var1(end);
mpg1 = totalMiles1/totalConsump1
mpg1 = 22.3086

모든 앙상블 멤버의 데이터 일괄 처리하기

read를 다시 호출하면 이 명령은 다음 앙상블 멤버에서 데이터를 읽어 들이고 fensembleLastMemberRead로 넘어가서 해당 앙상블의 파일 이름을 반영합니다. 처리 단계를 반복하여 해당 멤버의 평균 연비를 계산할 수 있습니다. 실제 현장에서는 데이터의 읽기 및 처리 과정을 자동화하는 것이 더 유용합니다. 이렇게 하려면 앙상블 데이터저장소를 어떤 데이터도 읽히지 않은 상태로 재설정하십시오. 그런 다음 앙상블을 순환하면서 각 멤버에 대해 읽기 및 처리 단계를 수행하여 각 자동차의 ID와 평균 연비를 포함하는 테이블을 반환합니다. (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

참고 항목

|

관련 항목