如何使用 python 在列中查找常见序列模式?
How to find common sequence pattern in a column using python?
我有一个大型数据集,如下所示:
时间戳 事件
2020-03-04 01:20:39 A
2020-03-04 01:21:22 B
2020-03-04 01:21:55 C
2020-03-04 01:22:31 A
2020-03-04 01:23:19 B
2020-03-04 01:24:39 D
.
.
.
.
.
.
.
.
2020-03-10 11:34:54 C
2020-03-10 11:35:22 A
2020-03-04 11:35:55 B
2020-03-04 11:36:01 D
我想找出事件发生中是否存在某种规律。例如,在第 1 行的事件 A 之后,第 2 行发生了 B。{A, B} 是在第 4 行和第 5 行重复的模式。我想知道是否还有更多这样的模式及其频率。我对最大长度为 4 的序列感兴趣(示例:C、A、B、D)。
如果你能向我建议 python 中的任何 algorithm/implementation 来做这件事,那将非常有帮助。
谢谢!
您是否尝试过 PM4Py python 库?您需要按照说明 here 将数据转换为事件日志,它会自动提取序列。
您可以将其视为字符串,您的问题将变成查找字符串中所有可能子字符串的出现。
您可以试试下面的脚本。就是找出所有长度为4的子串的出现。
from collection import defautdict
lstring = ''.join(df['event'].values) #convert to string
sublength = 4
substring_dict= defaultdict(int)
for i in range(len(lstring)-sublength + 1):
substring = lstring[i:i+sublength ]
substring_dict[substring] += 1
一种解决方案是将 event
列连接成一个字符串,然后计算所有模式。
from collections import Counter
line = ''.join(df['event'].values)
all_patterns = Counter()
for n in range(2, 6): # pattern sizes [2, 3, 4, 5]
all_patterns += Counter([line[i:i+n] for i in range(0, len(line)-n+1)])
print (all_patterns.most_common(10)) # Top 10 most common patterns
# [('AB', 3), ('CA', 2), ('BD', 2), ('CAB', 2), ('ABD', 2), ('CABD', 2), ('BC', 1), ('DC', 1), ('ABC', 1), ('BCA', 1)]
我有一个大型数据集,如下所示:
时间戳 事件
2020-03-04 01:20:39 A
2020-03-04 01:21:22 B
2020-03-04 01:21:55 C
2020-03-04 01:22:31 A
2020-03-04 01:23:19 B
2020-03-04 01:24:39 D
.
.
.
.
.
.
.
.
2020-03-10 11:34:54 C
2020-03-10 11:35:22 A
2020-03-04 11:35:55 B
2020-03-04 11:36:01 D
我想找出事件发生中是否存在某种规律。例如,在第 1 行的事件 A 之后,第 2 行发生了 B。{A, B} 是在第 4 行和第 5 行重复的模式。我想知道是否还有更多这样的模式及其频率。我对最大长度为 4 的序列感兴趣(示例:C、A、B、D)。
如果你能向我建议 python 中的任何 algorithm/implementation 来做这件事,那将非常有帮助。
谢谢!
您是否尝试过 PM4Py python 库?您需要按照说明 here 将数据转换为事件日志,它会自动提取序列。
您可以将其视为字符串,您的问题将变成查找字符串中所有可能子字符串的出现。
您可以试试下面的脚本。就是找出所有长度为4的子串的出现。
from collection import defautdict
lstring = ''.join(df['event'].values) #convert to string
sublength = 4
substring_dict= defaultdict(int)
for i in range(len(lstring)-sublength + 1):
substring = lstring[i:i+sublength ]
substring_dict[substring] += 1
一种解决方案是将 event
列连接成一个字符串,然后计算所有模式。
from collections import Counter
line = ''.join(df['event'].values)
all_patterns = Counter()
for n in range(2, 6): # pattern sizes [2, 3, 4, 5]
all_patterns += Counter([line[i:i+n] for i in range(0, len(line)-n+1)])
print (all_patterns.most_common(10)) # Top 10 most common patterns
# [('AB', 3), ('CA', 2), ('BD', 2), ('CAB', 2), ('ABD', 2), ('CABD', 2), ('BC', 1), ('DC', 1), ('ABC', 1), ('BCA', 1)]