def __init__(self, *args, **kwargs):
     # for initialization, we should load player data and metric system
     self.defaultMetrics = DefaultMetrics(rank="", position="")
     self.statCategories = kwargs["statCategories"]
     #self.statCategories = [attr for attr in dir(self.defaultMetrics.playerDao.getPlayer(key=0).playerStats) if not callable(attr) and not attr.startswith("__") and attr != "type"]
     print "Stat Categories: " + str(self.statCategories)
     self.positions = ['PG', 'SG', 'SF', 'PF', 'C']
     self.statsDao = StatsDao()
     self.playerDao = PlayerDao()
     self.leagueAverage = self.statsDao.getNbaAverageStat(year="")
Exemple #2
0
 def __init__(self, *args, **kwargs):
     # Here, are there any variables that we will need?
     # rank is what metric we rank by
     self.rank = kwargs["rank"]
     self.position = kwargs["position"]
     self.playerDao = PlayerDao()
     self.playerList = self.playerDao.getAllPlayersByKey()
     if (self.rank == ""):
         self.ranking = self.playerList
     else:
         self.rankList()
 def __init__(self, *args, **kwargs):
     # for initialization, we should load player data and metric system
     self.defaultMetrics = DefaultMetrics(rank = "", position="")
     self.statCategories = kwargs["statCategories"]
     #self.statCategories = [attr for attr in dir(self.defaultMetrics.playerDao.getPlayer(key=0).playerStats) if not callable(attr) and not attr.startswith("__") and attr != "type"]
     print "Stat Categories: " + str(self.statCategories)
     self.positions = ['PG', 'SG', 'SF', 'PF', 'C']
     self.statsDao = StatsDao()
     self.playerDao = PlayerDao()
     self.leagueAverage = self.statsDao.getNbaAverageStat(year = ""); # a StatObj
 def __init__(self, *args, **kwargs):
     # Here, are there any variables that we will need?
     # rank is what metric we rank by
     self.rank = kwargs["rank"]
     self.position = kwargs["position"]
     self.playerDao = PlayerDao()
     self.playerList = self.playerDao.getAllPlayersByKey()
     if (self.rank == ""):
         self.ranking = self.playerList
     else:
         self.rankList()
class DefaultMetrics:
    def __init__(self, *args, **kwargs):
        # Here, are there any variables that we will need?
        # rank is what metric we rank by
        self.rank = kwargs["rank"]
        self.position = kwargs["position"]
        self.playerDao = PlayerDao()
        self.playerList = self.playerDao.getAllPlayersByKey()
        if (self.rank == ""):
            self.ranking = self.playerList
        else:
            self.rankList()
    
    def rankList(self):
        # This will rank the list based on the position sent in, and by the metric
        self.ranking = self.playerDao.getPlayersOfPosition(self.position)
        self.ranking.sort(key=lambda x: getattr(x.playerStats, self.rank), reverse=True)
        

    def printList(self):
        print self.rank + ": " + str(self.ranking)
Exemple #6
0
class DefaultMetrics:
    def __init__(self, *args, **kwargs):
        # Here, are there any variables that we will need?
        # rank is what metric we rank by
        self.rank = kwargs["rank"]
        self.position = kwargs["position"]
        self.playerDao = PlayerDao()
        self.playerList = self.playerDao.getAllPlayersByKey()
        if (self.rank == ""):
            self.ranking = self.playerList
        else:
            self.rankList()

    def rankList(self):
        # This will rank the list based on the position sent in, and by the metric
        self.ranking = self.playerDao.getPlayersOfPosition(self.position)
        self.ranking.sort(key=lambda x: getattr(x.playerStats, self.rank),
                          reverse=True)

    def printList(self):
        print self.rank + ": " + str(self.ranking)
