2016-12-30 9 views
0

私は2つのデータフレーム 'matches_df'と 'ratings_df'を持っています。マッチデータフレームは、2人の試合の試合の選手、日付、勝者を記憶する。レーティングデータフレームには、各プレーヤーの現在のレーティングが任意の値から順に格納されます。後で再設定する前に、このフレームを更新したいと思います。関数呼び出し間でPythonリセット可変グローバルデータフレーム

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 
関連する問題