Django 聚合:唯一字段的平均出现次数
Django aggregation: average occurrences over unique field
我对以下聚合感到头疼。我想获取平均设备在日期 x 和 y 之间检查的不同页面的数量。
模型的伪代码:
class Statistic:
device_id = int
date = date
page_id = int
任何人都知道如何完成这个:
Statistic.objects.filter(date__gte=x,date__lte=y).???
更新:如果问题不清楚,这里有一个例子:
- 获取 table 中出现的所有唯一 device_id 值。
- 对于每个唯一 device_id 值,计算 table 中出现的唯一 page_id 值的数量。将这些值添加到列表中。
- 计算该列表的平均值。
但是这样涉及到一个循环查询,每一个新查询device_id,显然效率不是很高。我正在寻找一种在 1-2 个查询中执行此操作的方法。
如果我对你的问题的理解正确,你想获得每个设备在 x 和 y 日期之间检查的平均页数,
为此你需要找到你可以这样做的独特设备的数量:
devices= Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').distinct().count()
现在求这个范围内的对象个数:
pages = Statistic.objects.filter(date__gte=x,date__lte=y).count()
avg_pages_per_device = pages/devices
Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')
将为您提供查询集,显示设备访问过一次的页面,明确地(以独特的方式)并且只检索您想要的数据。
然后你可以使用Python来计算这个:
data = Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')
devices_set = set([d['device_id'] for d in data])
grouped = dict([(d, []) for d in devices_set])
for d in data:
for g in grouped:
if d['device_id'] == g:
grouped[g].append(d['page_id'])
然后您在 Python 字典中拥有 deviced_id
访问过的所有唯一 page_id
,您可以随心所欲。
由于您提供的模型似乎与其他模型无关,我不知道我们是否可以更好地优化 Queryset 以在数据库端进行操作,这很难。
如果我想清楚了,应该这样做:
Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').annotate(count=Count('device_id')).aggregate(avg=Avg('count'))
我对以下聚合感到头疼。我想获取平均设备在日期 x 和 y 之间检查的不同页面的数量。
模型的伪代码:
class Statistic:
device_id = int
date = date
page_id = int
任何人都知道如何完成这个:
Statistic.objects.filter(date__gte=x,date__lte=y).???
更新:如果问题不清楚,这里有一个例子:
- 获取 table 中出现的所有唯一 device_id 值。
- 对于每个唯一 device_id 值,计算 table 中出现的唯一 page_id 值的数量。将这些值添加到列表中。
- 计算该列表的平均值。
但是这样涉及到一个循环查询,每一个新查询device_id,显然效率不是很高。我正在寻找一种在 1-2 个查询中执行此操作的方法。
如果我对你的问题的理解正确,你想获得每个设备在 x 和 y 日期之间检查的平均页数,
为此你需要找到你可以这样做的独特设备的数量:
devices= Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').distinct().count()
现在求这个范围内的对象个数:
pages = Statistic.objects.filter(date__gte=x,date__lte=y).count()
avg_pages_per_device = pages/devices
Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')
将为您提供查询集,显示设备访问过一次的页面,明确地(以独特的方式)并且只检索您想要的数据。
然后你可以使用Python来计算这个:
data = Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')
devices_set = set([d['device_id'] for d in data])
grouped = dict([(d, []) for d in devices_set])
for d in data:
for g in grouped:
if d['device_id'] == g:
grouped[g].append(d['page_id'])
然后您在 Python 字典中拥有 deviced_id
访问过的所有唯一 page_id
,您可以随心所欲。
由于您提供的模型似乎与其他模型无关,我不知道我们是否可以更好地优化 Queryset 以在数据库端进行操作,这很难。
如果我想清楚了,应该这样做:
Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').annotate(count=Count('device_id')).aggregate(avg=Avg('count'))