class DefaultSelector:
    def __init__(self, *args, **kwargs):
        # for initialization, we should load player data and metric system
        self.defaultMetrics = DefaultMetrics(rank="", position="")
        self.statCategories = kwargs["statCategories"]
        #self.statCategories = [attr for attr in dir(self.defaultMetrics.playerDao.getPlayer(key=0).playerStats) if not callable(attr) and not attr.startswith("__") and attr != "type"]
        print "Stat Categories: " + str(self.statCategories)
        self.positions = ['PG', 'SG', 'SF', 'PF', 'C']
        self.statsDao = StatsDao()
        self.playerDao = PlayerDao()
        self.leagueAverage = self.statsDao.getNbaAverageStat(year="")
        # a StatObj
        #print self.leagueAverage

    '''This is the master selection algorithm. '''

    def selectMaster(self, roundNum, fTeamKey=1):
        if (int(roundNum) > 3):
            print "Selecting the Balanced Team"
            rankings = self.selectBalanced(fTeamKey)
        else:
            print "Selecting the Best Player"
            rankings = self.selectBest()
        print rankings[0:49]

    '''This is the function that will get overridden for different selection methods'''

    def selectBest(self):
        # This function will select the best player available based on two metrics: best percentage increase, and balance of stats
        playersAvailableList = self.playerDao.getAllAvailablePlayers()
        greatestIncreaseList = {}
        for player in playersAvailableList:
            #f.write(str(player) + ":\n")
            #print str(player) + ":"
            avg = self.calculatePercentage(player)
            #f.write("Overall Average: " + str(avg)  + "\n")
            #print "Overall Average: " + str(avg)  + "\n\n"
            greatestIncreaseList[str(player)] = avg
        return sorted(greatestIncreaseList,
                      key=greatestIncreaseList.get,
                      reverse=True)

    def selectBalanced(self, fTeamKey):
        playersAvailableList = self.playerDao.getAllAvailablePlayers()
        balancedStatList = {}
        # Calculate a weighted average of the important stats required
        fTeamStatLine = self.assessTeam(fTeamKey)
        balancedStatList.update(zip(self.statCategories, fTeamStatLine))
        sortedDict = sorted(balancedStatList,
                            key=balancedStatList.get,
                            reverse=True)
        # Now weight the stat category with the index + 1
        weight = dict(
            zip(sortedDict, [x for x in range(len(self.statCategories))]))
        balancedList = {}
        for player in playersAvailableList:
            avg = self.calculatePercentage(player, weight)
            balancedList[str(player)] = avg
        return sorted(balancedList, key=balancedList.get, reverse=True)

    def calculatePercentage(self, player, weight=None):
        # Weight sent in will be a dictionary of stat categories vs index weight
        if (weight is None):
            weight = dict(
                zip(self.statCategories, [1] * len(self.statCategories)))
        playerVsAverageList = []
        for stat in self.statCategories:
            num = (getattr(player.playerStats, stat) * weight[stat] - getattr(
                self.leagueAverage, stat)) / getattr(self.leagueAverage, stat)
            if (stat == "tov"):
                num = num * -1
            playerVsAverageList.append(num)
            #f.write(stat + ": " + str(num) + "\n")
            #print stat + ": " + str(num)
        # Now calculate overall percentage which we will return
        overallAverage = mean(playerVsAverageList)
        return overallAverage

    def calculateStatLinePercentages(self, player):
        playerVsAverageList = []
        for stat in self.statCategories:
            num = (getattr(player.playerStats, stat) - getattr(
                self.leagueAverage, stat)) / getattr(self.leagueAverage, stat)
            if (stat == "tov"):
                num = num * -1
            playerVsAverageList.append(num)
        return playerVsAverageList

    '''This function will select the next best player at position'''

    def selectBestForPosition(self, position, fTeamKey=0):
        ids_l1 = set(x.name
                     for x in self.playerDao.getAllAvailablePlayers(fTeamKey))
        l2 = self.playerDao.getPlayersOfPosition(position)
        playersAvailableList = [item for item in l2 if item.name in ids_l1]
        return playersAvailableList

    '''This function will take the fantasy team and assess the team based on the stat categories'''

    def assessTeam(self, fTeamKey=1):
        fTeamPlayers = self.playerDao.getFantasyTeam(fTeamKey)
        fTeamStatLine = [(0.0, 0.0),
                         (0.0, 0.0)] + [0] * (len(self.statCategories) - 2)
        for fTeamPlayer in fTeamPlayers:
            for idx, item in enumerate(self.getStatLine(fTeamPlayer)):
                if (self.statCategories[idx] == 'fgp'
                        or self.statCategories[idx] == 'ftp'
                        or self.statCategories[idx] == 'fgp3'):
                    fTeamStatLine[idx] = (fTeamStatLine[idx][0] + item[0],
                                          fTeamStatLine[idx][1] + item[1])
                else:
                    fTeamStatLine[idx] = fTeamStatLine[idx] + item
            #fTeamStatLine = [x + y for x,y in zip(fTeamStatLine, self.getStatLine(fTeamPlayer)) if isinstance(x, int)]
        # calculate how much above or below average it is against the nba standard
        percentageDifference = self.calculateTeamPercentage(
            fTeamStatLine, len(fTeamPlayers))
        return percentageDifference

    def getStatLine(self, player):
        statLine = [0] * len(self.statCategories)
        for idx, stat in enumerate(self.statCategories):
            if (stat == 'fgp'):
                statLine[idx] = (player.playerStats.fgm,
                                 player.playerStats.fga)
            elif (stat == 'ftp'):
                statLine[idx] = (player.playerStats.ftm,
                                 player.playerStats.fta)
            elif (stat == 'fgp3'):
                statLine[idx] = (player.playerStats.fg3,
                                 player.playerStats.fga3)
            else:
                statLine[idx] = getattr(player.playerStats, stat)
        return statLine

    def calculateTeamPercentage(self, teamStatLine, length):
        teamPercentage = [0] * len(self.statCategories)
        for idx, stat in enumerate(self.statCategories):
            if (stat == 'fgp' or stat == 'ftp' or stat == 'fgp3'):
                if (teamStatLine[idx][1] != 0):
                    perc = teamStatLine[idx][0] / teamStatLine[idx][1] * 100
                    num = (perc - getattr(self.leagueAverage, stat)) / getattr(
                        self.leagueAverage, stat)
            else:
                num = (teamStatLine[idx] -
                       getattr(self.leagueAverage, stat)) / getattr(
                           self.leagueAverage, stat) * length
            if (stat == 'tov'):
                num = num * -1
            teamPercentage[idx] = num
        print "Team Percentage: " + str(teamPercentage)
        return teamPercentage
