Exemplo n.º 1
0
    def _maybe_clear(self, org: population.Organism) -> population.Organism:
        if (org.date == self._end) and (0 < org.scores < self._n_test()):
            org.clear()

        if (org.date != self._end) and (0 < org.scores < self._n_test() - 1):
            org.clear()

        return org
Exemplo n.º 2
0
    def _get_margin(self, org: population.Organism) -> tuple[float, float]:
        """Используется тестирование разницы llh и ret против самого старого организма.

        Используются тесты для связанных выборок, поэтому предварительно происходит выравнивание по
        датам и отбрасывание значений не имеющих пары (возможно первое значение и хвост из старых
        значений более старого организма).
        """
        margin = np.inf

        pop = list(population.get_metrics())
        oldest = pop[0]
        if (len(pop) > 1) and (oldest["_id"] == org.id):
            oldest = pop[1]

        for metric in ("LLH", "RET"):
            median, upper, maximum = _select_worst_bound(
                targets=oldest,
                candidate={
                    "date": org.date,
                    "llh": org.llh,
                    "ir": org.ir
                },
                metric=metric,
            )

            self._logger.info(
                " ".join([
                    f"{metric} worst difference:",
                    f"median - {median:0.4f},",
                    f"upper - {upper:0.4f},",
                    f"max - {maximum:0.4f}",
                ], ), )

            valid = upper != median
            margin = min(margin, valid and (upper / (upper - median)))

        if margin == np.inf:
            margin = 0

        time_delta = _time_delta(org)

        self._logger.info(
            f"Margin - {margin:.2%}, Time excess - {time_delta:.2%}\n"
        )  # noqa: WPS221

        if margin < 0:
            org.die()
            self._logger.info("Исключен из популяции...\n")

        return margin, time_delta
Exemplo n.º 3
0
def _kill_weakest(organism: population.Organism) -> None:
    weakest = organism.find_weaker()
    print("Наиболее слабый — удаляю:")
    print(f"Побед - {weakest.wins}")
    print(weakest)
    print(f"LLH: {weakest.llh:.4f}")
    print(f"Timer: {weakest.timer / 10 ** 9:.0f}\n")
    weakest.die()
Exemplo n.º 4
0
    def _eval_organism(
            self,
            organism: population.Organism) -> Optional[tuple[float, float]]:
        """Оценка организмов.

        - Если организм уже оценен для данной даты, то он не оценивается.
        - Если организм старый, то оценивается один раз.
        - Если организм новый, то он оценивается для определенного количества дат из истории.
        """
        try:
            self._logger.info(f"{organism}\n")
        except AttributeError as err:
            organism.die()
            self._logger.error(f"Удаляю - {err}\n")

            return None

        if organism.date == self._end:
            return self._get_margin(organism)

        dates = [self._end]
        if not organism.llh:
            dates = listing.all_history_date(self._tickers, end=self._end)
            dates = dates[-_n_test(organism.scores):].tolist()

        for date in dates:
            try:
                organism.evaluate_fitness(self._tickers, date)
            except (ModelError, AttributeError) as error:
                organism.die()
                self._logger.error(f"Удаляю - {error}\n")

                return None

        return self._get_margin(organism)
Exemplo n.º 5
0
    def _eval_and_print(organism: population.Organism, tickers: Tuple[str,
                                                                      ...],
                        end: pd.Timestamp) -> Optional[float]:
        """Оценивает организм и распечатывает метрики.

        Обрабатывает ошибки оценки и возвращает None и убивает организм в случае их наличия, а если все
        нормально, то оценку качества.
        """
        print(f"Побед - {organism.wins}")
        print(organism)
        try:
            fitness = organism.evaluate_fitness(tickers, end)
        except ModelError as error:
            organism.die()
            print(f"Удаляю - {error.__class__.__name__}")
            print()
            return None
        else:
            print(f"LLH: {fitness:.4f}")
            print(f"Timer: {organism.timer / 10 ** 9:.0f}")
            print()
            return fitness