Усреднить результаты от функции по многим объектам - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь рассчитать статистику по сделкам в моей модели. Эта статистика в основном получена с использованием функций внутри моей торговой модели. Я перечислил все статистические данные, которые до сих пор работали, и сейчас я застрял в вычислении среднего значения "выигрыша" и процентов.

Спасибо за помощь SOF сообществу!

views.py

class StatsView(LoginRequiredMixin, TemplateView):
    template_name = 'dashboard/stats.html'

    def get_context_data(self, *args, **kwargs):
        trade = Trade.objects.filter(user=self.request.user, status='cl')
        context = super(StatsView, self).get_context_data(*args, **kwargs)

        #ALL WORKING STATS
        context['all_trades'] = Trade.objects.filter(user=self.request.user).count()
        context['gross_profit'] = sum([t.get_profit_loss_value() for t in trade])
        context['net_profit'] = sum([t.get_profit_loss_value_fees() for t in trade])
        context['win_trades_profit'] = sum(t.get_profit_loss_value_fees() for t in trade if t.get_trade_result() == 'win')
        context['loss_trades_profit'] = sum(t.get_profit_loss_value_fees() for t in trade if t.get_trade_result() == 'loss')
        context['win_trades_count'] = sum(t.get_trade_result() == 'win' for t in trade)
        #context['win_trades_count'] = [t.get_trade_result() for t in trade].count('win') ALSO WORKS
        context['loss_trades_count'] = sum(t.get_trade_result() == 'loss' for t in trade)
        context['scratch_trades_count'] = sum(t.get_trade_result() == 'scratch' for t in trade)
        context['total_fees'] = sum([t.get_fees() for t in trade])

        #NOT WORKING YET
        #Calculate Avg Profit For All Winning Trades

        #Result: Avg(Value(<generator object StatsView.get_context_data.<locals>.<genexpr> at 0x000002C98818F3C8>))

        #context['avg_win'] = Avg(t.get_profit_loss_value_fees() for t in trade if t.get_trade_result() == 'win')

models.py

class Trade(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='cl')
    ...

    # profit_loss_value_fees = profit_loss_value - fees
    def get_profit_loss_value_fees(self):
        result = self.get_profit_loss_value() - self.get_fees()
        return result

class Entry(models.Model):
    trade = models.ForeignKey(Trade, on_delete=models.CASCADE)
    price/fee/amount/entry_type/etc...

Little дополнительный бонусный вопрос, на случай, если у кого-то есть какие-то идеи, так как я тоже застрял в этой части.

Мне нужно начать фильтровать статистику после этого. Как вы, ребята, порекомендовали бы включить в эту статистику очень динамичную c систему фильтрации? Все с того времени, к какому портфелю относятся сделки.


Ответьте на исходную задачу. Это было очень просто ..

context['avg_win'] = mean(t.get_profit_loss_value_fees() for t in trade if t.get_trade_result() == 'win')

Все равно оценил бы идеи по фильтрации!

1 Ответ

1 голос
/ 21 марта 2020

Полагаю, t.get_profit_loss_value_fees() == 'win' for t in trade возвращает итерацию, подобную [True, True, False, ...], в зависимости от того, t.get_profit_loss_value_fees() == 'win'.

. Если это так, вы можете сделать следующее:

def get_context_data(self, *args, **kwargs):

    # ...

    plvf = [t.get_profit_loss_value_fees() == 'win' for t in trade]
    context['avg_win'] = plvf.count(True)/len(plvf)

    # or more simply (importing statistics)
    context['avg_win'] = statistics.mean([t.get_profit_loss_value_fees() == 'win' for t in trade])
...