2010-03-28 4 views
3

Это, без сомнения, еще один вопрос noobish, но я все равно спрошу его:Подсчет событий, сгруппированных по дате в python?

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

Приложение работает под управлением приложения Google и использует python.

Каков наилучший способ создания нового набора данных с указанием даты и соответствующих подсчетов (в том числе, если в эту дату не было событий), которые я могу использовать для передачи этой информации в шаблон django?

набор данных для этого примера выглядит следующим образом:

class Event(db.Model): 
    event_name = db.StringProperty() 
    doe = db.DateTimeProperty() 
    dlu = db.DateTimeProperty() 
    user = db.UserProperty() 

В идеале, я хочу что-то с датой и рассчитывать на эту дату.

Спасибо, и, пожалуйста, дайте мне знать, если что-то еще нужно, чтобы ответить на этот вопрос!

ответ

1

Вам понадобится выполнить биннинг в памяти (т. Е. После извлечения данных).

Способ datetime будет облегчать процесс сортировки; он отбивает элемент времени. Затем вы можете использовать словарь для хранения бункеров:

bins = {} 
for event in Event.all().fetch(1000): 
    bins.setdefault(event.doe.date(), []).append(event) 

Тогда делать то, что вы хотите с (например, счет) закромах. Для прямого подсчета:

counts = collections.defaultdict(int) 
for event in Event.all().fetch(1000): 
    counts[event.doe.date()] += 1 
+0

Извините, можете ли вы немного разработать или, возможно, включить ссылку на учебник о «биннинге»? Как получить счет для 01/01/2010 из «counts»? – Sologoub

+0

Ummmm ... вы спрашиваете, как получить значение из словаря? Что-то вроде этого: 'key = datetime.date (2010, 1, 1); the_answer = counts [key] '... кстати, ответ @ kostmo неполный; так как вы хотите, в конечном счете, таблицу, которая включает нулевые подсчеты, вам нужно перебирать весь диапазон дат до или после подсчета. –

+0

@John Machin: На самом деле, во втором фрагменте (прямое подсчет), defaultdict автоматически возвращает «0» для любого ключа, который не был явно установлен. – kostmo

0

Я не вижу, как это возможно с помощью одного запроса, поскольку GQL не имеет поддержки GROUP BY или aggregation в целом.

+0

Это не может быть сделано в GQL, но я надеюсь, что кто-то может мне помочь сделать это в памяти – Sologoub

0

Для того, чтобы свести к минимуму объем работы, что вы делаете, вы, вероятно, хотите, чтобы написать задачу, которая суммирует итоги за день один раз, так что вы можете использовать их. Я бы предложил использовать bulkupdate library для запуска задачи один раз в день, которая подсчитывает события за предыдущий день, и создает экземпляр новой модели с именем ключа на основе даты, содержащей счет. Затем вы можете получить все необходимые точки данных, выполнив запрос (или, лучше, пакетный get) для набора суммарных объектов, которые вам нужны.

+0

Спасибо, Ник. Одна из проблем заключается в том, что я собираю базовую систему отчетов с несколькими фильтрами. Я думал о создании таблиц агрегации (вроде хранилища данных?), Но это будет на более позднем этапе. Кроме того, движок google-приложений предлагает достойный интерфейс cronjob, поэтому запуск ночных агрегатов не должен быть сложным. – Sologoub

+0

Имейте в виду, что только cronjobs не сокращают его для ночных агрегаций, если количество записей для агрегата становится слишком высоким - следовательно, мое предложение библиотеки bulkupdate. –

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