class DefaultSelector:
    def __init__(self, *args, **kwargs):
        # for initialization, we should load player data and metric system
        self.defaultMetrics = DefaultMetrics(rank = "", position="")
        self.statCategories = kwargs["statCategories"]
        #self.statCategories = [attr for attr in dir(self.defaultMetrics.playerDao.getPlayer(key=0).playerStats) if not callable(attr) and not attr.startswith("__") and attr != "type"]
        print "Stat Categories: " + str(self.statCategories)
        self.positions = ['PG', 'SG', 'SF', 'PF', 'C']
        self.statsDao = StatsDao()
        self.playerDao = PlayerDao()
        self.leagueAverage = self.statsDao.getNbaAverageStat(year = ""); # a StatObj
        #print self.leagueAverage
    
    '''This is the master selection algorithm. '''
    def selectMaster(self, roundNum, fTeamKey=1):
        if (int(roundNum) > 3):
            print "Selecting the Balanced Team"
            rankings = self.selectBalanced(fTeamKey)
        else:
            print "Selecting the Best Player"
            rankings = self.selectBest()
        print rankings[0:49]
    
    '''This is the function that will get overridden for different selection methods'''
    def selectBest(self):
        # This function will select the best player available based on two metrics: best percentage increase, and balance of stats
        playersAvailableList = self.playerDao.getAllAvailablePlayers()
        greatestIncreaseList = {}
        for player in playersAvailableList:
            #f.write(str(player) + ":\n")
            #print str(player) + ":"
            avg = self.calculatePercentage(player)
            #f.write("Overall Average: " + str(avg)  + "\n")
            #print "Overall Average: " + str(avg)  + "\n\n"
            greatestIncreaseList[str(player)] = avg
        return sorted(greatestIncreaseList, key=greatestIncreaseList.get, reverse=True)
        
    def selectBalanced(self,fTeamKey):
        playersAvailableList = self.playerDao.getAllAvailablePlayers()
        balancedStatList = {}
        # Calculate a weighted average of the important stats required
        fTeamStatLine = self.assessTeam(fTeamKey)
        balancedStatList.update(zip(self.statCategories, fTeamStatLine))
        sortedDict = sorted(balancedStatList, key=balancedStatList.get, reverse=True)
        # Now weight the stat category with the index + 1
        weight = dict(zip(sortedDict, [x for x in range(len(self.statCategories))]))
        balancedList = {}
        for player in playersAvailableList:
            avg = self.calculatePercentage(player, weight)
            balancedList[str(player)] = avg
        return sorted(balancedList, key=balancedList.get,reverse=True)
            
        
    def calculatePercentage(self, player, weight = None):
        # Weight sent in will be a dictionary of stat categories vs index weight
        if (weight is None):
            weight = dict(zip(self.statCategories, [1]*len(self.statCategories)))
        playerVsAverageList = []
        for stat in self.statCategories:
            num = (getattr(player.playerStats, stat)*weight[stat]-getattr(self.leagueAverage, stat))/getattr(self.leagueAverage, stat)
            if (stat == "tov"):
                num = num*-1
            playerVsAverageList.append(num)
            #f.write(stat + ": " + str(num) + "\n")
            #print stat + ": " + str(num)
        # Now calculate overall percentage which we will return
        overallAverage = mean(playerVsAverageList)
        return overallAverage
    
    def calculateStatLinePercentages(self, player):
        playerVsAverageList = []
        for stat in self.statCategories:
            num = (getattr(player.playerStats, stat)-getattr(self.leagueAverage, stat))/getattr(self.leagueAverage, stat)
            if (stat == "tov"):
                num = num*-1
            playerVsAverageList.append(num)
        return playerVsAverageList
    
    '''This function will select the next best player at position'''
    def selectBestForPosition(self, position, fTeamKey = 0):
        ids_l1 = set(x.name for x in self.playerDao.getAllAvailablePlayers(fTeamKey))
        l2 = self.playerDao.getPlayersOfPosition(position)
        playersAvailableList = [item for item in l2 if item.name in ids_l1]
        return playersAvailableList
    
    '''This function will take the fantasy team and assess the team based on the stat categories'''
    def assessTeam(self, fTeamKey=1):
        fTeamPlayers = self.playerDao.getFantasyTeam(fTeamKey)
        fTeamStatLine = [(0.0,0.0),(0.0,0.0)] + [0] *(len(self.statCategories)-2) 
        for fTeamPlayer in fTeamPlayers:
            for idx,item in enumerate(self.getStatLine(fTeamPlayer)):
                if (self.statCategories[idx] == 'fgp' or self.statCategories[idx] == 'ftp' or self.statCategories[idx] == 'fgp3'):
                    fTeamStatLine[idx] = (fTeamStatLine[idx][0] + item[0], fTeamStatLine[idx][1] + item[1])
                else:
                    fTeamStatLine[idx] = fTeamStatLine[idx] + item 
            #fTeamStatLine = [x + y for x,y in zip(fTeamStatLine, self.getStatLine(fTeamPlayer)) if isinstance(x, int)]
        # calculate how much above or below average it is against the nba standard
        percentageDifference = self.calculateTeamPercentage(fTeamStatLine, len(fTeamPlayers))
        return percentageDifference
        
    def getStatLine(self, player):
        statLine = [0] * len(self.statCategories)
        for idx,stat in enumerate(self.statCategories):
            if (stat == 'fgp'):
                statLine[idx] = (player.playerStats.fgm, player.playerStats.fga)
            elif (stat == 'ftp'):
                statLine[idx] = (player.playerStats.ftm, player.playerStats.fta)
            elif (stat == 'fgp3'):
                statLine[idx] = (player.playerStats.fg3, player.playerStats.fga3)
            else:
                statLine[idx] = getattr(player.playerStats, stat)
        return statLine

    def calculateTeamPercentage(self, teamStatLine, length):
        teamPercentage = [0] *len(self.statCategories)
        for idx,stat in enumerate(self.statCategories):
            if (stat == 'fgp' or stat == 'ftp' or stat == 'fgp3'):
                if (teamStatLine[idx][1] != 0):
                    perc = teamStatLine[idx][0]/teamStatLine[idx][1]*100
                    num = (perc-getattr(self.leagueAverage,stat))/getattr(self.leagueAverage,stat)
            else:
                num = (teamStatLine[idx]-getattr(self.leagueAverage, stat))/getattr(self.leagueAverage, stat)*length
            if (stat == 'tov'):
                num = num * -1
            teamPercentage[idx] = num
        print "Team Percentage: " + str(teamPercentage)
        return teamPercentage
'''
Created on 2013-10-09

@author: Ivan
'''
import csv
from PlayerDao import PlayerDao
import MySQLdb

def getDbConnection():
    db = MySQLdb.connect(host="localhost", user="******", passwd="watershipdown", db="nba_db")
    return db

with open("dataload/ESPN_Master.csv") as csvplayers:
    reader2 = csv.reader(csvplayers)
    dao = PlayerDao()
    playerList = dao.getAllPlayersByKey()
    indArr = []
    positionArr = []
    i = 0
    for row in reader2:        
        row[1] = row[1].replace("'", "''")
        # split by | delimiter
        elems = row[1].split("|")
        j = 0
        for elem in elems:
            elems[j] = elem.replace('\xa0', ' ')
            j = j+1
        if (elems[0] in str(playerList)):
            # First add the index to it
            ind = dao.getPlayerKeyByName(elems[0])