Обнаружение пробелов в Django / MySQL - PullRequest
1 голос
/ 14 февраля 2011

У меня есть данные временных рядов, хранящиеся в MySQL InnoDB, и я обращаюсь к ним с помощью объектно-реляционного картографа Django.

У меня вопрос: как мне лучше всего определить и найти пробелы в данных временных рядов?

Изменить для уточнения: хотя довольно просто получить список всех пропущенных точек данных, это не полностью решает мою проблему. Я хочу только начало и конец пробелов. Начало и конец непрерывных периодов будет работать так же хорошо.

Изменить для уточнения: столбцы mysql для таблицы ниже. время является стандартным Django DateTimeField. Данные данные отбираются каждые 15 минут.

mysql> show columns from datalogging_datapoint;
+----------------------+------------+------+-----+---------+----------------+
| Field                | Type       | Null | Key | Default | Extra          |
+----------------------+------------+------+-----+---------+----------------+
| id                   | int(11)    | NO   | PRI | NULL    | auto_increment |
| new_since_parsing    | tinyint(1) | NO   |     | NULL    |                |
| non_public           | tinyint(1) | NO   |     | NULL    |                |
| time                 | datetime   | NO   |     | NULL    |                |
| value                | double     | NO   |     | NULL    |                |
| parent_timeseries_id | int(11)    | NO   | MUL | NULL    |                |
+----------------------+------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

Вы должны дать какой-то пример данных и то, как вам нравится, как они обрабатываются. Сообщение о том, что вы храните его в MySQL или с помощью innodb, не является центральной проблемой (например, ORM это решает). Я предполагаю, что вы можете извлечь данные временных рядов в виде списка целых чисел, и вы пытаетесь найти, где пробелы начинаются / заканчиваются в этом списке.

def gaps(seq):
    seq_set = set(seq) # e.g., set([0, 1, 2, 3, 7, 8, 9, 10, 16, 17, 18])
    full_set = set(range(seq[-1]+1)) # set([0,1,2,3,..., 17, 18])
    missing_pts = list(seq_set ^ full_set) # [4, 5, 6, 11, 12, 13, 14, 15]
    missing_pts.sort() # EDIT: originally didn't have this; 
                       # should have as sets are unordered.
    missing_pt_pairs = []
    first_pt = missing_pts[0]
    prev_pt = missing_pts[0]
    for pt in missing_pts:
        if pt - prev_pt > 1:
            missing_pt_pairs.append((first_pt, prev_pt))
            first_pt = pt
        prev_pt = pt
    missing_pt_pairs.append((first_pt, pt))
    return missing_pt_pairs

time_pts = [0,1,2,3,7,8,9,10,16,17,18]
gaps(time_pts) # returns [(4,6), (11,15)], 
# indicating that two gaps are present starting from [4,6] and [11,15]
0 голосов
/ 15 февраля 2011

Спасибо за предложения, ребята!Я кое-чему научился у них обоих.

Однако, я думаю, что я просто решил свою проблему идеальным способом, перефразировав вопрос в моей голове.Вот основная идея:

Count the values in a that year with Django's .count() .
If not complete:
    Count the values for each month in that year
    If not complete:
        Count the values for each day in that month
0 голосов
/ 14 февраля 2011

Посмотрите на пакеты numpy и scipy для python - вы можете найти некоторые функции анализа временных рядов.Тогда это просто вопрос получения значений из базы данных, но это стандартный django / python.

Вы хотите что-то вроде этого:

def gaps(seq):
  ...
  return gaps_found

которое при подаче [1,2,4,5,6,8,12] возвращает [3,7,9,10,11]?Это может быть выполнимо с сетами.

...