gpt4 book ai didi

django - 计算时间段的平均汇率

转载 作者:行者123 更新时间:2023-11-29 12:33:02 30 4
gpt4 key购买 nike

<分区>

在 Django 中我有类似于这个例子的模型:

class Currency(models.Model):
name = models.CharField(max_length=3, unique=True)
full_name = models.CharField(max_length=20)


class ExchangeRate(models.Model):
currency = models.ForeignKey('Currency')
start_date = models.DateFiled()
end_date = models.DateField()
exchange_rate = models.DecimalField(max_digits=12, decimal_places=4)

让我们简化一下,假设我们只有一种货币,ExchangeRate 表如下所示:

+---------------------+-------------------+------------+------------+---------------+
| currency_from__name | currency_to__name | start_date | end_date | exchange_rate |
+---------------------+-------------------+------------+------------+---------------+
| PLN | USD | 2014-03-01 | 2014-08-01 | 3.00000 |
| PLN | USD | 2014-08-01 | 2014-12-01 | 6.00000 |
+---------------------+-------------------+------------+------------+---------------+

注意这是简化数学运算的例子!

在这个表中数据密度是每月一次,一个月的有效记录是例如 start_date = 2014.03.01end_date = 2014.04.01,所以 start_date 包含在内,end_date 不包含在内。

我想计算一段时间内的平均汇率:

[2014.06.01 ; 2012.09.01)

意思是:>= 2014.06.01< 2014.09.01

在 Django 中我写:

start_date = date(2014, 6, 1)
end_date = date(2014, 9, 1)

ExchangeRate.objects.all().filter(
(
Q(start_date__lt=start_date) &
Q(end_date__gt=start_date)
) | (
Q(start_date__gte=start_date) &
Q(start_date__lt=end_date) &
Q(end_date__gt=start_date)
)
).annotate(
currency_from_name = 'currency_from__name',
currency_to_name = 'currency_to__name'
).values( # GROUP BY
'currency_from_name',
'currency_to_name'
).aggregate(
F('currency_from_name'),
F('currency_to_name'),
Avg('exchange_rate')
)

在这个查询之后,我收到值 4.5000,从数学原因来看这是正确的,但当您需要注意时间范围时是错误的。
正确答案是 4.000

我只是想出这个解决方案来用这个公式注释额外的列,然后从这个列计算平均值:

https://www.codecogs.com/eqnedit.php?latex=\inline&space;Abs&space;\left&space;(&space;\frac{months&space;\left&space;(&space;greater(ER_{start_date}\&space;,\&space;start_date),&space;smaller(ER_{start_date}\&space;,\&space;end_date)&space;\right&space;)&space;}{months(start_date\&space;,\&space;end_date)}&space;\right&space;)&space;*&space;ER_{exchange_rate}

地点:

我正在使用 9.3 PostgreSQL DBDjango 1.8.4

也许有一个简单的功能?
也许我过于复杂了?

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com