В этом примере показано, как вычислить сгруппированную статистику высокого графика, содержащую данные отключения электроэнергии. В примере используется grouptransform, groupsummary, и groupcounts функции для расчета различных интересующих величин, таких как наиболее распространенная причина отключения электроэнергии в каждом регионе. Несмотря на то, что необработанные данные в этом примере содержат только около 1500 строк, можно использовать методы, представленные здесь для гораздо больших наборов данных, поскольку в отношении размера данных не делается никаких предположений.
Образец файла, outages.csv, содержит данные, представляющие отключения электроэнергии в Соединенных Штатах. Файл содержит шесть столбцов: Region, OutageTime, Loss, Customers, RestorationTime, и Cause.
Создание хранилища данных для outages.csv файл. Используйте "TextScanFormats" для указания типа данных, содержащихся в каждом столбце: категориальный ("%C"), число с плавающей запятой ("%f") или datetime ("%D").
data_formats = ["%C","%D","%f","%f","%D","%C"]; ds = tabularTextDatastore("outages.csv","TextscanFormats",data_formats);
Создайте высокую таблицу в верхней части хранилища данных и преобразуйте ее в высокое расписание. 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")

findgroups | splitapply | tall