Skip to content

Commit c6e049b

Browse files
committed
implement Lib.median()
1 parent 67cc14d commit c6e049b

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

src/lib/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ var statsModule = require('./stats');
7575
lib.aggNums = statsModule.aggNums;
7676
lib.len = statsModule.len;
7777
lib.mean = statsModule.mean;
78+
lib.median = statsModule.median;
7879
lib.midRange = statsModule.midRange;
7980
lib.variance = statsModule.variance;
8081
lib.stdev = statsModule.stdev;

src/lib/stats.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,22 @@ exports.stdev = function(data, len, mean) {
7474
return Math.sqrt(exports.variance(data, len, mean));
7575
};
7676

77+
/**
78+
* median of a finite set of numbers
79+
* reference page: https://en.wikipedia.org/wiki/Median#Finite_set_of_numbers
80+
**/
81+
exports.median = function(data, len) {
82+
if(!len) len = exports.len(data);
83+
var b = data.slice().sort();
84+
if(len % 2 === 0) {
85+
// If even
86+
return (b[len / 2 - 1] + b[len / 2]) / 2;
87+
} else {
88+
// If odd
89+
return b[(len - 1) / 2];
90+
}
91+
};
92+
7793
/**
7894
* interp() computes a percentile (quantile) for a given distribution.
7995
* We interpolate the distribution (to compute quantiles, we follow method #10 here:

test/jasmine/tests/lib_test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,20 @@ describe('Test lib.js:', function() {
176176
});
177177
});
178178

179+
describe('median() should', function() {
180+
it('return the middle value exactly for odd number of observations:', function() {
181+
var input = [1, 3, 3, 6, 7, 8, 9];
182+
var res = Lib.median(input);
183+
expect(res).toEqual(6);
184+
});
185+
186+
it('return the mean of the two middle values for even number of observations', function() {
187+
var input = [1, 2, 3, 4, 5, 6, 8, 9];
188+
var res = Lib.median(input);
189+
expect(res).toEqual(4.5);
190+
});
191+
});
192+
179193
describe('stdev() should', function() {
180194
it('return 0 on input [2, 2, 2, 2, 2]:', function() {
181195
var input = [2, 2, 2, 2];

0 commit comments

Comments
 (0)