텍스트 파일에 있는 데이터를 사용하는 파일 앙상블 데이터저장소
예측 정비 알고리즘을 설계할 때는 쉼표로 구분된 값(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)
이 자동차 멤버의 평균 연비를 계산합니다. 이 값은 그날의 주행 기록계 측정값을 소비된 총 연료로 나눈 값입니다.
fuelConsump1 = data1.FuelConsump{1}.Var1; totalConsump1 = sum(fuelConsump1); totalMiles1 = odo1.Var1(end); mpg1 = totalMiles1/totalConsump1
mpg1 = 22.3086
모든 앙상블 멤버의 데이터 일괄 처리하기
read
를 다시 호출하면 이 명령은 다음 앙상블 멤버에서 데이터를 읽어 들이고 fensemble
의 LastMemberRead
로 넘어가서 해당 앙상블의 파일 이름을 반영합니다. 처리 단계를 반복하여 해당 멤버의 평균 연비를 계산할 수 있습니다. 실제 현장에서는 데이터의 읽기 및 처리 과정을 자동화하는 것이 더 유용합니다. 이렇게 하려면 앙상블 데이터저장소를 어떤 데이터도 읽히지 않은 상태로 재설정하십시오. 그런 다음 앙상블을 순환하면서 각 멤버에 대해 읽기 및 처리 단계를 수행하여 각 자동차의 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