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

В этом примере показано, как вычислить сгруппированную статистику длинное расписание, содержащего данные об отключении степени. В примере используется grouptransform, groupsummary, и groupcounts функции для вычисления различных интересующих величин, таких как наиболее распространенная причина отключения степени в каждой области. Даже при том, что необработанные данные в этом примере имеют только около 1500 строк, можно использовать методы, представленные здесь, на намного больших наборах данных, потому что не делается никаких предположений о размере данных.

Создайте 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 и преобразуйте длинную таблицу в длинное расписание. The OutageTime переменная используется для значений времени строки, поскольку она является первой переменной datetime или duration в таблице.

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.18 sec
- Pass 2 of 4: Completed in 0.47 sec
- Pass 3 of 4: Completed in 0.35 sec
- Pass 4 of 4: Completed in 0.43 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.28 sec
Evaluation completed in 0.38 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.67 sec
- Pass 2 of 2: Completed in 0.4 sec
Evaluation completed in 1.4 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.2 sec
- Pass 2 of 2: Completed in 0.25 sec
Evaluation completed in 0.73 sec
causes=43×4 table
         Cause           Region      GroupCount    Percent 
    ________________    _________    __________    ________

    attack              MidWest          12         0.83391
    attack              NorthEast       135          9.3815
    attack              SouthEast        19          1.3204
    attack              West            126          8.7561
    earthquake          NorthEast         1        0.069493
    earthquake          West              1        0.069493
    energy emergency    MidWest          19          1.3204
    energy emergency    NorthEast        29          2.0153
    energy emergency    SouthEast        79          5.4899
    energy emergency    SouthWest         7         0.48645
    energy emergency    West             46          3.1967
    equipment fault     MidWest           9         0.62543
    equipment fault     NorthEast        17          1.1814
    equipment fault     SouthEast        40          2.7797
    equipment fault     SouthWest         2         0.13899
    equipment fault     West             85          5.9069
      ⋮

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

RegionCauses = gather(unstack(causes,"GroupCount","Region","GroupingVariables","Cause"))
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.16 sec
- Pass 2 of 2: Completed in 0.25 sec
Evaluation completed in 0.56 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")

Figure contains an axes. The axes contains an object of type categoricalhistogram.

См. также

| |

Похожие темы