Этот пример показывает, как использовать findgroups и функции splitapply, чтобы вычислить сгруппированную статистику длинного расписания, содержащего данные отключения электроэнергии. findgroups и splitapply позволяют вам разбить высокие переменные в группы, использовать те группы, чтобы разделить данные, и затем применить функцию к каждой группе данных. Также, если у вас есть Статистика и Машинное обучение Toolbox™, затем также можно использовать функцию grpstats, чтобы вычислить сгруппированную статистику.
Этот пример создает длинное расписание для данных отключения электроэнергии, даже при том, что необработанные данные только имеют приблизительно 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 = datastore('outages.csv','TextscanFormats',data_formats);Составьте длинную таблицу сверху datastore и преобразуйте длинную таблицу в длинное расписание. Переменная OutageTime используется в течение времен строки, поскольку это - первый datetime или переменная длительности в таблице.
T = tall(ds); T = table2timetable(T)
T =
Mx5 tall timetable
OutageTime Region Loss Customers RestorationTime Cause
__________ ______ ____ _________ _______________ _____
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
: : : : : :
: : : : : :
Некоторые строки в длинной таблице имеют недостающие данные, представленные значениями NaT и NaN. Удалите все строки, которые пропускают по крайней мере одну часть данных.
idx = ~any(ismissing(T),2); T = T(idx,:)
T =
Mx5 tall timetable
OutageTime Region Loss Customers RestorationTime Cause
__________ ______ ____ _________ _______________ _____
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
: : : : : :
: : : : : :
Определите среднюю длительность отключения электроэнергии в каждой области. Функция findgroups группирует данные категориальными значениями в Region. Функция splitapply применяет заданную функцию к каждой группе данных и конкатенирует результаты вместе.
[G,regions] = findgroups(T.Region); times = splitapply(@mean,T.RestorationTime-T.OutageTime,G)
times =
Mx1 tall duration array
?
?
?
:
:
Измените формат отображения результатов длительности быть в днях и поместить результаты в таблицу в оперативной памяти со связанными областями.
times.Format = 'd'; varnames = {'Regions','MeanOutageDuration'}; maxOutageDurations = gather(table(regions,times,'VariableNames',varnames))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 3: Completed in 0.2 sec - Pass 2 of 3: Completed in 0.42 sec - Pass 3 of 3: Completed in 0.46 sec Evaluation completed in 2 sec
maxOutageDurations=5×2 table
Regions MeanOutageDuration
_________ __________________
MidWest 52.258 days
NorthEast 1.8538 days
SouthEast 1.835 days
SouthWest 2.0212 days
West 0.99895 days
Определите, как часто каждая причина отключения электроэнергии происходит в каждой области. Во-первых, сгруппируйте данные и причиной и областью. Задайте три выходных параметров к findgroups, чтобы возвратить информацию о причине и области для каждой части данных. Затем используйте splitapply, чтобы считать количество случаев каждой причины в каждой области.
[G2,causes,regions] = findgroups(T.Cause,T.Region); C = splitapply(@(x) numel(x),T.Cause,G2)
C =
Mx1 tall double column vector
?
?
?
:
:
Преобразуйте результаты в таблицу в оперативной памяти и не сложите переменные 'Region' и 'Count'. Используйте fillmissing на таблице в оперативной памяти, чтобы заменить значения NaN на нули.
RegionCauses = gather(table(causes,regions,C,'VariableNames',{'Cause','Region','Count'}))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.36 sec - Pass 2 of 2: Completed in 0.24 sec Evaluation completed in 0.97 sec
RegionCauses=43×3 table
Cause Region Count
________________ _________ _____
attack MidWest 4
attack NorthEast 75
attack SouthEast 6
attack West 44
earthquake NorthEast 1
earthquake West 1
energy emergency MidWest 11
energy emergency NorthEast 11
energy emergency SouthEast 39
energy emergency SouthWest 5
energy emergency West 19
equipment fault MidWest 6
equipment fault NorthEast 13
equipment fault SouthEast 28
equipment fault SouthWest 1
equipment fault West 50
⋮
RegionCauses = unstack(RegionCauses,'Count','Region'); RegionCauses = fillmissing(RegionCauses,'constant',{'',0,0,0,0,0})
RegionCauses=10×6 table
Cause MidWest NorthEast SouthEast SouthWest West
________________ _______ _________ _________ _________ ____
attack 4 75 6 0 44
earthquake 0 1 0 0 1
energy emergency 11 11 39 5 19
equipment fault 6 13 28 1 50
fire 0 4 2 0 10
severe storm 17 54 86 4 13
thunder storm 22 37 39 6 4
unknown 4 4 2 0 1
wind 12 19 11 3 15
winter storm 9 30 23 1 17
findgroups | splitapply | высокий