2016-12-30 5 views
0

У меня есть два кадра данных, 'matches_df' и 'ratings_df'. Матчи dataframe хранят игроков, дату и победитель матчей двухпользовательской игры. В рейтинге данных сохраняется текущий рейтинг каждого игрока, начиная с произвольного значения. Я хочу обновить этот фрейм, прежде чем позже его перепродать.python reset mutable global dataframe между вызовами функций

matches_df 

date | player_1 | player_2 | winner 
1/11 'A'   'B'  'A' 
2/11 'C'   'B'  'C' 
3/11 'A'   'D'  'A' 
4/11 'A'   'C'  'C' 

ratings_df 

player | rating 
'A'  1000 
'B'  1000 
'C'  1000 
'D'  1000 

У меня есть рейтинги обновления алгоритмов, которые делают следующее (sudocode).

def update_ratings(match,parameter): 
    #(1) use current ratings to predict the likelihood of either player winning the match 
    #(2) using the outcome of the match to update player ratings 
    #(3) update the two players current ratings in the global dataframe based on the result of the match. 
    #(4) Return the square of the forecast's prediction error. 

Я хочу сравнить производительность различных значений параметров в прогнозируемой точности модели. Тем не менее, я изо всех сил пытаюсь либо сделать копии фрейма данных «рейтинги», либо сбросить рамки данных рейтингов между вызовами функций. Я использую следующий код для расчета производительности при заданном значении параметра:

def calc_brier(parameter,matches_df): 
    #reset dataframe to initial values (1000 for all players) 
    start_ratings = np.repeat(1000.0,len(unique_players)) 
    ratings_df = pd.DataFrame(data=[start_ratings],columns=unique_players) 
    brier = 0 
    for index, row in matches_df.iterrows(): 
     brier += update_ratings(row,parameter) 
    return brier 

Однако это не дает правильные результаты. Фрейм данных глобальных оценок не сбрасывается при вызове функции calc_brier, и в результате моя функция calc_brier несовместима, если вызывается несколько раз с теми же параметрами. Что я должен сделать, чтобы либо правильно сбросить фрейм данных глобальных оценок до/после вызова «calc_brier», либо использовать альтернативную структуру для достижения моей конечной цели сравнения производительности различных значений параметров?

ответ

0

Это работает, если я использую словарь, а не данные для хранения оценок. Вот версия, которая работает (с рейтингами df теперь словарь с именами в виде ключей и рейтингов с начальными значениями 1000). Не уверен, что было не так с исходным кодом.

def calc_brier(parameter): 
    for player in unique_players: 
     ratings_dict[player]=1000.0 
    brier = 0 
    for index, row in matches_df.iterrows(): 
     brier += update_ratings(row,k_factor) 
    return brier