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