簡體   English   中英

Python-將交易數據加載到列表中,計算每個字符串的出現

[英]Python - load transaction data into a list of lists, count occurrence of each string

由於要執行作業,因此我重新使用python,並且正在尋求有關加快我的代碼段的幫助。 由於沒有提供我的想法,我的上一篇文章被否決了,所以這次我會做得更好。

我有一個購買交易的文本文件,如下所示:

A B C D E F
A E F G H I J K 
A B D E F G H
B C D F G H
G H I K J
G H I J
B C D H J K
B C D H K
A C E G I K
A B D F G H I
A B C D E F G H I J K
A B C D E
C D F G
C E F G H I
C D E J K
J K
G H I J K
A B D
A C D K
A B D I J K
A B C E F G 
F G I J K
A F G K 
B C E F G H
A D E
A B 
C D E F 
C E F G H I J
I J K
E F H I J K

其中每個字母對應於購買特定產品,並且每一行都是一筆交易(對於第一行,有人購買了產品ABCDE和F)。 我需要對每個產品已購買多少次進行初步計數,然后創建至少購買了S次的商品清單。 這是我的代碼如下所示:

import itertools
import operator

item_data_lol = []
with open("test_file.txt") as inputfile:
   for line in inputfile:
       item_data_lol.append(line.strip().split(','))

# this is what item_data_lol loads in as
# [['A B C D E F'], ['A E F G H I J K'], ['A B D E F G H'], ['B C D F G H'], ['G H I K J'], ['G H I J'], ['B C D H J K'], ['B C D H K'], ['A C E G I K'], ['A B D F G H I'], ['A B C D E F G H I J K'], ['A B C D E'], ['C D F G'], ['C E F G H I'], ['C D E J K'], ['J K'], ['G H I J K'], ['A B D'], ['A C D K'], ['A B D I J K'], ['A B C E F G'], ['F G I J K'], ['A F G K'], ['B C E F G H'], ['A D E'], ['A B'], ['C D E F'], ['C E F G H I J'], ['I J K'], ['E F H I J K']]

S = 14

# initialize dictionary to count frequency of individual items
first_lookup = {}

# loop over each row, then each element, obtaining a total element count for each element 
for line in item_data_lol:
    line = line[0]
    for item in line.split():
        if item in first_lookup.keys():
            first_lookup[item] += 1
        else:
            first_lookup[item] = 1


# Get list of frequent items
frequent_items = []
for this_key, this_value in first_lookup.iteritems():
    if this_value > support_threshold:
        frequent_items.append(this_key)

print(first_lookup)
print(frequent_items)

代碼的這種結構對於我的小型數據集來說效果很好,但是當我在提供的完整txt文件上運行程序時,這會花費很長時間。 這段代碼只是我必須編寫的較大算法(用於查找頻繁項集的先驗算法)的一小部分,因此,與該第一部分所花費的時間一樣,這是令人擔憂的。 如果我可以使用不同的python函數加快代碼的這一部分(我主要用於循環,並且由於我對python感到生疏而又不記得很多函數的情況),那么我可能可以加快程序的后續部分也一樣

贊賞有關如何加快速度的任何想法

您在字典鍵上而不是在字典本身上遇到了令人遺憾的經典測試。

if item in first_lookup.keys():

應該

if item in first_lookup:

受益於字典查找。 顯式調用first_lookup.keys()在Python 2中生成一個list ,因此in適用於列表,而不是字典。

在您的情況下,請替換該循環:

for line in item_data_lol:
    line = line[0]
    for item in line.split():
        if item in first_lookup.keys():
            first_lookup[item] += 1
        else:
            first_lookup[item] = 1

這樣可以進一步提高速度(使用collections.Counter由生成器理解初始化):

import collections
first_lookup = collections.Counter(item for line in item_data_lol for item in line[0].split())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM