我一直在寻找顺序模式挖掘的python实现,我找不到任何东西。
我有一个包含以下数据的csv文件(注意:第一列是重量,第二列是A,B,C) - 图片如下:
1 A,B,C
5 D,E,F,X,Z
6 P,Q,R
1 A,B,C,F
2 D,P,Q
4 E,X,R
1 W,Y
2 A,C,P,D,B
3 R,W,Y
基本上,我想知道某种组合发生了多少次。我想要以下内容:
在上述文件中,例如A,B,C序列发生3次。所以我的EXPECTED输出是A,B,C,3(我希望输出看起来像这样)。它应该检查csv文件中的所有序列。所以它应该检查A,然后是b,然后是A,B然后是C,然后是A,B,C等。它不应该给出A-Z字母组合,而应该检查CSV中的任何内容。
我使用组合来实际发出1,2,3,4组合。
alphabet = frozenset(combination(ListofAlphabet, 3)) #three combinations. List is from A-Z
for row in fileread:
if alphabet.issubset(row[1]):
output += 1
print '{},{}'.format(alphabet, output)
但它没有给出CSV中出现序列的最大数量,因为我手动将组合作为输入。那么,如何在CSV文件中为每个序列(例如A,B,C - 顺序和地点无关紧要)发生最大次数?
答案 0 :(得分:0)
如果您将csv.reader
和itertools.combinations
与collections.Counter
合并,则应该有效:例如
import csv
from collections import Counter
from itertools import combinations
counts = Counter()
with open("letters.csv", "rb") as fp:
reader = csv.reader(fp)
for row in reader:
letters = row[1].split(",")
for group in combinations(letters, 3):
counts[frozenset(group)] += 1
print counts.most_common(1)
将给出
dsm@winter:~/coding$ python letters.py
[(frozenset(['A', 'C', 'B']), 3)]
(假设我已经猜到了你的csv实际上看起来是什么样的。)如果你希望frozenset(group)
键看起来更清洁,你可以用tuple(sorted(group))
替换Counter
。
答案 1 :(得分:0)
您可以使用csv
模块解析CSV文件:
import csv
import codecs
def read_data(filename, *options):
with codecs.open(filename, 'rb', encoding='utf-8') as f:
for data in csv.reader(f, *options):
yield data
codecs
部分是如此,这在Python 3中有效。您可以使用它:
for data in read_data('test.csv'):
print(data)
现在,如果要计算出现次数的项目是第二行,则可以使用:
items = [data[1] for data in read_data('test.csv')]
然后将其传递给Counter
对象:
import collections
c = collections.Counter(items)
print(c.most_common())
这将打印您可以处理的(item, count)
对的列表:
for item, count in c.most_common():
print('sequence "{0}" occurred {1} times'.format(item, count))
答案 2 :(得分:0)
from collections import Counter
def myfunc(yourWord, seq):
c1 = Counter(yourWord)
c2 = Counter(seq)
return not (c2 - c1)
def runMe(filePath):
with open(filePath,"r") as f:
results=[]
data = f.readlines()
for x in data:
count=0
for y in data:
if myfunc("".join(y.strip().split(",")), x.strip().split(",")):
count=count+1
results.append((x.strip(),count))
return results
if __name__ == '__main__':
print runMe("input")
print runMe("myinput")
输入文件:
A,B,C
D,E,F,X,Z
P,Q,R
A,B,C,F
D,P,Q
E,X,R
W,Y
A,C,P,D,B
R,W,Y
myinput文件:
A,B
A,C,B
A
C,B
结果:
[('A,B,C', 3), ('D,E,F,X,Z', 1), ('P,Q,R', 1), ('A,B,C,F', 1), ('D,P,Q', 1), ('E,X,R', 1), ('W,Y', 2), ('A,C,P,D,B', 1), ('R,W,Y', 1)]
[('A,B', 2), ('A,C,B', 1), ('A', 3), ('C,B', 2)]
可以避免多次剥离,但是你会得到一个大概的想法......