Получение данных для круговой диаграммы - PullRequest
0 голосов
/ 01 июня 2011

Скажем, у меня есть модель, которая определяет автомобиль, и одна из областей - «производитель».Например:

class Car(models.Model):
    manufacturer = models.CharField(max_length=50)
    color = models.CharField(max_length=50)
    licence_plate = models.CharField(max_length=50)
    .
    .
    .

Чтобы нарисовать круговую диаграмму, показывающую итоги по различным производителям (используя matplotlib), мне нужно два списка.Один содержит производителя, а другой - соответствующие названия производителей.Поэтому я бы хотел закончить чем-то вроде этого.

[516, 122, 131, 125, ...
['Ford','BMW','Mazda','Honda', ...

Кстати, я заранее не знаю названий производителей.

Еще одна вещь, я только хочупоказать топ-5 производителей.Все остальные должны быть объединены в производителя с именем «Другое».

Как я могу получить эти списки?

Ответы [ 2 ]

0 голосов
/ 01 июня 2011

Вот чистое решение на python (вы имеете дело с django). Я сделал несколько автомобильных объектов для проверки кода.

from random import choice
from collections import defaultdict
from operator import itemgetter

manufacturers = ["Ford", "BMW", "Mazda", "Honda", "Volvo", "Saab", "Toyota"]
cars = [type("Car", (object,), {"manufacturer": choice(manufacturers)})
    for x in range(1000)]

count = defaultdict(int)
for car in cars:
    count[car.manufacturer] += 1

top = sorted(count.items(), key=itemgetter(1), reverse=True)
other = sum(x[1] for x in top[5:])
list1 = [x[0] for x in top[:5]] + ["other"]
list2 = [x[1] for x in top[:5]] + [other]

print list1
print list2
0 голосов
/ 01 июня 2011

Не уверен, что это совершенно правильно, но вам нужно что-то вроде:

from django.db.models import Count, Sum

num_taken = 5  # modify this if you want more/less than 5
query = Car.objects.values('manufacturer').annotate(num_cars=Count('manufacturer')).order_by('-num_cars')
top_cars = query[:num_taken]
others = query[num_taken:].aggregate(total=Sum('num_cars'))['total']
car_nums = [entry['num_cars'] for entry in top_cars] + [others]
car_manufactureres = [entry['manufacturerer'] for entry in top_cars] + ['Others']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...