我有时间序列数据存储在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)
答案 0 :(得分:1)
您必须提供某种样本数据以及您希望如何处理这些数据。告诉我们你将它存储在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]
答案 1 :(得分:0)
查看python的numpy和scipy包 - 你可能会发现一些时间序列分析函数。然后它只是从数据库中获取值,但那是标准的django / python。
你想要这样的东西:
def gaps(seq):
...
return gaps_found
当喂[1,2,4,5,6,8,12]时返回[3,7,9,10,11]?这对套装来说可能是可行的。
答案 2 :(得分:0)
感谢你们的建议!我从他们两个人那里学到了一些东西。
然而,我认为我只是通过在脑海中重述这个问题以理想的方式解决了我的问题。这是基本的想法:
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