Увеличение скорости логических итераций Python - PullRequest
3 голосов
/ 23 марта 2019

Я строю алгоритм ранжирования в Python для ранжирования баскетбольных команд колледжа. Алгоритм работает следующим образом:

  1. У меня есть фрейм данных (5464 строки) с каждой баскетбольной игрой в колледже (назовем это data_for_model)
  2. У меня есть еще один фрейм данных (353 строки) с каждой командой и ее текущим рейтингом (назовем это model_df)
  3. Программа, которую я написал, проходит по каждой строке data_for_model (т. Е. Каждой игре) и на каждой итерации идентифицирует проигравшую команду и команду-победителя в data_for_model, затем находит рейтинги для обеих команд в model_df , Если команда-победитель имеет больший рейтинг (то есть худший рейтинг) по сравнению с проигравшей командой, то рейтинг победившей команды теперь принимает значение команды, в которой они только что победили (то есть, ранг победивших команд улучшается). Кроме того, команда, которую они только что победили, и все команды, ранжированные ниже них (то есть более высокий и худший рейтинг), добавляются к их рейтингу на 1 (то есть их рейтинг становится хуже).

В настоящее время я получил код для запуска всего за 2 минуты. Я хотел бы посмотреть, смогу ли я ускорить этот цикл, потому что, в идеале, я хочу запустить его тысячи раз с начальным ранжированием случайных чисел (1-353) и получить среднее ранжирование по тысячам итоговых ранжирований. Я новичок в мониторинге процессов и оптимизации кода, поэтому помощь будет высоко ценится.

Вот некоторые подготовленные данные для работоспособного примера:

# import dependencies
import pandas as pd

# create winning team list
Winning_Team = ['buffalo','st-johns-ny','seton-hall','providence','indiana']
# create losing team list
Losing_Team = ['saint-francis-pa','loyola-md','wagner','siena','chicago-state']
# put winning team and losing team into columns in data_for_model
data_for_model = pd.DataFrame({'Winning_Team': Winning_Team,
                              'Losing_Team': Losing_Team})

# create team list
Team = ['buffalo','st-johns-ny','seton-hall','providence','indiana',
        'saint-francis-pa','loyola-md','wagner','siena','chicago-state']
# create rank list (i.e., 1-10)
Rank = [10,2,3,4,5,6,7,8,9,1]
# put Team and Rank into columns in model_df
model_df = pd.DataFrame({'Team': Team,
                         'Rank': Rank})

Вот код для алгоритма сортировки:

for i in range(data_for_model.shape[0]):
    # set up logic for model
    winning_team = data_for_model['Winning_Team'].loc[i] 
    losing_team = data_for_model['Losing_Team'].loc[i]

    # get index and rank for winning team in model_df
    winning_team_index = model_df.loc[model_df['Team'] == winning_team, 'Random_Rank_{}'.format(models)].index[0]
    winning_team_rank = model_df['Random_Rank_{}'.format(models)].loc[winning_team_index]

    # get index and rank for losing team in model_df
    losing_team_index = model_df.loc[model_df['Team'] == losing_team, 'Random_Rank_{}'.format(models)].index[0]
    losing_team_rank = model_df['Random_Rank_{}'.format(models)].loc[losing_team_index]

    # if the winning team has a worse ranking
    if winning_team_rank > losing_team_rank:
        # increase the ranking by 1 for all random_rank >= losing_team_rank
        model_df['Random_Rank_{}'.format(models)] = model_df.apply(lambda x: x['Random_Rank_{}'.format(models)]+1 if x['Random_Rank_{}'.format(models)] >= losing_team_rank else x['Random_Rank_{}'.format(models)], axis=1)
        # then make the winning_team_rank equal the rank of the losing team
        model_df['Random_Rank_{}'.format(models)].loc[winning_team_index] = losing_team_rank   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...