При проекте прогнозирующего алгоритма обслуживания вы часто имеете системные данные в простом текстовом формате, таком как значения, разделенные запятыми (CSV). В этом примере показано, как создать и использовать fileEnsembleDatastore
объект для управления ансамблем данных, хранящихся в таком формате.
Извлеките сжатые данные для примера.
unzip fleetdata.zip % extract compressed files
Ансамбль состоит из десяти файлов, fleetdata_01.txt, ..., fleetdata_10.txt
, каждый содержит данные по одному автомобилю в автопарке. Каждый файл содержит пять немаркированных столбцов данных, соответствующих ежедневным показаниям следующих значений:
Показания одометра в конце дня, в милях
Топливо, потребляемое в тот день, в галлонах
Максимум оборотов в минуту для дня
Максимальная температура двигателя на день, в степенях Цельсия
Engine состояние света в конце дня (0 = off, 1 = on)
Каждый файл содержит данные за период от около 80 до около 120 дней операции. Наборы данных были искусственно изготовлены для этого примера и не соответствуют реальным данным флота.
Создайте fileEnsembleDatastore
объект для управления данными.
location = pwd;
extension = '.txt';
fensemble = fileEnsembleDatastore(location,extension);
Сконфигурируйте ensemble datastore, чтобы использовать предоставленную функцию 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";
Задайте все переменные данных и независимую переменную как выбранные переменные для чтения из ансамбля datastore.
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
на ансамбле datastore использует 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
снова считывает данные от следующего представителя ансамбля и совершенствует LastMemberRead
свойство fensemble
для отражения файлового имени этого ансамбля. Можно повторить шаги обработки, чтобы вычислить средний пробег газа для этого представителя. На практике более полезно автоматизировать процесс считывания и обработки данных. Для этого сбросьте ансамбль datastore в состояние, в котором данные не были считаны. Затем выполните цикл через ансамбль и выполните шаги чтения и обработки для каждого представителя, возвращая таблицу, которая содержит идентификатор каждого автомобиля и средний пробег газа. (Если у вас есть 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