with open('similarities/EuclideanSimilarity.csv', 'w') as result_file:
print('user1,user2,similarity', file=result_file)
print('Calculating similarities between users...')
for u1 in tqdm(users, total=len(users)):
for u2 in users:
ratings1 = np.nan_to_num(np.array(user_ratings_matrix.iloc[u1 - 1].values))
ratings2 = np.nan_to_num(np.array(user_ratings_matrix.iloc[u2 - 1].values))
sim = 1 / (1 + distance.euclidean(ratings1, ratings2))
print(f"{u1},{u2},{sim}", file=result_file)"
~/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py in getitem(self, key) 第1371章 第1372章 -> 1373 返回 self._getitem_axis(maybe_callable, axis=axis) 第1374章 第1375章
~/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis) 1828 第1829章 -> 1830 self._is_valid_integer(键,轴) 1831年 第1832章
~/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py in _is_valid_integer(self, key, axis) 第1711章 第1712章 -> 1713 raise IndexError(“单个位置索引器越界”) 第1714章 第1715章
IndexError:单个位置索引器超出范围
最佳答案
您没有提供有关用户
或user_ ratings_matrix
的类型/内容的足够信息,无法可靠地回答您的问题。如果我假设 users
是一个 userID 列表,并且 user_atings_matrix
是一个标准的 Pandas DataFrame
,它们的顺序相同 作为 users
,那么你可以重写你的 for
循环,如下所示:
for u1,row1 in tqdm(zip(users, user_ratings_matrix.itertuples(index=False, name=None)), total=len(users)):
for u2,row2 in zip(users, user_ratings_matrix.itertuples(index=False, name=None)):
ratings1 = np.nan_to_num(np.array(row1))
ratings2 = np.nan_to_num(np.array(row2))
sim = 1 / (1 + distance.euclidean(ratings1, ratings2))
print(f"{u1},{u2},{sim}", file=result_file)"
说明
user_ ratings_matrix.itertuples(index=False, name=None)
将迭代数据框中的行并将每个行作为元组返回。
zip(users, user_ ratings_matrix.itertuples(index=False, name=None))
将迭代 (userID, tuple(dataframe_row))
对。
此外,在您下次在 SO 上发布问题之前,您可能应该阅读 these guidelines about how to produce an example that other people can run/work with 。它将帮助您在此网站上获得更好的答案。
关于python - 单个位置索引器超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231869/