计算日志中组合的使用次数

时间:2019-03-18 12:26:48

标签: python-3.x

我有以下形式的事件日志:

A B C D
A B C D
A B C D
A B C D
D E F G
D E F G
D E F G
D E F G
D E F G
D E F G
D E F G
A D E F G
D E F G
A D E G

例如,我试图计算A -> B的次数。 使用下面的代码,我可以计算出每条走线的频率。

from collections import Counter
flog = []
input_file ="test.txt"

with open(input_file, "r") as f:
                for line in f.readlines():
                    line = line.split()
                    flog.append(line)
                trace_frequency= map(tuple,flog)
flog=list(Counter(trace_frequency).items())

那给了我:

(('A', 'B', 'C', 'D'), 4)
(('D', 'E', 'F', 'G'), 8)
(('A', 'D', 'E', 'F', 'G'), 1)
(('A', 'D', 'E', 'G'), 1)

所以我的问题是如何从上述格式转换为将日志的所有实例计算为波纹管格式的格式:

    A B 4
    B C 4
    C D 4
    A D 2 
    D E 10...etc

感谢您的宝贵时间。

2 个答案:

答案 0 :(得分:2)

与其将每条线作为一个整体进行计数,不如将其分成几对,然后对每对线的出现进行计数。

例如,与其单独计算('A', 'B', 'C', 'D'('A', 'B')('B', 'C'),不如计算('C', 'D'))。

from collections import Counter

flog = []
input_file = "test.txt"

with open(input_file, "r") as f:
    for line in f.readlines():
        line = line.split()
        flog.extend(line[i: i + 2] for i in range(len(line) - 1))
#            ^ note extend instead of append
    trace_frequency = map(tuple, flog)
flog = list(Counter(trace_frequency).items())

flog现在是

[(('A', 'B'), 4), (('B', 'C'), 4), (('C', 'D'), 4), (('D', 'E'), 10),
 (('E', 'F'), 9), (('F', 'G'), 9), (('A', 'D'), 2), (('E', 'G'), 1)]

要获得所需的格式(有订单奖励),可以使用:

flog = Counter(trace_frequency)

for entry, count in flog.most_common():
    print(' '.join(entry), count)

输出

D E 10
E F 9
F G 9
A B 4
B C 4
C D 4
A D 2
E G 1

答案 1 :(得分:0)

不确定是否最好,但是一种可能是使用熊猫。给定文件log.txt如下所示:

0 1 2 3 4
A B C D
A B C D
A B C D
A B C D
D E F G
D E F G
D E F G
D E F G
D E F G
D E F G
D E F G
A D E F G
D E F G
A D E G

此代码将起作用:

import pandas as pd
import numpy as np

df = pd.read_csv('log.txt', sep='\s+')

combos = [[(y[1][x], y[1][x + 1]) for x in range(len(df.loc[0]) - 1)] for y in df.iterrows()]
combos = [item for sublist in combos for item in sublist if np.nan not in item]

from collections import Counter
print(Counter(combos))

给你

('A', 'B') 4
('B', 'C') 4
('C', 'D') 4
('D', 'E') 10
('E', 'F') 9
('F', 'G') 9
('A', 'D') 2
('E', 'G') 1