swdata/calc_reward3.py
2023-03-15 21:16:16 +08:00

86 lines
3.2 KiB
Python

import json
import csv
from pathlib import Path
from island.match import Match
from island.matches import Matches
user_data = {} # user_id => {m => match_count, s => total_score, w => total_win}
winners = {} # match_id => [user_id]
ms = Matches('wos-data-2022-12-16')
for m in ms.data:
print(m.name)
if 'G' in m.name:
game_end_at = int(m.query('game', 'created').first()['info']['game_end_at'])
for r in m.query('user', 'fitness').raw_data:
if r['user'] not in user_data:
user_data[r['user']] = dict(m=0,s=0,w=0)
user_data[r['user']]['m'] += 1
user_data[r['user']]['s'] += float(r['fitness'])/game_end_at
r = m.query('game', 'winner').first()
for u in r['data']:
user_data[u]['w'] += 1
winners[m.name] = r['data']
else:
player_data = {} #player_id => game_count
user_data_this_match = {} # user_id => {g => game_count, s => avg_score}
for r in m.query('action', 'done').raw_data:
for p in [r['a'], r['b']]:
if p not in player_data:
player_data[p] = 1
else:
player_data[p] += 1
for r in m.query('player', 'join').raw_data:
if r['pid'] in player_data:
user_data_this_match[r['uid']] = dict(g=player_data[r['pid']], s=0)
for r in m.query('user', 'fitness').raw_data:
if r['user'] in user_data_this_match:
user_data_this_match[r['user']]['s'] = float(r['fitness'])/user_data_this_match[r['user']]['g']
if r['user'] not in user_data:
user_data[r['user']] = dict(m=1, s=user_data_this_match[r['user']]['s'], w=0)
else:
user_data[r['user']]['m'] += 1
user_data[r['user']]['s'] += user_data_this_match[r['user']]['s']
top1 = dict(s=0, u=[])
top2 = dict(s=0, u=[])
top3 = dict(s=0, u=[])
for k,v in user_data_this_match.items():
if v['s'] > top1['s']:
top3 = top2
top2 = top1
top1 = dict(s=v['s'], u=[k])
elif v['s'] == top1['s']:
top1['u'].append(k)
elif v['s'] > top2['s']:
top3 = top2
top2 = dict(s=v['s'], u=[k])
elif v['s'] == top2['s']:
top2['u'].append(k)
elif v['s'] > top3['s']:
top3 = dict(s=v['s'], u=[k])
elif v['s'] == top3['s']:
top3['u'].append(k)
print('Match: ', m.name)
print('top1: ', json.dumps(top1))
print('top2: ', json.dumps(top2))
print('top3: ', json.dumps(top3))
winners[m.name] = top1['u']+top2['u']+top3['u']
for t in [top1, top2, top3]:
for u in t['u']:
user_data[u]['w'] += 1
with open('user.avg.score.csv', 'w', encoding='utf-8') as f:
writer = csv.writer(f, lineterminator='\n')
for k,v in user_data.items():
avg_score = v['s']/v['m']
writer.writerow([k, v['s'], v['w'], avg_score])
with open('winners.json', 'w', encoding='utf-8') as f:
json.dump(winners, f)