Хранилище ансамблей файлов с использованием данных в текстовых файлах

При проекте прогнозирующего алгоритма обслуживания вы часто имеете системные данные в простом текстовом формате, таком как значения, разделенные запятыми (CSV). В этом примере показано, как создать и использовать fileEnsembleDatastore объект для управления ансамблем данных, хранящихся в таком формате.

Данные ансамбля

Извлеките сжатые данные для примера.

unzip fleetdata.zip  % extract compressed files

Ансамбль состоит из десяти файлов, fleetdata_01.txt, ..., fleetdata_10.txt, каждый содержит данные по одному автомобилю в автопарке. Каждый файл содержит пять немаркированных столбцов данных, соответствующих ежедневным показаниям следующих значений:

  • Показания одометра в конце дня, в милях

  • Топливо, потребляемое в тот день, в галлонах

  • Максимум оборотов в минуту для дня

  • Максимальная температура двигателя на день, в степенях Цельсия

  • Engine состояние света в конце дня (0 = off, 1 = on)

Каждый файл содержит данные за период от около 80 до около 120 дней операции. Наборы данных были искусственно изготовлены для этого примера и не соответствуют реальным данным флота.

Настройте Ensemble Datastore

Создайте 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)

Figure contains an axes. The axes 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 снова считывает данные от следующего представителя ансамбля и совершенствует 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

См. также

|

Похожие темы