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

Этот пример показывает, как использовать findgroups и функции splitapply, чтобы вычислить сгруппированную статистику длинного расписания, содержащего данные об отключении электроэнергии. findgroups и splitapply позволяют вам разбить высокие переменные в группы, использовать те группы, чтобы разделить данные, и затем применить функцию к каждой группе данных. Также, если у вас есть Statistics and Machine Learning 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.23 sec
- Pass 2 of 3: Completed in 0.46 sec
- Pass 3 of 3: Completed in 0.51 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

    ?
    ?
    ?
    :
    :

Преобразуйте результаты в таблицу в оперативной памяти и распакуйте переменные 'Count' и 'Region'. Используйте 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.34 sec
- Pass 2 of 2: Completed in 0.25 sec
Evaluation completed in 0.9 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 

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

| |

Похожие темы