Этот пример показывает, как использовать findgroups
и функции splitapply
, чтобы вычислить сгруппированную статистику длинного расписания, содержащего данные об отключении электроэнергии. findgroups
и splitapply
позволяют вам разбить высокие переменные в группы, использовать те группы, чтобы разделить данные, и затем применить функцию к каждой группе данных. Также, если у вас есть Statistics and Machine Learning 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.23 sec - Pass 2 of 3: Completed in 0.46 sec - Pass 3 of 3: Completed in 0.51 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 ? ? ? : :
Преобразуйте результаты в таблицу в оперативной памяти и распакуйте переменные 'Count'
и 'Region'
. Используйте 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.34 sec - Pass 2 of 2: Completed in 0.25 sec Evaluation completed in 0.9 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
| tall