def add_element(self, elt_match): number, name, info, base_value, bonus, goe, goes, extra, points = elt_match.groups( ) number = int(number) base_value = float_of(base_value) bonus = bonus != '' goe = float_of(goe) # Split out individual judges' GOEs goe_re = re.compile('(-?\d|-)') goe_match = goe_re.findall(goes) if not goe_match: raise Exception(goes) if self._is_zeroed_element(base_value): goes = [0.00 for _ in xrange(len(goe_match))] parsed_goes = goes else: goes, parsed_goes = self._parse_goes(goe_match) if not self.pre10 and extra and self._is_first_elt_of_segment(): self.mistakes.append('Extra Judges: ' + extra) points = float_of(points) self.elements.append( Element(number, name, info, base_value, bonus, goe, goes, parsed_goes, points))
def __init__(self, url, season, event, discipline, segment, skater, rank, starting_number, total_score, tes, pcs, deductions): self.url = url self.season = season self.event = event self.discipline = discipline self.segment = segment self.skater = skater self.rank = int(rank) try: self.starting_number = int(starting_number) except: self.starting_number = 0 self.tes = float_of(tes) self.pcs = float_of(pcs) self.total_deductions = float_of(deductions) self.total_score = float_of(total_score) self.base_value = 0.00 self.elements = [] self.components = [] self.deductions = {} self.extra_judges = 0 self.mistakes = [] self.pre10 = int(self.season.champ_year) <= 2010
def add_component(self, component_match): name, factor, scores, points = component_match.groups() factor = float_of(factor) comp_mark_re = re.compile('(\d?\d.\d\d|-)\s*') comp_match = comp_mark_re.findall(scores) if not comp_match: raise Exception(scores) scores, parsed_scores = self._parse_components(comp_match) points = float_of(points) self.components.append( ProgramComponent(name.strip(), factor, scores, parsed_scores, points))
def add_deduction(self, deductions): for deduction in deductions: if ':' in deduction: reason, value = deduction.split(':') else: reason, value = deduction.split() fall_re = re.compile('(-\d.\d\d)\s*(\(\d\))') if fall_re.match(value): value, num_falls = fall_re.match(value).groups() reason += num_falls value = float_of(value) if value > 0.: # Sometimes deductions are captured as positive. value = -value # Ignore deductions of zero value. if not self._is_close(0.00, value): self.deductions[reason.strip()] = value
def _parse_components(self, comp_match): """When a judge is removed, the component mark becomes 0.00 or -.""" scores = [] parsed_scores = [] extra_judges = 0 for score_str in comp_match: try: score = float_of(score_str) if self._is_close(0.00, score): extra_judges += 1 scores.append('-') else: scores.append(score) parsed_scores.append(score) except: extra_judges += 1 scores.append('-') self._check(self.extra_judges, extra_judges, 'pcs extra judges = tes extra judges') return scores, parsed_scores
def aggregate_pcs(self, pcs): self._check(float_of(pcs), self.pcs, 'two summary pcs match') self._check_pcs()
def read_from_csv(self): if not os.path.isdir(self.directory): self.write_to_csv() return for fname in os.listdir(self.directory): with open(self.directory + '/' + fname) as csvfile: reader = csv.reader(csvfile) num_judges = int(reader.next()[0]) reader.next() # Skip labels row rank, name, nation, starting_number, total_score, tes, pcs, total_deductions = reader.next( ) skater = Skater(name.strip(), nation, self.discipline) scorecard = Scorecard(self.url, self.season, self.event, self.discipline, self, skater, rank, starting_number, total_score, tes, pcs, total_deductions) reader.next() # Skip elements label row elt_row = reader.next() while elt_row[0].isdigit(): number = int(elt_row[0]) name = elt_row[1] info = elt_row[2] base_value = float_of(elt_row[3]) if elt_row[4].lower() == 'true': bonus = True elif elt_row[4].lower() == 'false': bonus = False else: print skater, number, self, elt_row[4] goe = float_of(elt_row[5]) goes = [] parsed_goes = [] for mark in elt_row[6:6 + self.num_judges]: if mark == '-': goes.append(mark) else: goes.append(float_of(mark)) parsed_goes.append(float_of(mark)) points = float_of(elt_row[-1]) scorecard.elements.append( Element(number, name, info, base_value, bonus, goe, goes, parsed_goes, points)) elt_row = reader.next() scorecard.base_value = float_of(elt_row[3]) scorecard.tes = float_of(elt_row[-1]) reader.next() # Skip PCS label row comp_row = reader.next() while comp_row[1]: name = comp_row[1] factor = float_of(comp_row[5]) scores = [] parsed_scores = [] for score in comp_row[6:6 + self.num_judges]: if score == '-': scores.append(score) else: scores.append(float_of(score)) parsed_scores.append(float_of(score)) points = float_of(comp_row[-1]) scorecard.components.append( ProgramComponent(name.strip(), factor, scores, parsed_scores, points)) comp_row = reader.next() scorecard.pcs = float_of(comp_row[-1]) for deduction_row in reader: _, reason, value = deduction_row scorecard.deductions[reason] = float_of(value) self.scorecards.append(scorecard) self.scorecards.sort(key=lambda scorecard: scorecard.rank)