detecção de hiato no Django / MySQL

votos
1

Eu tenho TimeSeries dados armazenados em MySQL InnoDB e eu acessá-lo usando mapeador objeto relacional do Django.

A minha pergunta é: como posso melhor identificar e localizar falhas nestes dados TimeSeries?

Editar de esclarecimento: embora seja bastante fácil de obter uma lista de todos os pontos de dados em falta, que não resolve completamente o meu problema. Quero apenas o início eo fim de lacunas. O início eo fim de períodos contínuos iria funcionar tão bem.

Editar para esclarecimento adicional: As colunas mysql para a tabela são abaixo. tempo é um padrão de Django DateTimeField. Os dados em questão são amostrados uma vez a cada 15 minutos.

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)
Publicado 14/02/2011 em 18:33
fonte usuário
Em outras línguas...                            


3 respostas

votos
0

Olhar para os pacotes de numpy e SciPy para python - que você pode encontrar algumas funções de análise de séries temporais. Então é só uma questão de obter os valores do banco de dados, mas isso é normal django / python.

Você quer algo como isso:

def gaps(seq):
  ...
  return gaps_found

que, quando administradas [1,2,4,5,6,8,12] retornos [3,7,9,10,11]? Isso poderia ser factível com sets.

Respondeu 14/02/2011 em 18:43
fonte usuário

votos
1

Você tem que dar algum tipo de dados de exemplo e como você gosta processado. Nos dizendo que você está armazenando-o em MySQL ou com innodb não é central para o problema (por exemplo, o ORM lida com isso). Eu suponho que você é capaz de extrair os dados de séries temporais como uma lista de números inteiros, e você está tentando descobrir onde lacunas início / fim da lista.

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]
Respondeu 14/02/2011 em 19:46
fonte usuário

votos
0

Obrigado pelas sugestões guys! Eu aprendi algo de ambos.

No entanto, eu acho que só resolveu o meu problema de uma forma ideal de reformular a questão em minha mente. Aqui está a idéia básica:

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
Respondeu 14/02/2011 em 23:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more