|
| 1 | +from functools import cmp_to_key |
| 2 | +from surebet.handling.surebets import * |
| 3 | + |
| 4 | +MIN_PROFIT = 2.5 |
| 5 | +MAX_PROFIT = 10 |
| 6 | + |
| 7 | +MIN_LIFETIME = 10 |
| 8 | + |
| 9 | + |
| 10 | +class DetailedSurebet: |
| 11 | + """ |
| 12 | + Contain all information about surebet: bookmakers between which surebet is occurred, |
| 13 | + teams for first and second event, part of event and wagers, profit, lifetime of surebet |
| 14 | + """ |
| 15 | + |
| 16 | + def __init__(self, books: BookSurebets, sport: str, events: EventSurebets, part: PartSurebets, |
| 17 | + surebet: TimedSurebet): |
| 18 | + """ |
| 19 | + :param books: bookmakers between which surebet is occurred |
| 20 | + :param sport: name of sport |
| 21 | + :param events: events between which surebet is occurred |
| 22 | + :param part: common part of events |
| 23 | + """ |
| 24 | + self.book1, self.book2 = books.book1, books.book2 |
| 25 | + self.sport = sport |
| 26 | + self.teams1, self.teams2 = events.teams1, events.teams2 |
| 27 | + self.part = part.part |
| 28 | + self.w1, self.w2 = surebet.w1, surebet.w2 |
| 29 | + self.profit = surebet.profit |
| 30 | + self.lifetime = surebet.get_lifetime() |
| 31 | + |
| 32 | + def __str__(self): |
| 33 | + teams_sep = " vs " |
| 34 | + event_name1 = teams_sep.join(self.teams1) |
| 35 | + event_name2 = teams_sep.join(self.teams2) |
| 36 | + |
| 37 | + common_pattern = "{sport:<6} | {book:<6} | {ev_name:<60} | part #{part} | {wager}" |
| 38 | + |
| 39 | + str_form = "profit: {profit:<8} | ".format(profit=self.profit) + common_pattern.format( |
| 40 | + sport=self.sport, book=self.book1, ev_name=event_name1, part=self.part, wager=self.w1) + "\n" |
| 41 | + str_form += "lifetime: {time:<6} | ".format(time=self.lifetime) + common_pattern.format( |
| 42 | + sport=self.sport, book=self.book2, ev_name=event_name2, part=self.part, wager=self.w2) |
| 43 | + return str_form |
| 44 | + |
| 45 | + |
| 46 | +def convert_to_detailed(surebets: Surebets) -> list: |
| 47 | + """Convert surebets to list of DetailedSurebet, filter that list and sort""" |
| 48 | + detailed_surebets = _convert_to_detailed(surebets) |
| 49 | + |
| 50 | + detailed_surebets = _filter(detailed_surebets) |
| 51 | + |
| 52 | + _sort_detailed(detailed_surebets) |
| 53 | + |
| 54 | + return detailed_surebets |
| 55 | + |
| 56 | + |
| 57 | +def _filter(detailed_surebets) -> list: |
| 58 | + """Filter detailed_surebets by profit's lower and upper limits and by lifetime's lower limit""" |
| 59 | + |
| 60 | + def predicate(item): |
| 61 | + return MIN_PROFIT <= item.profit <= MAX_PROFIT and item.lifetime >= MIN_LIFETIME |
| 62 | + |
| 63 | + return list(filter(predicate, detailed_surebets)) |
| 64 | + |
| 65 | + |
| 66 | +def _convert_to_detailed(surebets: Surebets) -> list: |
| 67 | + """Construct objects of class DetailedSurebet and put them in list detailed_surebets""" |
| 68 | + detailed_surebets = [] |
| 69 | + for book in surebets.books_surebets: |
| 70 | + for sport_name, sport in book.attrs_dict().items(): |
| 71 | + for event in sport: |
| 72 | + for part in event.parts: |
| 73 | + for surebet in part.surebets: |
| 74 | + detailed_surebets.append(DetailedSurebet(book, sport_name, event, part, surebet)) |
| 75 | + return detailed_surebets |
| 76 | + |
| 77 | + |
| 78 | +def _sort_detailed(detailed_surebets): |
| 79 | + detailed_surebets.sort(key=cmp_to_key(_detailed_cmp), reverse=True) |
| 80 | + |
| 81 | + |
| 82 | +def _detailed_cmp(first: DetailedSurebet, second: DetailedSurebet): |
| 83 | + """Custom comparator to sort detailed_surebets firstly by profit casted to int and secondly by lifetime""" |
| 84 | + first_profit, second_profit = int(first.profit), int(second.profit) |
| 85 | + if first_profit != second_profit: |
| 86 | + return first_profit - second_profit |
| 87 | + else: |
| 88 | + return first.lifetime - second.lifetime |
0 commit comments