# Evan Miller's Rating Sorting in Python

A common problem with a website is how to sort things by their rating. Evan Miller describes it well in his 2009 post, How Not To Sort By Average Rating.

Here is a Python snippet that implements his method:

``````import math
from scipy import stats

def ci_lower_bound(positive_ratings, total_ratings, confidence):
"""
Following http://www.evanmiller.org/how-not-to-sort-by-average-rating.html#changes
:return: the lower bound of the confidence interval
"""
n =  total_ratings
z = stats.norm.ppf(1 - (1 - confidence) / 2)
p_hat = 1.0 * positive_ratings / n
result = (
(
p_hat + z * z / (2 * n)
- z * math.sqrt(
(p_hat * (1 - p_hat) + z * z / (4 * n)) / n
)
) / (1 + z * z / n)
)
return result
``````

Note that this assumes you have the python package `scipy` installed. You can find it here.

As Evan Miller notes, your z value will be constant so you can also hardcode it, for example to `1.96` if you want a 95% confidence interval.

You can interpret the output of this function as a corrected rating, which ‘punishes’ items with a low number of votes.

Written on September 1, 2017