Я строю алгоритм ранжирования в Python для ранжирования баскетбольных команд колледжа. Алгоритм работает следующим образом:
- У меня есть фрейм данных (5464 строки) с каждой баскетбольной игрой в колледже (назовем это
data_for_model
)
- У меня есть еще один фрейм данных (353 строки) с каждой командой и ее текущим рейтингом (назовем это
model_df
)
- Программа, которую я написал, проходит по каждой строке
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