-
Notifications
You must be signed in to change notification settings - Fork 0
/
update_stats.py
58 lines (39 loc) · 1.39 KB
/
update_stats.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python
import time
import math
import db_wrapper
def score_weight(predicted_score, true_score):
p = predicted_score.split(':')
t = true_score.split(':')
score_diff = abs(int(p[0]) - int(t[0])) + abs(int(p[1]) - int(t[1]))
return math.exp(-1.5 * score_diff)
def try_process_event():
unprocessed_events = db_wrapper.Event.get_unprocessed_events()
if len(unprocessed_events) == 0:
print 'No unprocessed events'
return
event = unprocessed_events[0]
print 'Starting score update for event %s' % event.event_id
votes = event.get_votes()
weights = [score_weight(votes[i].predicted_score, event.score) for i in range(len(votes))]
weight_sum = sum(weights) + 1e-6
normalized_weights = [w / weight_sum for w in weights]
total_prize = float(len(votes))
for i in range(len(votes)):
prize = total_prize * normalized_weights[i]
user = db_wrapper.User(votes[i].user_id)
user.update_rating(user.rating + prize)
print 'User %d updated' % user.telegram_id
event.set_processed()
print 'Score update completed for event %s' % event.event_id
def main():
db_wrapper.init('188.166.85.96', 27017, None, None)
while True:
try:
try_process_event()
except Exception as e:
print e
finally:
time.sleep(5)
if __name__ == '__main__':
main()