Сгруппированные вычисления статистики с длинными массивами

Этот пример показывает, как использовать findgroups и функции splitapply, чтобы вычислить сгруппированную статистику длинного расписания, содержащего данные отключения электроэнергии. findgroups и splitapply позволяют вам разбить высокие переменные в группы, использовать те группы, чтобы разделить данные, и затем применить функцию к каждой группе данных. Также, если у вас есть Статистика и Машинное обучение Toolbox™, затем также можно использовать функцию grpstats, чтобы вычислить сгруппированную статистику.

Этот пример создает длинное расписание для данных отключения электроэнергии, даже при том, что необработанные данные только имеют приблизительно 1 500 строк. Однако можно использовать методы, представленные здесь на намного больших наборах данных, потому что никакие предположения не сделаны о размере данных.

Создание Datastore и длинного расписания

Файл примера, outages.csv, содержит данные, представляющие отключения электричества электроэнергетики в Соединенных Штатах. Файл содержит шесть столбцов: Region, OutageTime, Loss, Customers, RestorationTime и Cause.

Создайте datastore для файла outages.csv. Используйте опцию 'TextScanFormats', чтобы задать вид данных, которые содержит каждый столбец: категориальный ('%C'), с плавающей точкой числовой ('%f') или datetime ('%D').

data_formats = {'%C','%D','%f','%f','%D','%C'};
ds = datastore('outages.csv','TextscanFormats',data_formats);

Составьте длинную таблицу сверху datastore и преобразуйте длинную таблицу в длинное расписание. Переменная OutageTime используется в течение времен строки, поскольку это - первый datetime или переменная длительности в таблице.

T = tall(ds);
T = table2timetable(T)
T =

  Mx5 tall timetable

    OutageTime    Region    Loss    Customers    RestorationTime    Cause
    __________    ______    ____    _________    _______________    _____

        ?           ?        ?          ?               ?             ?  
        ?           ?        ?          ?               ?             ?  
        ?           ?        ?          ?               ?             ?  
        :           :        :          :               :             :
        :           :        :          :               :             :

Чистые недостающие данные

Некоторые строки в длинной таблице имеют недостающие данные, представленные значениями NaT и NaN. Удалите все строки, которые пропускают по крайней мере одну часть данных.

idx = ~any(ismissing(T),2);
T = T(idx,:)
T =

  Mx5 tall timetable

    OutageTime    Region    Loss    Customers    RestorationTime    Cause
    __________    ______    ____    _________    _______________    _____

        ?           ?        ?          ?               ?             ?  
        ?           ?        ?          ?               ?             ?  
        ?           ?        ?          ?               ?             ?  
        :           :        :          :               :             :
        :           :        :          :               :             :

Средняя длительность отключения электроэнергии областью

Определите среднюю длительность отключения электроэнергии в каждой области. Функция findgroups группирует данные категориальными значениями в Region. Функция splitapply применяет заданную функцию к каждой группе данных и конкатенирует результаты вместе.

[G,regions] = findgroups(T.Region);
times = splitapply(@mean,T.RestorationTime-T.OutageTime,G)
times =

  Mx1 tall duration array

    ?
    ?
    ?
    :
    :

Измените формат отображения результатов длительности быть в днях и поместить результаты в таблицу в оперативной памяти со связанными областями.

times.Format = 'd';
varnames = {'Regions','MeanOutageDuration'};
maxOutageDurations = gather(table(regions,times,'VariableNames',varnames))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 3: Completed in 0.2 sec
- Pass 2 of 3: Completed in 0.42 sec
- Pass 3 of 3: Completed in 0.46 sec
Evaluation completed in 2 sec
maxOutageDurations=5×2 table
     Regions     MeanOutageDuration
    _________    __________________

    MidWest          52.258 days   
    NorthEast        1.8538 days   
    SouthEast         1.835 days   
    SouthWest        2.0212 days   
    West            0.99895 days   

Наиболее распространенные причины отключения электроэнергии областью

Определите, как часто каждая причина отключения электроэнергии происходит в каждой области. Во-первых, сгруппируйте данные и причиной и областью. Задайте три выходных параметров к findgroups, чтобы возвратить информацию о причине и области для каждой части данных. Затем используйте splitapply, чтобы считать количество случаев каждой причины в каждой области.

[G2,causes,regions] = findgroups(T.Cause,T.Region);
C = splitapply(@(x) numel(x),T.Cause,G2)
C =

  Mx1 tall double column vector

    ?
    ?
    ?
    :
    :

Преобразуйте результаты в таблицу в оперативной памяти и не сложите переменные 'Region' и 'Count'. Используйте fillmissing на таблице в оперативной памяти, чтобы заменить значения NaN на нули.

RegionCauses = gather(table(causes,regions,C,'VariableNames',{'Cause','Region','Count'}))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.36 sec
- Pass 2 of 2: Completed in 0.24 sec
Evaluation completed in 0.97 sec
RegionCauses=43×3 table
         Cause           Region      Count
    ________________    _________    _____

    attack              MidWest        4  
    attack              NorthEast     75  
    attack              SouthEast      6  
    attack              West          44  
    earthquake          NorthEast      1  
    earthquake          West           1  
    energy emergency    MidWest       11  
    energy emergency    NorthEast     11  
    energy emergency    SouthEast     39  
    energy emergency    SouthWest      5  
    energy emergency    West          19  
    equipment fault     MidWest        6  
    equipment fault     NorthEast     13  
    equipment fault     SouthEast     28  
    equipment fault     SouthWest      1  
    equipment fault     West          50  
      ⋮

RegionCauses = unstack(RegionCauses,'Count','Region');
RegionCauses = fillmissing(RegionCauses,'constant',{'',0,0,0,0,0})
RegionCauses=10×6 table
         Cause          MidWest    NorthEast    SouthEast    SouthWest    West
    ________________    _______    _________    _________    _________    ____

    attack                 4          75            6            0         44 
    earthquake             0           1            0            0          1 
    energy emergency      11          11           39            5         19 
    equipment fault        6          13           28            1         50 
    fire                   0           4            2            0         10 
    severe storm          17          54           86            4         13 
    thunder storm         22          37           39            6          4 
    unknown                4           4            2            0          1 
    wind                  12          19           11            3         15 
    winter storm           9          30           23            1         17 

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

| |

Похожие темы

Была ли эта тема полезной?