#python-3.x
#python-3.x
Вопрос:
Функция кода заключается в преобразовании набора данных таким образом, чтобы для каждой заданной пары фильмов подсчитывалось количество пользователей, которые смотрели оба фильма, и отслеживалось это значение (сохранялось как значение столбца).
Я пробовал писать код как таковой, но при увеличении количества пар выполнение занимает много времени.
def dataset_to_item_graph(self):
self.dataset1=self.dataset
items=self.dataset['movieId'].unique()
print(len(items))
ux=combinations(items,2)
item_edges=[]
for x in ux:
i = x[0]
j = x[1]
a = set(self.dataset1.loc[self.dataset1['movieId'] == i]['userId'])
b = set(self.dataset1.loc[self.dataset1['movieId'] == j]['userId'])
c = a.intersection(b)
if len(c) >0:
edge_list=[i,j,len(c)]
item_edges.append(edge_list)
else:
continue
item_graph = pd.DataFrame(item_edges, columns=['movie1','movie2','weight'])
return item_graph
This is the sample dataset I am working with:
userId movieId rating timestamp
0 1 1 4.0 964982703
1 1 3 4.0 964981247
2 1 6 4.0 964982224
3 1 47 5.0 964983815
4 1 50 5.0 964982931
5 2 1 3.0 964982931
6 2 3 4.0 964982831
7 2 6 4.0 964982933
8 3 47 5.0 964981249
9 3 1 2.0 964981248
10 3 50 3.5 965982931
This is the output I am expecting:
movieId1 movieId sum
0 1 3 2
1 1 6 2
2 1 47 2
3 1 50 2
4 3 6 1
5 3 47 1
6 3 50 1
7 6 47 1
8 6 50 1
9 47 50 2
Комментарии:
1. У меня сейчас нет времени на кодирование и тестирование, но я думаю, что это могло бы помочь выполнить
groupby
наmovieId
, затем сопоставить их с набором пользователей, что должно значительно снизить затраты на фильтрацию; затем выполнить комбинации для фильмов, и пользователи для фильма теперь должны быть быстро доступны (для очень быстрого пересечения подсчет)2. Я довольно новичок в программировании на Python, если вы могли бы написать код, когда будете свободны, чтобы помочь мне разобраться, я буду очень благодарен. Спасибо
Ответ №1:
Похоже, ваша проблема в том, что цикл for настолько велик. Было бы интересно запускать подпроцессы для вычисления этих шагов параллельно, а не последовательно. Знаете ли вы модуль многопроцессорной обработки? Вы могли бы попробовать просмотреть эту статью, особенно пример в конце, в котором используется from multiprocessing import Queue
.