Skip to content

Calculate average score and rating based on Wilson Score Equation

License

Notifications You must be signed in to change notification settings

ndaidong/average-rating

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

average-rating

Calculate average and scoring based on Wilson Score Equation

CodeQL CI test Coverage Status NPM JSR

Google app on Google Play

Setup & Usage

Deno

https://jsr.io/@ndaidong/average-rating

deno add @ndaidong/average-rating

# npm (use any of npx, yarn dlx, pnpm dlx, or bunx)
npx jsr add @ndaidong/average-rating
// es6 module
import { average, rate, score } from "@ndaidong/average-rating";

// CommonJS
const {
  score,
  rate,
  average,
} = require("@ndaidong/average-rating");

score(80, 20); // => 0.71
rate([134055, 57472, 143135, 365957, 1448459]); // => 0.84
average([134055, 57472, 143135, 365957, 1448459]); // => 4.4

You can use JSR packages without an install step using jsr: specifiers:

import { average } from "jsr:@ndaidong/average-rating";

average([134055, 57472, 143135, 365957, 1448459]); // => 4.4

You can also use npm: specifiers as before:

import { average } from "npm:@ndaidong/average-rating";

average([134055, 57472, 143135, 365957, 1448459]); // => 4.4

Or import from esm.sh

import { average } from "https://esm.sh/@ndaidong/average-rating";

average([134055, 57472, 143135, 365957, 1448459]); // => 4.4

Node.js & Bun

https://www.npmjs.com/package/@ndaidong/average-rating

npm i @ndaidong/average-rating
# pnpm
pnpm i @ndaidong/average-rating
# yarn
yarn add @ndaidong/average-rating
# bun
bun add @ndaidong/average-rating
import { average } from "@ndaidong/average-rating";

average([134055, 57472, 143135, 365957, 1448459]); // => 4.4

You can also use CJS style:

const { average } = require("@ndaidong/average-rating");

average([134055, 57472, 143135, 365957, 1448459]); // => 4.4

Browsers:

<script type="module">
import { average } from "https://esm.sh/@ndaidong/average-rating";
// import { average } from 'https://unpkg.com/@ndaidong/average-rating/esm/mod.js';

average([134055, 57472, 143135, 365957, 1448459]) // => 4.4
</script>

APIs

.score(Number positive, Number negative)

This method returns a normalized value between 0 and 1, but it's applicable for systems with only positive and negative ratings (like/dislike, thumbs up/thumbs down). Examples include videos on YouTube or answers on Stack Overflow. In these systems, users can express their opinion by voting for either a positive or negative option.

Let's illustrate how this method works with a blog post that received 80 likes and 20 dislikes:

import { score } from "@ndaidong/average-rating";

score(80, 20); // => 0.71

.rate(Array ratings)

This method returns a normalized value between 0 and 1, commonly used in rating systems with 5 levels. Examples include applications on Google Play Store or books on Amazon. In these systems, each item receives a user rating between 1 and 5 stars.

Let's take a product with a large volume of reviews as an example. Here's how we calculate its rating:

  • 134,055 customers rated it 1 star
  • 57,472 gave it a 2-star rating
  • There are 143,135 ratings of 3 stars
  • It received a 4-star rating from 365,957 users
  • And a whopping 1,448,459 customers rated it 5 stars
import { rate } from "@ndaidong/average-rating";

rate([134055, 57472, 143135, 365957, 1448459]); // => 0.84
Update
  • Since v1.1.5, this rate method accepts custom range of ratings. 5 or more values are OK.
const input = [3, 4, 2, 6, 12, 46, 134, 213, 116, 91, 45, 15, 58, 96, 1654]; // 15 values
rate(input); // => 0.85

rate([3, 4, 2, 6, 12, 46, 134, 213, 116, 91]); // => 0.74

.average(Array ratings)

Return a value from 0 to 5.

Calculate normal average value for the systems of 5 rating levels.

import { average } from "@ndaidong/average-rating";

average([134055, 57472, 143135, 365957, 1448459]); // => 4.4

Development

Since v3.x.x, we switched to Deno platform, and use DNT to build Node.js packages.

git clone https://github.com/ndaidong/average-rating.git
cd average-rating

# test
deno test

# build npm packages
deno task build

cd npm
node test_runner.js

License

The MIT License (MIT)