В этом примере показано, как вычислить сгруппированную статистику длинное расписание, содержащего данные об отключении степени. В примере используется grouptransform
, groupsummary
, и groupcounts
функции для вычисления различных интересующих величин, таких как наиболее распространенная причина отключения степени в каждой области. Даже при том, что необработанные данные в этом примере имеют только около 1500 строк, можно использовать методы, представленные здесь, на намного больших наборах данных, потому что не делается никаких предположений о размере данных.
Образец файла, 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
Не все комбинации причин отключения и областей представлены в данных, поэтому полученная таблица содержит некоторые NaN
s. Заполнить 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