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

В этом примере показано, как вычислить сгруппированную статистику длинного расписания, содержащего данные об отключении электроэнергии. Пример использует grouptransform, groupsummary, и groupcounts функции, чтобы вычислить различные количества интереса, такие как наиболее распространенная причина отключения электроэнергии в каждой области. Даже при том, что необработанные данные в этом примере только имеют приблизительно 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 = tabularTextDatastore("outages.csv","TextscanFormats",data_formats);

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

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

  Mx5 tall timetable

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

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

Замените Недостающие данные

Некоторые строки в RestorationTime переменная имеет недостающие времена, представленные NaT значения. Удалите эти строки из таблицы.

T = rmmissing(T,"DataVariables","RestorationTime");

Для числовых переменных в расписании, вместо того, чтобы удалить строки с отсутствующими значениями, заменяют отсутствующие значения на среднее значение для каждой области.

T = grouptransform(T,"Region","meanfill",["Loss","Customers"]);

Используйте ismissing подтвердить, что никакие части недостающих данных не остаются в таблице.

tf = any(ismissing(T),"all");
gather(tf)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 4: Completed in 0.17 sec
- Pass 2 of 4: Completed in 0.48 sec
- Pass 3 of 4: Completed in 0.34 sec
- Pass 4 of 4: Completed in 0.41 sec
Evaluation completed in 2.2 sec
ans = logical
   0

Предварительно просмотрите данные

Теперь, когда данные не содержат отсутствующие значения, приносят небольшое количество строк в память, чтобы понять то, что содержат данные.

gather(head(T))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.26 sec
Evaluation completed in 0.37 sec
ans=8×5 timetable
       OutageTime        Region       Loss     Customers     RestorationTime          Cause     
    ________________    _________    ______    __________    ________________    _______________

    2002-02-01 12:18    SouthWest    458.98    1.8202e+06    2002-02-07 16:50    winter storm   
    2003-02-07 21:15    SouthEast     289.4    1.4294e+05    2003-02-17 08:14    winter storm   
    2004-04-06 05:44    West         434.81    3.4037e+05    2004-04-06 06:10    equipment fault
    2002-03-16 06:18    MidWest      186.44    2.1275e+05    2002-03-18 23:23    severe storm   
    2003-06-18 02:49    West              0             0    2003-06-18 10:54    attack         
    2004-06-20 14:39    West         231.29    1.5354e+05    2004-06-20 19:16    equipment fault
    2002-06-06 19:28    West         311.86    1.5354e+05    2002-06-07 00:51    equipment fault
    2003-07-16 16:23    NorthEast    239.93         49434    2003-07-17 01:12    fire           

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

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

  • "Region" как сгруппированная переменная

  • "mean" как метод расчета

  • "OutageDuration" как переменная, чтобы работать с.

T.OutageDuration = T.RestorationTime - T.OutageTime;
times = groupsummary(T,"Region","mean","OutageDuration")
times =

  Mx3 tall table

    Region    GroupCount    mean_OutageDuration
    ______    __________    ___________________

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

Измените формат отображения результатов длительности быть в днях и собрать результаты в память. Результаты показывают среднюю длительность отключения электричества в каждой области, а также количество отключений электричества, о которых сообщают, в каждой области.

times.mean_OutageDuration.Format = "d";
times = gather(times)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.71 sec
- Pass 2 of 2: Completed in 0.43 sec
Evaluation completed in 1.5 sec
times=5×3 table
     Region      GroupCount    mean_OutageDuration
    _________    __________    ___________________

    MidWest         138            34.135 days    
    NorthEast       548             24.21 days    
    SouthEast       379            1.7013 days    
    SouthWest        25            2.4799 days    
    West            349            28.061 days    

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

Определите, как часто каждая причина отключения электроэнергии происходит в каждой области. Используйте groupcounts с Cause и Region переменные как сгруппированные переменные. Соберите результаты в память.

