2015-04-27 3 views
0

В моем наборе данных содержится тысячи точек, каждый с меткой времени. Я хочу запросить базу данных для всех точек, усреднить значения точек, чтобы получить набор точек, где каждая отдельная точка представляет собой средние значения для всех точек, взятых за тот же час.Совокупные группы точек данных

Например, сказать, что мои точки (в формате [time, value]) являются [5:15, 10], [5:20, 12], [5:45, 14] и [6:00, 11], я хотел бы, чтобы вычислить набор [[5:00, 12], [6:00, 11]]

Есть ли элегантный способ для достижения этой цели с Джанго querysets, или мне нужно будет выполнять множество небольших запросов, агрегирующих за каждый час, и составить окончательный список вручную?

EDIT: models.py

class Entry(models.Model): 
    temp_data = models.DecimalField(max_digits=20, decimal_places=10) 
    humidity_data = models.DecimalField(max_digits=20, decimal_places=10) 
    node = models.IntegerField() 
    timestamp = models.DateTimeField(auto_now_add=True) 

    def __str__(self): 
     return 'Node {} - Time {}'.format(self.node, self.timestamp) 

Я хотел бы сделать это агрегирование для обоих temp_data и humidity_data значения

Благодаря

+0

Я хочу знать, как вы вычислили набор '[[5:00, 12], [6:00, 11]]', и я думаю, что код модели необходим. – shellbye

+0

Добавлен код модели. Кроме того, '[[5:00, 12], [6:00, 11]]' является средним значением для всех точек данных, отмеченных с 5: 00-5: 59 (т.е. (10 + 12 + 14)/3 = 12), timestamped в начале часа (5:00) и среднее значение для всех точек с 6: 00-6: 59 (11/1) с отметкой 6:00 ... Это имеет смысл? – rfj001

+0

Все ли ваши метки времени принадлежат к тому же дню? Или вам нужно отфильтровать их также по дате? –

ответ

0

Не уверен, что это сработает, но дать ему пытаться. (это будет в конечном счете работать только на ежедневном основном например 0-24h период)

Entry.objects.filter(
    timestamp__date=datetime.date.today() 
).values('timestamp__hour').annotate(
    AVG('temp_data'), 
    AVG('humidity_data') 
) 
0

, к сожалению DB двигатель не может обеспечить эту логику, вы должны сделать это самостоятельно.

вы можете начать свою логику с помощью следующего кода:

entry_query_set = Entry.objects.all().filter_by("timestamp") 
0

решения для случая, когда все точки данных принадлежат в тот же день.

Сначала заказывайте данные по времени, чтобы получить наименьшее и наибольшее время. Затем вычислить средние значения в цикле по часам.

orderedEntries = Entry.objects.all().filter_by("timestamp") 
minHour = orderedEntries.first().hour 
maxHour = orderedEntries.last().hour 
res = set() 
for hour in range(minHour, maxHour + 1): 
    hourEntries = Entry.objects.filter(timestamp__hour = hour) 
    sum = 0 
    for entry in hourEntries: 
     sum += entry.node 
    average = sum/len(hourEntries) 
    res.add(['%s:00' % hour, average]) 

res набор будет содержать средние значения данных по часам:

set([['5:00', 12], ['6:00', 11]]) 

Если точки данных могут принадлежать разные дни, то результат должен быть рассчитан в двойном цикле: по дате (от мин до макс) и часами (от 0 до 23).

Смежные вопросы