Files @ d908ea134adb
Branch filter:

Location: Rank-Progress/rank_progress.py - annotation

Laman
a RankTracker class
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
3d0ab62fd174
3d0ab62fd174
2156c5a17dfe
2156c5a17dfe
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
2156c5a17dfe
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
3d0ab62fd174
2156c5a17dfe
2156c5a17dfe
3d0ab62fd174
3d0ab62fd174
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
ddeb551e1404
2156c5a17dfe
2156c5a17dfe
2156c5a17dfe
2156c5a17dfe
2156c5a17dfe
2156c5a17dfe
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
ddeb551e1404
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
ddeb551e1404
d908ea134adb
d908ea134adb
ddeb551e1404
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
ddeb551e1404
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
ddeb551e1404
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
dfc18f1d128e
d908ea134adb
d908ea134adb
ddeb551e1404
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
import re
from itertools import groupby
from datetime import datetime
import argparse


class Record:
	def __init__(self, tokens, source):
		self.source = source

		self.pin = int(tokens[0])
		self.country_code = tokens[2]
		self.rating_before = int(tokens[8])
		self.rounded_before = round_rating(self.rating_before)
		self.rating_after = int(tokens[9])
		self.rounded_after = round_rating(self.rating_after)

		tournament_code = tokens[5]
		self.date = datetime.strptime(tournament_code[1:7], "%y%m%d")

		self.rank_change = (rating_to_rank(self.rating_before), rating_to_rank(self.rating_after))

	@classmethod
	def parse(cls, line):
		tokens = re.split(r" {2,}", line.strip())

		if len(tokens) != 10:
			return None

		return cls(tokens, line)

	def __str__(self):
		s = self.source + "  {} -> {}".format(*self.rank_change)
		return s


class RankTracker:
	def __init__(self, rating):
		self._rounded_rating = round_rating(rating)

	@property
	def rank(self):
		return rating_to_rank(self._rounded_rating)

	def update(self, rating):
		rounded_rating = round_rating(rating)

		if rounded_rating == self._rounded_rating:
			return False
		elif rounded_rating > self._rounded_rating:  # promotion
			self._rounded_rating = rounded_rating
			return self.rank
		else:  # demotion
			if rounded_rating >= 1500 and self._rounded_rating - rating > 100:
				self._rounded_rating = rounded_rating
				return self.rank
			elif self._rounded_rating - rating > 150:
				self._rounded_rating = rounded_rating+100
				return self.rank
			else:
				return False


def parse_record(record):
	types = [int, str, str, str, str, str, int, int, int, int]
	columns = [f(token) for (f, token) in zip(types, record)] + [datetime.strptime(record[5][1:7], "%y%m%d")]
	return tuple(columns)


def round_rating(r):
	return (r+50)//100*100


def rating_to_rank(rating):
	rank_list = [str(i)+"k" for i in range(30, 0, -1)] + [str(i)+"d" for i in range(1, 8)]
	key = round_rating(rating)//100
	return rank_list[min(key+9, 36)]


if __name__ == "__main__":
	parser = argparse.ArgumentParser()
	parser.add_argument("since", help="a date in YYYYMMDD format")
	parser.add_argument("to", nargs="?", help="a date in YYYYMMDD format")
	parser.add_argument("-c", "--country-code", default="CZ", help="a two letter country code, default=CZ")

	args = parser.parse_args()
	
	since = datetime.strptime(args.since, "%Y%m%d")
	to = datetime.strptime(args.to, "%Y%m%d") if args.to else datetime.now()

	with open("/tmp/all.hst") as f:
		s = f.read()

	records = [Record.parse(line) for line in s.splitlines()]
	records = filter(lambda rec: rec is not None, records)
	national_records = filter(lambda rec: rec.country_code == args.country_code, records)
	player_records = groupby(national_records, lambda rec: rec.pin)

	for (pin, recs) in player_records:
		tourneys = list(recs)
		rounded_rating = tourneys[0].rounded_before

		steps = []

		for r in tourneys:
			# omit reset ratings
			if rounded_rating != r.rounded_before:
				rounded_rating = r.rounded_before

			if r.rating_after-rounded_rating >= 50 or \
					(rounded_rating-r.rating_after > 100 and rounded_rating >= 1600):
				steps.append(r)
				rounded_rating = r.rounded_after
			elif rounded_rating-r.rating_after > 150:

				steps.append(r)
				rounded_rating = r.rounded_after + 100

		steps = [r for r in steps if since <= r.date <= to]
		if steps:
			print("\n".join(map(str, steps)))
			print()