Python社区  »  Django

Django分组并按权重聚合

Saturnix • 1 周前 • 12 次点击  

我有一个这样的表,我使用Django ORM与之交互。

date                car_crashes         city
01.01               1                   Washington
01.02               4                   Washington
01.03               0                   Washington
01.04               2                   Washington
01.05               0                   Washington
01.06               3                   Washington
01.07               4                   Washington
01.08               1                   Washington
01.01               0                   Detroit
01.02               2                   Detroit
01.03               4                   Detroit
01.04               2                   Detroit
01.05               0                   Detroit
01.06               3                   Detroit
01.07               1                   Detroit

我想知道全国每天发生多少起车祸,我可以这样做:

Model.values("date") \
.annotate(car_crashes=Sum('car_crashes')) \
.values("date", "car_crashes")

date  car_crashes
1.01            1
1.02            6
1.03            4
1.04            4
1.05            0
1.06            6
1.07            5
1.08            1

现在,假设我有一个这样的数组:

weights = [
    {
        "city": "Washington",
        "weight": 1,
    },
    {
        "city": "Detroit",
        "weight": 2,
    }
]

这意味着底特律的车祸应该乘以2再与华盛顿的相合。

我的解决方案是分别聚合所有不同的权重,用Pandas或SQL乘以权重,然后进行聚合。这将是低效和缓慢的(很多查询充其量,使用熊猫充其量)。

可以用一个ORM查询还是一个SQL查询来实现?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50703
 
12 次点击  
分享到微博
文章 [ 1 ]  |  最新文章 1 周前
Tsang-Yi Shen
Reply   •   1 楼
Tsang-Yi Shen    4 月前

一种方法是 Conditional Expressions 要确定查询中的权重值,这意味着您可以首先构造 Case 表达式:

from django.db.models import IntegerField

when_list = [When(city=w['city'], then=w['weight']) for w in weights]
case_params = {'default': 1, 'output_field': IntegerField()}

Model.objects.values('date') \
    .annotate(
        weighted_car_crashes=Sum(
            F('car_crashes') * Case(*when_list, **case_params)
    ))