Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Calcular la media por grupo usando MapReduce

En este ejemplo se muestra cómo calcular la media por grupo en un conjunto de datos mediante.mapreduce Muestra cómo realizar cálculos en subgrupos de datos.

Preparar datos

Cree un almacén de datos utilizando el conjunto de información.airlinesmall.csv Este conjunto de datos de 12 megabyte contiene 29 columnas de información de vuelo para varias aerolíneas, incluidas las horas de llegada y salida. En este ejemplo, seleccione y (retardo de llegada de vuelo) como variables de interés.DayOfWeekArrDelay

ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA'); ds.SelectedVariableNames = {'ArrDelay', 'DayOfWeek'}; 

El almacén de datos trata los valores como ausentes y reemplaza los valores que faltan por valores predeterminados.'NA'NaN Además, la propiedad le permite trabajar solo con las variables de interés seleccionadas, que puede verificar utilizando.SelectedVariableNamespreview

preview(ds) 
 ans =    8x2 table      ArrDelay    DayOfWeek     ________    _________          8           3             8           1            21           5            13           5             4           4            59           3             3           4            11           6      

Ejecute MapReduce

La función requiere una función de mapa y una función de reducción como entradas.mapreduce El asignador recibe fragmentos de datos y genera resultados intermedios. El reductor Lee los resultados intermedios y produce un resultado final.

En este ejemplo, el asignador calcula el recuento y la suma de los retrasos por el día de la semana en cada fragmento de datos y, a continuación, almacena los resultados como pares clave-valor intermedios. Las claves son números enteros (1 a 7) que representan los días de la semana y los valores son vectores de dos elementos que representan el recuento y la suma del retraso de cada día.

Mostrar el archivo de función de mapa.

 function meanArrivalDelayByDayMapper(data, ~, intermKVStore) % Mapper function for the MeanByGroupMapReduceExample.  % Copyright 2014 The MathWorks, Inc.  % Data is an n-by-2 table: first column is the DayOfWeek and the second % is the ArrDelay. Remove missing values first. delays = data.ArrDelay; day = data.DayOfWeek; notNaN =~isnan(delays); day = day(notNaN); delays = delays(notNaN);  % find the unique days in this chunk [intermKeys,~,idx] = unique(day, 'stable');  % group delays by idx and apply @grpstatsfun function to each group intermVals = accumarray(idx,delays,size(intermKeys),@countsum); addmulti(intermKVStore,intermKeys,intermVals);  function out = countsum(x) n = length(x); % count s = sum(x); % mean out = {[n, s]};  

Después de la fase de mapa, agrupa los pares clave-valor intermedios por clave única (en este caso, el día de la semana).mapreduce Por lo tanto, cada llamada al reductor funciona en los valores asociados con un día de la semana. El reductor recibe una lista del recuento intermedio y la suma de los retrasos para el día especificado por la clave de entrada () y resume los valores en el recuento total y la suma total.intermKeyns A continuación, el reductor calcula la media general y añade un par clave-valor final a la salida. Este par clave-valor representa el retardo de llegada de vuelo medio para un día de la semana.

Visualice el archivo de función de reducción.

 function meanArrivalDelayByDayReducer(intermKey, intermValIter, outKVStore) % Reducer function for the MeanByGroupMapReduceExample.  % Copyright 2014 The MathWorks, Inc.  n = 0; s = 0;  % get all sets of intermediate results while hasnext(intermValIter)     intermValue = getnext(intermValIter);     n = n + intermValue(1);     s = s + intermValue(2); end  % accumulate the sum and count mean = s/n; % add results to the output datastore add(outKVStore,intermKey,mean);  

Se utiliza para aplicar el mapa y reducir las funciones al almacén de datos,.mapreduceds

meanDelayByDay = mapreduce(ds, @meanArrivalDelayByDayMapper, ...                                @meanArrivalDelayByDayReducer); 
******************************** *      MAPREDUCE PROGRESS      * ******************************** Map   0% Reduce   0% Map  16% Reduce   0% Map  32% Reduce   0% Map  48% Reduce   0% Map  65% Reduce   0% Map  81% Reduce   0% Map  97% Reduce   0% Map 100% Reduce   0% Map 100% Reduce  14% Map 100% Reduce  29% Map 100% Reduce  43% Map 100% Reduce  57% Map 100% Reduce  71% Map 100% Reduce  86% Map 100% Reduce 100% 

Devuelve un almacén de datos, con archivos en la carpeta actual.mapreducemeanDelayByDay

Lea el resultado final del almacén de datos de salida,.meanDelayByDay

result = readall(meanDelayByDay) 
 result =    7x2 table      Key     Value       ___    ________       3     [7.0038]      1     [7.0833]      5     [9.4193]      4     [9.3185]      6     [4.2095]      2     [5.8569]      7     [6.5241]  

Organizar resultados

Las claves de enteros (1 a 7) representan los días de la semana. Para organizar más los resultados, convierta las claves en una matriz categórica, recupere los valores numéricos de las celdas de un solo elemento y cambie el nombre de los nombres de variable de la tabla resultante.

result.Key = categorical(result.Key, 1:7, ...                {'Mon','Tue','Wed','Thu','Fri','Sat','Sun'}); result.Value = cell2mat(result.Value); result.Properties.VariableNames = {'DayOfWeek', 'MeanArrDelay'} 
 result =    7x2 table      DayOfWeek    MeanArrDelay     _________    ____________         Wed          7.0038           Mon          7.0833           Fri          9.4193           Thu          9.3185           Sat          4.2095           Tue          5.8569           Sun          6.5241     

Ordene las filas de la tabla por retraso de llegada del vuelo medio. Esto revela que el sábado es el mejor día de la semana para viajar, mientras que el viernes es el peor.

result = sortrows(result,'MeanArrDelay') 
 result =    7x2 table      DayOfWeek    MeanArrDelay     _________    ____________         Sat          4.2095           Tue          5.8569           Sun          6.5241           Wed          7.0038           Mon          7.0833           Thu          9.3185           Fri          9.4193     

Consulte también

|

Temas relacionados