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

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

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

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

unzip fleetdata.zip  % extract compressed files

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

  • Одометр, читающий в конце дня, в милях

  • Топливо используется в тот день в галлонах

  • Максимальный об/мин в течение дня

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

  • Состояние светового сигнала Engine в конце дня (0 = прочь, 1 = на)

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

Сконфигурируйте Datastore ансамбля

Создайте 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×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 object. The axes object 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 ансамбля к состоянию, в котором не были считаны никакие данные. Затем цикл через ансамбль и выполняет чтение и этапы процесса для каждого члена, возвращая таблицу, которая содержит 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

Смотрите также

|

Похожие темы