2017-11-10 6 views
0

ただ完了できません。したがって、私は完全なコードを投稿します。実行、変数home_team_a、home_team_d、away_team_aとaway_team_dは前回の試合の全てに基づいているときに使用Python Last 6結果、最後を取り除く

.CSVは今http://www.football-data.co.uk/mmz4281/1415/E0.csv

からですが、私は彼らが最後の6試合に常に基づくようにします。どの程度

import csv, math, ast, numpy as np 

def poisson(actual, mean): 
    return math.pow(mean, actual) * math.exp(-mean)/math.factorial(actual) 

csvFile = '20152016.csv' 

team_list = [] 

k = open('team_list.txt', 'w') 
k.write("""{ 
""") 

csvRead = csv.reader(open(csvFile)) 
next(csvRead) 

for row in csvRead: 
    if row[2] not in team_list: 
     team_list.append(row[2]) 
    if row[3] not in team_list: 
     team_list.append(row[3]) 

team_list.sort() 

for team in team_list: 
    k.write(""" '%s': {'home_goals': 0, 'away_goals': 0, 'home_conceded': 0, 'away_conceded': 0, 'home_games': 0, 'away_games': 0, 'alpha_h': 0, 'beta_h': 0, 'alpha_a': 0, 'beta_a': 0}, 
""" % (team)) 

k.write("}") 
k.close() 

s = open('team_list.txt', 'r').read() 
dict = ast.literal_eval(s) 

GAMES_PLAYED = 0 
WEEKS_WAIT = 4 
TOTAL_VALUE = 0 

csvRead = csv.reader(open(csvFile)) 
next(csvRead) 

for game in csvRead: 
    home_team = game[2] 
    away_team = game[3] 

    home_goals = int(game[4]) 
    away_goals = int(game[5]) 

    home_win_prob = 0 
    draw_win_prob = 0 
    away_win_prob = 0 

    curr_home_goals = 0 
    curr_away_goals = 0 
    avg_home_goals = 1 
    avg_away_goals = 1 

    team_bet = '' 
    ev_bet = '' 

    # GETTING UPDATED VARIABLES 
    for key, value in dict.items(): 
     curr_home_goals += dict[key]['home_goals'] 
     curr_away_goals += dict[key]['away_goals'] 

     if GAMES_PLAYED > (WEEKS_WAIT * 10): 
      avg_home_goals = curr_home_goals/(GAMES_PLAYED) 
      avg_away_goals = curr_away_goals/(GAMES_PLAYED) 


    # CALCULATING FACTORS 
    if GAMES_PLAYED > (WEEKS_WAIT * 10): 
     home_team_a = (dict[home_team]['alpha_h'] + dict[home_team]['alpha_a'])/2 
     away_team_a = (dict[away_team]['alpha_h'] + dict[away_team]['alpha_a'])/2 

     home_team_d = (dict[home_team]['beta_h'] + dict[home_team]['beta_a'])/2 
     away_team_d = (dict[away_team]['beta_h'] + dict[away_team]['beta_a'])/2 

     home_team_exp = avg_home_goals * home_team_a * away_team_d 
     away_team_exp = avg_away_goals * away_team_a * home_team_d 


    # RUNNING POISSON 
     l = open('poisson.txt', 'w') 

     for i in range(10): 
      for j in range(10): 
       prob = poisson(i, home_team_exp) * poisson(j, away_team_exp) 
       l.write("Prob%s%s = %s\n" % (i, j, prob)) 

     l.close() 

     with open('poisson.txt') as f: 
      for line in f: 

       home_goals_m = int(line.split(' = ')[0][4]) 
       away_goals_m = int(line.split(' = ')[0][5]) 

       prob = float(line.split(' = ')[1]) 

       if home_goals_m > away_goals_m: 
        home_win_prob += prob 
       elif home_goals_m == away_goals_m: 
        draw_win_prob += prob 
       elif home_goals_m < away_goals_m: 
        away_win_prob += prob 

    #CALCULATE VALUE 
     bet365odds_h, bet365odds_d, bet365odds_a = float(game[23]), float(game[24]), float(game[25]) 

     ev_h = (home_win_prob * (bet365odds_h - 1)) - (1 - home_win_prob) 
     ev_d = (draw_win_prob * (bet365odds_d - 1)) - (1 - draw_win_prob) 
     ev_a = (away_win_prob * (bet365odds_a - 1)) - (1 - away_win_prob) 

     highestEV = max(ev_h, ev_d, ev_a) 

     if (ev_h == highestEV) and (ev_h > 0): 
      team_bet = home_team 
      ev_bet = ev_h 
      if home_goals > away_goals: 
       TOTAL_VALUE += (bet365odds_h - 1) 
      else: 
       TOTAL_VALUE -= 1 

     elif (ev_d == highestEV) and (ev_d > 0): 
      team_bet = 'Draw' 
      ev_bet = ev_d 
      if home_goals == away_goals: 
       TOTAL_VALUE += (bet365odds_d - 1) 
      else: 
       TOTAL_VALUE -= 1 
     elif (ev_a == highestEV) and (ev_a > 0): 
      team_bet = away_team 
      ev_bet = ev_a 
      if home_goals < away_goals: 
       TOTAL_VALUE += (bet365odds_a - 1) 
      else: 
       TOTAL_VALUE -= 1 

     if (team_bet != '') and (ev_bet != ''): 
      print ("Bet on '%s' (EV = %s)" % (team_bet, ev_bet))  
      print (TOTAL_VALUE) 

    # UPDATE VARIABLES AFTER MATCH HAS BEEN PLAYED 
    dict[home_team]['home_goals'] += home_goals 
    dict[home_team]['home_conceded'] += away_goals 
    dict[home_team]['home_games'] += 1 

    dict[away_team]['away_goals'] += away_goals 
    dict[away_team]['away_conceded'] += home_goals 
    dict[away_team]['away_games'] += 1 

    GAMES_PLAYED += 1 

    # CREATE FACTORS 
    if GAMES_PLAYED > (WEEKS_WAIT * 10): 
     for key, value in dict.items(): 
      alpha_h = (dict[key]['home_goals']/dict[key]['home_games'])/avg_home_goals 
      beta_h = (dict[key]['home_conceded']/dict[key]['home_games'])/avg_away_goals 

      alpha_a = (dict[key]['away_goals']/dict[key]['away_games'])/avg_away_goals 
      beta_a = (dict[key]['away_conceded']/dict[key]['away_games'])/avg_home_goals 

      dict[key]['alpha_h'] = alpha_h 
      dict[key]['beta_h'] = beta_h 
      dict[key]['alpha_a'] = alpha_a 
      dict[key]['beta_a'] = beta_a 
