如何解决如何识别具有重叠周期的时间序列数据中的周期?
给定具有 4 个任务类别(A、B、C、D)及其相应时间戳的时间序列数据,我的任务是确定 [(A,B,C,D)_1,(A,D)_2,...]
这将很简单(例如,哈希映射或链表),具有干净、不重叠的事件,但我的数据包含序列(按时间排序),例如 [A,A,D,D]。举个例子:
事件 | 时间 |
---|---|
任务 A | 11/1/16 3:57 |
任务 B | 11/1/16 4:19 |
任务 A | 11/1/16 7:43 |
任务 B | 11/1/16 7:43 |
任务 C | 11/1/16 7:51 |
任务 D | 11/1/16 7:51 |
任务 C | 11/1/16 8:11 |
任务 D | 11/1/16 8:13 |
任务 A | 11/3/16 3:49 |
任务 B | 16 年 11 月 3 日 4:11 |
任务 B | 11/3/16 7:34 |
任务 A | 11/3/16 7:34 |
任务 C | 11/3/16 7:43 |
任务 D | 11/3/16 7:43 |
任务 C | 11/3/16 8:03 |
任务 D | 11/3/16 8:05 |
任务 A | 11/5/16 3:41 |
任务 B | 11/5/16 4:03 |
任务 A | 11/5/16 7:26 |
任务 B | 11/5/16 7:26 |
任务 D | 11/5/16 7:35 |
任务 C | 11/5/16 7:35 |
任务 C | 11/5/16 7:54 |
任务 D | 11/5/16 7:56 |
在这种情况下,正确的答案是一旦任务 A(循环的开始)已经开始,就删除“内部”/重叠的 ABCD。这导致 3 个时期:
任务 A | 任务 B | 任务 C | 任务 D |
---|---|---|---|
11/1/16 3:57 | 11/1/16 4:19 | 11/1/16 8:11 | 11/1/16 8:13 |
11/3/16 3:49 | 16 年 11 月 3 日 4:11 | 11/3/16 8:03 | 11/3/16 8:05 |
11/5/16 3:41 | 11/5/16 4:03 | 11/5/16 7:54 | 11/5/16 7:56 |
忽略(暂时)边缘情况,例如不完整的事件序列,是否有一种有效的算法来识别周期,同时合并重叠的内部周期?
解决方法
只是@user3386109 提到的方法并跟踪事件时间戳。
将输入移动到名为 events.txt
的文件中。
file = open("events.txt","r")
result = []
partial_result = {}
max_count =0;
tasks_count = [0,0]
for event in file:
event = event.strip('\n')
split_events = event.split()
max_count = max(tasks_count)
if len(split_events)==4: #Task data
task_name = split_events[1]
time = split_events[2]+" "+split_events[3]
idx = ord(task_name)-65
curr_count = tasks_count[idx]
if (curr_count==max_count or curr_count+1 == max_count) and task_name not in partial_result:
partial_result[task_name] = time
tasks_count[idx] +=1
if len(partial_result)==4:
result.append(partial_result)
partial_result ={}
tasks_count = [0,0]
print(result)
最终结果
[{'A': '11/1/16 3:57','B': '11/1/16 4:19','C': '11/1/16 8:11','D': '11/1/16 8:13'},{'A': '11/3/16 3:49','B': '11/3/16 4:11','C': '11/3/16 8:03','D': '11/3/16 8:05'},{'A': '11/5/16 3:41','B': '11/5/16 4:03','C': '11/5/16 7:54','D': '11/5/16 7:56'}]
,
您可以使用collections.defaultdict
:
import collections,datetime,re
r,d = [],collections.defaultdict(list)
data = [['Task A','11/1/16 3:57'],['Task B','11/1/16 4:19'],['Task A','11/1/16 7:43'],['Task C','11/1/16 7:51'],['Task D','11/1/16 8:11'],'11/1/16 8:13'],'11/3/16 3:49'],'11/3/16 4:11'],'11/3/16 7:34'],'11/3/16 7:43'],'11/3/16 8:03'],'11/3/16 8:05'],'11/5/16 3:41'],'11/5/16 4:03'],'11/5/16 7:26'],'11/5/16 7:35'],'11/5/16 7:54'],'11/5/16 7:56']]
for a,b in data:
v = list(map(int,re.findall('\d+',b)))
_date = datetime.datetime(v[2],v[0],v[1],v[-2],v[-1],0)
if (k:=a.split()[-1]) == 'A' and all(j in d for j in ['A','B','C','D']):
r.append(d)
d = collections.defaultdict(list)
d[k].append(_date)
else:
d[k].append(_date)
r.append(d)
f,f1 = {'A':min,'B':min,'C':max,'D':max},lambda x:f'{x.month}/{x.day}/{x.year} {x.hour}:{str(x.minute).zfill(2)}'
result = [{a:f1(f[a](b)) for a,b in i.items()} for i in r]
输出:
[{'A': '11/1/16 3:57','D': '11/5/16 7:56'}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。