causes = groupcounts(T,["Cause","Region"]);
causes = gather(causes)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.21 sec
- Pass 2 of 2: Completed in 0.26 sec
Evaluation completed in 0.66 sec
causes=43×3 table
         Cause           Region      GroupCount
    ________________    _________    __________

    attack              MidWest          12    
    attack              NorthEast       135    
    attack              SouthEast        19    
    attack              West            126    
    earthquake          NorthEast         1    
    earthquake          West              1    
    energy emergency    MidWest          19    
    energy emergency    NorthEast        29    
    energy emergency    SouthEast        79    
    energy emergency    SouthWest         7    
    energy emergency    West             46    
    equipment fault     MidWest           9    
    equipment fault     NorthEast        17    
    equipment fault     SouthEast        40    
    equipment fault     SouthWest         2    
    equipment fault     West             85    
      ⋮

Каждая причина несколько раз происходит в таблице, поэтому даже при том, что таблица содержит правильные данные, это не находится в соответствующем формате, чтобы видеть, как часто каждая причина происходит в каждой области. Чтобы улучшить представление данных, распакуйте GroupCount переменная так, чтобы каждый столбец соответствовал области и каждой строке, соответствует причине отключения электричества.

RegionCauses = gather(unstack(causes,"GroupCount","Region"))
RegionCauses=10×6 table
         Cause          MidWest    NorthEast    SouthEast    SouthWest    West
    ________________    _______    _________    _________    _________    ____

    attack                 12         135           19          NaN       126 
    earthquake            NaN           1          NaN          NaN         1 
    energy emergency       19          29           79            7        46 
    equipment fault         9          17           40            2        85 
    fire                  NaN           5            3          NaN        17 
    severe storm           30         139          132            6        22 
    thunder storm          31         102           54            6         7 
    unknown                 4          10            3          NaN         4 
    wind                   16          40           13            3        22 
    winter storm           17          70           36            1        19 

Не все комбинации причин отключения электричества и областей представлены в данных, таким образом, получившаяся таблица содержит некоторый NaNs. Заполните NaN значения с нулями.

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

    attack                12          135           19           0        126 
    earthquake             0            1            0           0          1 
    energy emergency      19           29           79           7         46 
    equipment fault        9           17           40           2         85 
    fire                   0            5            3           0         17 
    severe storm          30          139          132           6         22 
    thunder storm         31          102           54           6          7 
    unknown                4           10            3           0          4 
    wind                  16           40           13           3         22 
    winter storm          17           70           36           1         19 

Худшие отключения электроэнергии в каждой области

Вычислите самый широкий потребительский удар для каждого отключения электроэнергии в каждой области.

WorstOutages = groupsummary(T,["Region","Cause"],"max","Customers");
WorstOutages = gather(WorstOutages)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.2 sec
- Pass 2 of 2: Completed in 0.26 sec
Evaluation completed in 0.64 sec
WorstOutages=43×4 table
     Region           Cause          GroupCount    max_Customers
    _________    ________________    __________    _____________

    MidWest      attack                  12         2.4403e+05  
    MidWest      energy emergency        19         5.0376e+05  
    MidWest      equipment fault          9         2.4403e+05  
    MidWest      severe storm            30          3.972e+06  
    MidWest      thunder storm           31         3.8233e+05  
    MidWest      unknown                  4         3.0879e+06  
    MidWest      wind                    16         2.8666e+05  
    MidWest      winter storm            17         7.7697e+05  
    NorthEast    attack                 135         1.5005e+05  
    NorthEast    earthquake               1                  0  
    NorthEast    energy emergency        29         1.5005e+05  
    NorthEast    equipment fault         17          1.667e+05  
    NorthEast    fire                     5         4.5139e+05  
    NorthEast    severe storm           139         1.0735e+06  
    NorthEast    thunder storm          102         5.9689e+06  
    NorthEast    unknown                 10         2.4983e+06  
      ⋮

Объедините данные в Region и Cause переменные в одну категориальную переменную путем краткого преобразования их в строки. Затем создайте категориальную гистограмму максимального количества затронутых клиентов по каждой причине в каждой области.

WorstOutages.RegionCause = categorical(string(WorstOutages.Region)+" ("+string(WorstOutages.Cause)+")");
histogram("Categories",WorstOutages.RegionCause,"BinCounts",WorstOutages.max_Customers,...
    "DisplayOrder","descend")
ylabel("Max # Affected Customers")

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

| |

Похожие темы