конвертировать для цикла, чтобы применить функцию в Python, чтобы уменьшить время выполнения - PullRequest
0 голосов
/ 28 февраля 2019

У меня цикл 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 серии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...