def _multi_matchup_bullets(self, section, points, matchups): def multi_matchup_string(primary_team, opponents): opponent_string = opponent_matchup_string( self._team_points(primary_team), opponents) return (f"{self._team_string(primary_team)}" f"{';' if len(opponents) > 1 else ''} {opponent_string}") def opponent_matchup_string(primary_points, opponents): opponent_strings = [ f"over {self._team_string(opponent)}" if self._team_points(opponent) < primary_points else f"to {self._team_string(opponent)}" if self._team_points(opponent) > primary_points else f"tied with {self._team_points(opponent)}" for opponent in opponents ] if len(opponent_strings) == 1: return opponent_strings[0] elif len(opponent_strings) > 2: first_string = "; ".join(opponent_strings[:-2]) last_string = "; and ".join(opponent_strings[-2:]) return f"{first_string}; {last_string}" return ", and ".join(opponent_strings) matchup_dict = MultiDict(matchups) return [ multi_matchup_string(team, matchup_dict.getall(team)) for team in list(dict.fromkeys(matchup_dict.keys())) ]
class DivisionTableFormatter: def __init__(self, teams): self._divisions = MultiDict( (team.division, team) for team in teams.values()) def markdown(self): markdown_string = "### Division Stats\n" all_stats = self._all_division_stats() for index, entries in enumerate(list(zip(*all_stats))): columns = [ f"**{entry}**" if index == 0 else f"{entry}" for entry in entries ] markdown_string = f"{markdown_string}\n| {' | '.join(columns)} |" if index == 0: alignment = " | ".join(len(columns) * [":---:"]) markdown_string = f"{markdown_string}\n| {alignment} |" return [markdown_string] def _all_division_stats(self): stats = [ DivisionStats("Division", "Points", "Points/Team", "Std. Dev.", "Record") ] stats.extend( self._division_stats(division) for division in sorted( list(dict.fromkeys(self._divisions.keys())))) stats.append(self._division_stats("League")) return stats def _division_stats(self, division_name): teams = (self._divisions.values() if division_name == "League" else self._divisions.getall(division_name)) use_record = division_name != "League" scores = list(map(lambda team: team.total_points, teams)) wins = sum(map(lambda team: len(team.wins), teams), 0) losses = sum(map(lambda team: len(team.losses), teams), 0) ties = sum(map(lambda team: len(team.ties), teams), 0) record_string = ("" if not use_record else f"{wins}-{losses}" if ties == 0 else f"{wins}-{losses}-{ties}") return DivisionStats(division_name, sum(scores, 0), round(statistics.mean(scores), 1), round(statistics.stdev(scores), 1), record_string)
def main(): with open(cClean_no_meir_list_name, 'r', errors='replace') as cClean_no_meir_list_file: csvfile = csv.reader(cClean_no_meir_list_file) cClean_no_meir_list = [] site_names = set() site_names_and_participants = set() for row in csvfile: if len(row) == 0: continue cClean_no_meir_list.append(row[0]) site_participant, = row site_name, partipant_name = extract_site_name_and_participant( site_participant) site_names.add(site_name) site_names_and_participants.add((site_name, partipant_name)) cclean_site_names_list = list(site_names) cclean_site_names_list.sort() image_descriptions = [] #print ("cClean site names: \n", '\n'.join(cclean_site_names_list)) with open(zip_list_name, 'r', errors='replace') as zip_list: csvfile = csv.reader(zip_list) site_names = dict() with open(zip_and_cClean_no_meir_list, 'wt') as zip_ccclean_noMeir_file: csvwriter = csv.writer(zip_ccclean_noMeir_file) csvwriter.writerow(ImageDesc._fields) for row in csvfile: site_participant, filename = row separator = site_participant.rfind('_') site = site_participant[:separator] filename = filename.replace('\\', '/') filename_base = filename[:-4] # cut off '.jpg' parts = filename_base.split('/') alt_site_name, participant, event, img_index = parts[-4:] if site == "SingTel": alt_site_name = "SingTel" if site == "KippsBay": alt_site_name = "KBCBMSVR1" if site == "SeaView": alt_site_name = "SVS1-HZ-ISR" match = extension_regex.search(filename) if match is None: raise Exception('Not an archive') zip_file = filename[:match.end() - 1] path_in_zip = filename[match.end():] desc = ImageDesc(site, alt_site_name, participant, event, img_index, zip_file, path_in_zip) site_names[site] = alt_site_name site_names[alt_site_name] = site if (site, participant) in site_names_and_participants or ( alt_site_name, participant) in site_names_and_participants: image_descriptions.append(desc) csvwriter.writerow(desc) participant_to_images = MultiDict() for desc in image_descriptions: participant_to_images.add(str((desc.site, desc.participant)), desc) chosen_site_to_participant = MultiDict() selected_image_descriptions = [] for participant in set(participant_to_images.keys()): images = participant_to_images.getall(participant) if len(images) > MIN_NUM_IMAGES and len(images) <= MAX_NUM_IMAGES: # selected_image_descriptions += images chosen_site_to_participant.add(images[0].site, images[0].participant) num_chosen_participants_per_site = dict() for site in set(chosen_site_to_participant.keys()): num_chosen_participants_per_site[site] = len( chosen_site_to_participant.getall(site)) print(site, num_chosen_participants_per_site[site]) total_num_chosen_participants = sum( num_chosen_participants_per_site.values()) print(total_num_chosen_participants, 'total') for site, num_part in num_chosen_participants_per_site.items(): ratio = num_part / total_num_chosen_participants num_participants_to_select = round(ratio * NUM_CHOSEN_PARTICIPANTS) print(site, num_part, ratio, num_participants_to_select) if num_participants_to_select == 0: continue participants = chosen_site_to_participant.getall(site) participants = participants[:num_participants_to_select] for participant in participants: images = participant_to_images.getall(str((site, participant))) per_event = MultiDict() for img in images: per_event.add(img.event, img) num_events = len(set(per_event.keys())) images_per_event = ceil(MIN_NUM_IMAGES / num_events) selected_images_for_this_participant = [] for event in set(per_event.keys()): images_for_this_event = per_event.getall(event) selected_images_for_this_participant += images_for_this_event[: images_per_event] if len(selected_images_for_this_participant) >= MIN_NUM_IMAGES: selected_images_for_this_participant = selected_images_for_this_participant[: MIN_NUM_IMAGES] else: selected_images_set = set(selected_images_for_this_participant) for img in images: selected_images_set.add(img) if len(selected_images_set) == MIN_NUM_IMAGES: break selected_images_for_this_participant = list( selected_images_set) selected_image_descriptions += selected_images_for_this_participant outfile = open( r'C:\Users\leahb\Documents\Leah\MyDataSets\FileSelection\selected_images_for_unknown.csv', 'wt', encoding='ascii') csv_out = csv.writer(outfile) csv_out.writerow(ImageDesc._fields) for rec in selected_image_descriptions: csv_out.writerow(rec)