В этом примере показано, как вычислить сгруппированную статистику длинного расписания, содержащего данные об отключении электроэнергии. Пример использует grouptransform
, groupsummary
, и groupcounts
функции, чтобы вычислить различные количества интереса, такие как наиболее распространенная причина отключения электроэнергии в каждой области. Даже при том, что необработанные данные в этом примере только имеют приблизительно 1 500 строк, можно использовать методы, представленные здесь на намного больших наборах данных, потому что никакие предположения не сделаны о размере данных.
Файл примера, 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
Не все комбинации причин отключения электричества и областей представлены в данных, таким образом, получившаяся таблица содержит некоторый 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.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")
findgroups
| splitapply
| tall