def padto(str,n): return " "*(n-len(str)) + str padding = 7 import sys import matplotlib.pyplot as plt file = sys.argv[1] file = open(file, 'r') data = [] for line in file: game = line.split(' ') g = [] for p in range(len(game)/2): g.append( (game[2*p], int(game[2*p+1])) ) data.append(g) file.close() initial = 1400. k = 32. div = 400. base = 10. if len(sys.argv) > 2: k = int(sys.argv[2]) players = { } # name : ([elo history], [games played]) changes = { } # name : delta h2h = { } # (name,name) : seq of W/L (1/0) gn = 0 # game no. for game in data: gn += 1 for a in range(len(game)): for b in range(a+1,len(game)): p1 = game[a] p2 = game[b] if p1[0] not in players: players[p1[0]] = ([initial],[0]) if p1[0] not in changes: changes[p1[0]] = 0. l = players[p1[0]][1] l.append(gn) players[p1[0]] = (players[p1[0]][0], l) if p2[0] not in players: players[p2[0]] = ([initial],[0]) if p2[0] not in changes: changes[p2[0]] = 0. l = players[p2[0]][1] l.append(gn) players[p2[0]] = (players[p2[0]][0], l) # print a,b,players r1 = base**(players[p1[0]][0][-1]/div) r2 = base**(players[p2[0]][0][-1]/div) e1 = r1/(r1+r2) e2 = r2/(r1+r2) s1 = .5 s2 = .5 if (p1[1] < p2[1]): s1 = 1. s2 = 0. if (p1[1] > p2[1]): s1 = 0. s2 = 1. changes[p1[0]] += k*(s1-e1)/(len(game)-1) changes[p2[0]] += k*(s2-e2)/(len(game)-1) # print p1,s1,e1,k*(s1-e1),p2,s2,e2,k*(s2-e2) if (p1[0],p2[0]) not in h2h: h2h[(p1[0],p2[0])] = [] if (p2[0],p1[0]) not in h2h: h2h[(p2[0],p1[0])] = [] l1 = h2h[(p1[0],p2[0])] l2 = h2h[(p2[0],p1[0])] # print(l1,l2) if p1[1] < p2[1]: h2h[(p1[0],p2[0])] = l1 + [1] h2h[(p2[0],p1[0])] = l2 + [0] elif p1[1] > p2[1]: h2h[(p1[0],p2[0])] = l1 + [0] h2h[(p2[0],p1[0])] = l2 + [1] else: h2h[(p1[0],p2[0])] = l1 + [0] h2h[(p2[0],p1[0])] = l2 + [0] for p in changes.keys(): # print players[p][0],players[p][0][-1],changes[p],players[p][0][-1]+changes[p],(players[p][0]).append(players[p][0][-1]+changes[p]) l = players[p][0] l.append(l[-1]+changes[p]) players[p] = (l,players[p][1]) changes = { } print "=============================================" print sys.argv[1] + " elo results:" n = list(players.keys()) n = sorted(n, key=lambda p: -1*players[p][0][-1]) for p in n: s = padto(p,padding) + ": " + str(int(players[p][0][-1])) + ", " + padto(str(len(players[p][1])-1),3) + " games played" print s # print players[p][1] print "=============================================" print "head-to-head results:" print "wins\n ", for p in n: print p[:2], print "\n", for p1 in n: print p1[:2], for p2 in n: if (p1,p2) not in h2h: print "--", else: if int(100*sum(h2h[(p1,p2)])/len(h2h[(p1,p2)])) == 100: print "**", else: print padto(str(int(100*sum(h2h[(p1,p2)])/len(h2h[(p1,p2)]))),2), print "\n", print "ties\n ", for p in n: print p[:2], print "\n", for p1 in n: print p1[:2], for p2 in n: if (p1,p2) not in h2h: print "--", else: if int(100-100*(sum(h2h[(p1,p2)])+sum(h2h[(p2,p1)]))/len(h2h[(p1,p2)])) == 100: print "**", else: print padto(str(int(100-100*(sum(h2h[(p1,p2)])+sum(h2h[(p2,p1)]))/len(h2h[(p1,p2)]))),2), print "\n", for p in n: plt.plot(players[p][1],players[p][0],label=p) plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) plt.show() plt.close()