дан список событий покупки (customer_id, item)
1-hammer
1-screwdriver
1-nails
2-hammer
2-nails
3-screws
3-screwdriver
4-nails
4-screws
Я пытаюсь построить структуру данных, которая показывает, сколько раз предмет покупался с другим предметом.Не купил в то же время, но купил, так как я начал сохранять данные.результат будет выглядеть как
{
hammer : {screwdriver : 1, nails : 2},
screwdriver : {hammer : 1, screws : 1, nails : 1},
screws : {screwdriver : 1, nails : 1},
nails : {hammer : 1, screws : 1, screwdriver : 1}
}
, что означает, что молоток был куплен с гвоздями дважды (человек 1,3) и один раз отверткой (человек 1), винты были куплены с помощью отвертки один раз (человек 3),и так далее ...
мой текущий подход -
users = dict, где userid - это ключ, а список купленных предметов - значение
usersForItem = dict, где itemid - это ключи список пользователей, купивших товар, имеет значение
userlist = временный список пользователей, которые оценили текущий товар
pseudo:
for each event(customer,item)(sorted by item):
add user to users dict if not exists, and add the items
add item to items dict if not exists, and add the user
----------
for item,user in rows:
# add the user to the users dict if they don't already exist.
users[user]=users.get(user,[])
# append the current item_id to the list of items rated by the current user
users[user].append(item)
if item != last_item:
# we just started a new item which means we just finished processing an item
# write the userlist for the last item to the usersForItem dictionary.
if last_item != None:
usersForItem[last_item]=userlist
userlist=[user]
last_item = item
items.append(item)
else:
userlist.append(user)
usersForItem[last_item]=userlist
Итак, на данный момент у меня есть 2 выбора - кто купилчто и что было куплено кем.Вот где это становится сложным.Теперь, когда заполнен usersForItem, я перебираю его, просматриваю каждого пользователя, который купил предмет, и просматриваю другие покупки пользователей.Я признаю, что это не самый питонический способ делать вещи - я пытаюсь убедиться, что получаю правильный результат (которым я являюсь), прежде чем увлечься Python.
relatedItems = {}
for key,listOfUsers in usersForItem.iteritems():
relatedItems[key]={}
related=[]
for ux in listOfReaders:
for itemRead in users[ux]:
if itemRead != key:
if itemRead not in related:
related.append(itemRead)
relatedItems[key][itemRead]= relatedItems[key].get(itemRead,0) + 1
calc jaccard/tanimoto similarity between relatedItems[key] and its values
Есть либолее эффективный способ, которым я могу сделать это?Кроме того, если для этого типа операции есть подходящее академическое название, я бы хотел услышать его.
edit: уточнено, чтобы включить тот факт, что я не ограничиваю покупки предметами, купленными одновременновремя.Предметы можно купить в любое время.