社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

Django分组并按权重聚合

Saturnix • 4 年前 • 762 次点击  

我有一个这样的表,我使用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
 
762 次点击  
文章 [ 1 ]  |  最新文章 4 年前
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)
    ))