+2

このコードはまったく実行されますか?基本的に 'if [a、b、c]> 50'を実行していますが、これはうまくいかないようです。 –

+1

'if(records> 50)'という行はスケッチです。 'records'は' csv.Reader'オブジェクトの反復処理からのリストオブジェクトであるため、それは有効ではないと思います。だからあなたは 'リスト> 50'と言っていて、うまくいきません。 – pstatix

+0

更新された投稿を参照してください –

答えて

1

:あなたはこのような何かを行うことができ

if seen_records == 200: 
    recs = list(csvRead)[seen_records - 6:seen_records + 1] 
+0

更新された投稿を参照してください –

0

....

previous_index = 0 
previous_max = 6 # max number of previous numbers to remember 
previous = [None for _ in range(previous_max)] 
csvFile = 'X.csv' 
seen_records = 0 
csvRead = csv.reader(open(csvFile)) 
# Enumerate over the records to keep track of the index of each one 
for i, records in enumerate(csvRead): 
    if (i > 50): 
     seen_records =+ 1 
     if previous_index == previous_max: 
      previous_index = 0 # Reset to the beginning when we reach the end 
     # Store the record and increment the index to the next location 
     previous[previous_index] = record 
     previous_index += 1 

これは、長さprevious_maxの非常に基本的な配列を作成し、ただで最も古いデータを格納しますインデックス0、最新の値はprevious_max -1です。

+0

更新された投稿を参照してください –

4

最後の6つのアイテムをメモリに保持するために両端キューを使用します。新しいレコードを追加すると、最も古いレコードが「プッシュアウト」されます。あなたが6に両端キューの最大長を設定しているので

import collections 
import itertools 
import csv 

with open("foo.csv") as fh: 
    # Skip the first 44 rows 
    csv_read = islice(csv.reader(fh), 44, None) 

    # Initialize the deque with the next 6 rows 
    d = collections.deque(islice(csv_read, 6), 6) 

    for record in csv_read: 
     d.append(record) 
     print(list(d)) # Rows 46-51, then 47-52, then 48-53, etc 

、それぞれが「フル」両端キューに追加するには、古いものを押し出します。一般に


等、最初の反復で、d.append行45を押し出すと、行46、行52個のプッシュを追加して、次の反復での行51を追加し、両端キューは次のようなデータ構造でありますキューとスタックの組み合わせ。いずれかに項目を追加または削除することは効率的ですが、任意の項目へのアクセスや「中間」の変更は遅いです。ここでは、完全な両端キューへの追加が反対側からの暗黙の削除を引き起こすという事実を利用しています。

+0

更新された投稿をご覧ください –

関連する問題