При проектировании алгоритма предиктивного обслуживания часто используются системные данные в формате обычного текста, например значения, разделенные запятыми (CSV). В этом примере показано, как создавать и использовать fileEnsembleDatastore объект управления ансамблем данных, хранящихся в таком формате.
Извлеките сжатые данные для примера.
unzip fleetdata.zip % extract compressed files
Ансамбль состоит из десяти файлов, fleetdata_01.txt, ..., fleetdata_10.txt, каждый из которых содержит данные для одного автомобиля в парке автомобилей. Каждый файл содержит пять немаркированных столбцов данных, соответствующих ежедневным показаниям следующих значений:
Показания одометра в конце дня, в милях
Топливо, потребленное в тот день, в галлонах
Максимальная частота вращения за день
Максимальная температура двигателя за сутки, в градусах Цельсия
Состояние освещения двигателя в конце дня (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 также анализирует имя файла, чтобы вернуть идентификатор автомобиля, из которого были собраны данные, номер от 1 до 10. Этот идентификатор является независимой от ансамбля переменной.
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/totalConsump1mpg1 = 22.3086
При звонке read опять же, он считывает данные от следующего участника ансамбля и продвигает LastMemberRead имущество fensemble для отражения имени файла этого ансамбля. Можно повторить шаги обработки, чтобы вычислить средний пробег газа для этого элемента. На практике более полезно автоматизировать процесс считывания и обработки данных. Для этого следует сбросить хранилище данных ансамбля в состояние, в котором данные не считывались. Затем проведите по ансамблю и выполните операции чтения и обработки для каждого участника, вернув таблицу, которая содержит идентификатор каждого автомобиля и средний пробег газа. (Если у вас есть Toolbox™ Parallel Computing, вы можете использовать его для ускорения обработки больших массивов данных.)
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