У меня цикл for выглядит примерно так, но он запускается долго, когда в него передается большой набор данных.
for i in range(0,len(data_sim.index)):
for j in range(1,len(data_sim.columns)):
user = data_sim.index[i]
activity = data_sim.columns[j]
if dt_full.loc[i][j] != 0:
data_sim.loc[i][j] = 0
else:
activity_top_names = data_neighbours.loc[activity][1:dt_length]
activity_top_sims = data_corr.loc[activity].sort_values(ascending=False)[1:dt_length]
user_purchases = data_activity.loc[user,activity_top_names]
data_sim.loc[i][j] = getScore(user_purchases,activity_top_sims)
В цикле for data_sim выглядит следующим образом:
CustomerId A B C D E
1 NAs NAs NAs NAs NAs
2 ..
Я попытался воспроизвести тот же процесс в функции apply, которая выглядит следующим образом:
def test(cell):
user = cell.index
activity = cell
activity_top_names = data_neighbours.loc[activity][1:dt_length]
activity_top_sims = data_corr.loc[activity].sort_values(ascending=False)[1:dt_length]
user_purchase = data_activity_index.loc[user, activity_top_names]
if dt_full.loc[user][activity] != 0:
return cell.replace(cell, 0)
else:
re = getScore(user_purchase, activity_top_sims)
return cell.replace(cell, re)
В функции data_sim2 выглядит так, я установил для столбца CustomerId индексстолбец и дублирует имя действия для каждого столбца действия.
CustomerId(Index) A B C D E
1 A B C D E
2 A B C D E
Внутри функции 'def test (cell)', если ячейка находится в data_sim2 [1] [0],
cell.index = 1 # userId
cell # activity name
Вся идея этого цикла for заключается в том, чтобы поместить данные оценки в таблицу 'data_sim' на основе положения каждой ячейки.И я использовал ту же идею при создании функции, использовал одни и те же вычисления в каждой ячейке, затем применил это к таблице данных 'data_sim',
data_test = data_sim2.apply(lambda x: test(x))
, это дало мне ошибку, сказанную
"sort_values() missing 1 required positional argument: 'by'"
, что странно, потому что эта проблема не возникала внутри цикла for.Похоже, что data_corr.loc [активность] по-прежнему является Dataframe серии.