mirror of
https://codeberg.org/rimu/pyfedi
synced 2025-01-24 03:43:42 -08:00
50 lines
1.1 KiB
Python
50 lines
1.1 KiB
Python
|
# from https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9
|
||
|
|
||
|
from math import sqrt, log
|
||
|
from datetime import datetime, timedelta
|
||
|
|
||
|
|
||
|
|
||
|
epoch = datetime(1970, 1, 1)
|
||
|
|
||
|
|
||
|
def epoch_seconds(date):
|
||
|
td = date - epoch
|
||
|
return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)
|
||
|
|
||
|
|
||
|
def score(ups, downs):
|
||
|
return ups - downs
|
||
|
|
||
|
|
||
|
# used for ranking stories
|
||
|
def hot(ups, downs, date):
|
||
|
s = score(ups, downs)
|
||
|
order = log(max(abs(s), 1), 10)
|
||
|
sign = 1 if s > 0 else -1 if s < 0 else 0
|
||
|
seconds = epoch_seconds(date) - 1134028003 # this value seems to be an arbitrary time in 2005.
|
||
|
return round(sign * order + seconds / 45000, 7)
|
||
|
|
||
|
|
||
|
# used for ranking comments
|
||
|
def _confidence(ups, downs):
|
||
|
n = ups + downs
|
||
|
|
||
|
if n == 0:
|
||
|
return 0
|
||
|
|
||
|
z = 1.281551565545
|
||
|
p = float(ups) / n
|
||
|
|
||
|
left = p + 1 / (2 * n) * z * z
|
||
|
right = z * sqrt(p * (1 - p) / n + z * z / (4 * n * n))
|
||
|
under = 1 + 1 / n * z * z
|
||
|
|
||
|
return (left - right) / under
|
||
|
|
||
|
|
||
|
def confidence(ups, downs):
|
||
|
if ups + downs == 0:
|
||
|
return 0
|
||
|
else:
|
||
|
return _confidence(ups, downs)
|