Football - Stats


In [1]:
%pylab inline

import pandas as pd
import matplotlib.pyplot as plt
import requests
import string
from lxml import html
import datetime


Populating the interactive namespace from numpy and matplotlib

In [29]:
def QB_HEADER():
    str1 = "idx, DATE,OPPONENT,RESULT,CMP,PATT,PCT,PYDS,PAVG,PTD,INT,SAC,SYDS,RATE,"
    str1 += "RATT,RYDS,RAVG,RLG,RTD,FUM\n"
    return str1

def writeCSV(fileName, final, i=0):
    d = open(fileName, 'w')
    strArr = generateCSVString(final, i)
    for item in strArr:
        print item
        d.write(item)
    d.close()
    
def generateCSVString(final, i=0):
    arrString = []
    comma = ','
    arrString.append(QB_HEADER())
    for item in final:
        #print len(item)
        str1 = str(i)+comma
        for j in item:
            if isinstance(j, datetime.date):
                str1 += str(j)+comma
            else:
                str1 += j+comma
        str1 = str1.strip(comma)
        str1 += "\n"
        arrString.append(str1)
        i = i + 1
    return arrString

import dateutil.parser


def cbs_cleanQBArray(playerArray, year):
    ret = []
    
    #print playerArray
    
    for item in playerArray:
        del item[-1] 
        tmp = item
        #print item[0]
        date1 = dateutil.parser.parse(item[0] + '/' + str(year))
        next_monday = date1 + datetime.timedelta(days=-date1.weekday(), weeks=1)
        if date1.weekday() == 0:
            tmp[0] = date1
        else:
            tmp[0] = next_monday
        
        if '@' in item[1]:
            tmp[1] = "A"
        else:
            tmp[1] = "H"
        
        if 'W' in item[2]:
            tmp[2] = "W"
        else:
            tmp[2] = "L"
        ret.append(tmp)
    
    return ret


def cbs_2011_cleanQBArray(playerArray, year):
    ret = []
    
    #print playerArray
    
    for item in playerArray:
        print len(item)
        del item[3]       
        i = 0
        tmp = list(item)
        if not item[0]:
            continue
        date1 = dateutil.parser.parse(item[0] + '/' + str(year))
        next_monday = date1 + datetime.timedelta(days=-date1.weekday(), weeks=1)
        if date1.weekday() == 0:
            tmp[0] = date1
        else:
            tmp[0] = next_monday

        if '@' in item[1]:
            tmp[1] = "A"
        else:
            tmp[1] = "H"

        if 'W' in item[2]:
            tmp[2] = "W"
        else:
            tmp[2] = "L"
        
        tmp.insert(7,str(float(item[6])/float(item[4])))          
         
        val = tmp.pop(10)
        #print val
        tmp.insert(12, val)
            
        del tmp[-1]       
        ret.append(tmp)
    
    return ret

In [30]:
page = requests.get('http://www.cbssports.com/nfl/playersearch?POSITION=QB&print_rows=9999')
OUTPUT = 'players_cbs.csv'
d = open(OUTPUT, 'w')
#d.write(page.text)
#xpath1= r'//*[@id="gridContainer"]/div/div[2]/div[1]/table[2]/tbody/*/td[1]/*'
xpath1= r'//*[@id="gridContainer"]/div/div[2]/div[1]/table[2]/*/td/a/@href'

print xpath1
tree = html.fromstring(page.text)

buyers = tree.xpath(xpath1)
ret = []
for item in buyers:
    s = item.split('/')
    ret.append((s[4], s[5]))

#print ret
#print buyers
comma = ','
d.write("id,cbs_id,cbs_player\n")
i = 0
for item in ret:
    d.write(str(i)+comma+item[0]+comma+item[1]+"\n")
    i = i + 1
    
    
d.close()
page.close()


//*[@id="gridContainer"]/div/div[2]/div[1]/table[2]/*/td/a/@href

In [32]:
#name = 'jameis-winston'
#playerid = 1998197
#year = 2015

#name = 'peyton-manning'
#playerid = 12531

name = "tom-brady"
playerid = 187741
years = [2009, 2010, 2011, 2012, 2013, 2014, 2015]
OUTPUT = r'{0}_{1}.csv'.format(name, playerid)

def getQB_CBS_CSV(name, playerid, years):
    ret = []
    
    for year in years:
    
        url = r'http://www.cbssports.com/nfl/players/player/gamelogs/{0}/{1}/'.format(year, playerid)
        page = requests.get(url)
        #//*[@id="layoutPlayersRight"]/div[1]/table/tbody/*
        xpath1= r'//*[@id="layoutPlayersRight"]/div[1]/table/tr[@align="right"]'
        #xpath1= r'//*[@id="layoutPlayersRight"]/div[1]/table/tr[@class="row1" or @clase]'
        #print xpath1
        tree = html.fromstring(page.text)

        stats = tree.xpath(xpath1)

        final = []
        tmp = []
        #print stats
        for item in stats:
            if(len(item) == 18):
                continue
            if(len(item) == 4):
                continue
            if(len(item) != 20):
                continue
            if 'Total' in item[0].text_content():
                continue
            for cell in item.xpath('./td'):  
               
                 tmp.append(cell.text_content())
            final.append(tmp)
            tmp = []
        #print final
        if(year > 2011):
            final = cbs_cleanQBArray(final, year)
        else:
            final = cbs_2011_cleanQBArray(final, year)
        ret.append(final)
        page.close()
        
    ret2 = [item for sublist in ret for item in sublist]    
    return ret2
    
var1 = getQB_CBS_CSV(name, playerid, years)
#print var1
writeCSV("data/" + OUTPUT, var1, 0)


20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
idx, DATE,OPPONENT,RESULT,CMP,PATT,PCT,PYDS,PAVG,PTD,INT,SAC,SYDS,RATE,RATT,RYDS,RAVG,RLG,RTD,FUM

0,2009-09-14 00:00:00,H,W,53,39,73.6,378,9.69230769231,2,1,1,10,97.8,1,9,9.0,9,0,0

1,2009-09-21 00:00:00,A,L,47,23,48.9,216,9.39130434783,0,1,0,0,53.1,1,2,2.0,2,0,0

2,2009-09-28 00:00:00,H,W,42,25,59.5,277,11.08,1,0,0,0,87.1,3,0,0,2,0,0

3,2009-10-05 00:00:00,H,W,32,21,65.6,258,12.2857142857,1,0,3,24,100.8,5,11,2.2,7,1,1

4,2009-10-12 00:00:00,A,L,33,19,57.6,215,11.3157894737,2,0,1,6,97.4,1,-1,-1.0,-1,0,1

5,2009-10-19 00:00:00,H,W,34,29,85.3,380,13.1034482759,6,0,2,6,152.8,0,0,0,0,0,0

6,2009-10-26 00:00:00,A,W,32,23,71.9,308,13.3913043478,3,2,1,1,107.3,1,5,5.0,5,0,0

7,2009-11-09 00:00:00,H,W,37,25,67.6,332,13.28,1,1,2,9,93.5,1,5,5.0,5,0,0

8,2009-11-16 00:00:00,A,L,42,29,69.0,375,12.9310344828,3,1,2,11,110.7,3,3,1.0,3,0,1

9,2009-11-23 00:00:00,H,W,41,28,68.3,310,11.0714285714,1,0,2,11,98.6,4,9,2.3,7,0,1

10,2009-11-30 00:00:00,A,L,36,21,58.3,237,11.2857142857,0,2,1,4,55.0,1,2,2.0,2,0,0

11,2009-12-07 00:00:00,A,L,29,19,65.5,352,18.5263157895,2,2,0,0,101.5,0,0,0,0,0,0

12,2009-12-14 00:00:00,H,W,32,19,59.4,192,10.1052631579,1,1,0,0,74.0,2,-2,-1.0,-1,0,0

13,2009-12-21 00:00:00,A,W,23,11,47.8,115,10.4545454545,1,1,0,0,59.1,4,-3,-0.8,0,0,0

14,2009-12-28 00:00:00,H,W,26,23,88.5,267,11.6086956522,4,0,0,0,149.0,2,4,2.0,2,0,0

15,2009-01-05 00:00:00,A,L,26,17,65.4,186,10.9411764706,0,1,1,4,70.4,0,0,0,0,0,0

16,2009-01-12 00:00:00,H,L,42,23,54.8,154,6.69565217391,2,3,3,22,49.1,0,0,0,0,0,1

17,2010-09-13 00:00:00,H,W,35,25,71.4,258,10.32,3,0,0,0,120.9,0,0,0,0,0,0

18,2010-09-20 00:00:00,A,L,36,20,55.6,248,12.4,2,2,1,9,72.5,0,0,0,0,0,1

19,2010-09-27 00:00:00,H,W,27,21,77.8,252,12.0,3,0,1,7,142.6,4,6,1.5,9,0,0

20,2010-10-04 00:00:00,A,W,24,19,79.2,153,8.05263157895,1,0,3,7,107.1,5,6,1.2,5,0,0

21,2010-10-18 00:00:00,H,W,44,27,61.4,292,10.8148148148,1,2,3,25,69.5,2,1,0.5,2,0,0

22,2010-10-25 00:00:00,A,W,32,19,59.4,159,8.36842105263,1,0,4,31,82.7,2,1,0.5,2,0,0

23,2010-11-01 00:00:00,H,W,27,16,59.3,240,15.0,1,0,0,0,100.8,4,-3,-0.8,0,0,0

24,2010-11-08 00:00:00,A,L,36,19,52.8,224,11.7894736842,2,0,1,9,90.5,1,1,1.0,1,0,0

25,2010-11-15 00:00:00,A,W,43,30,69.8,350,11.6666666667,3,0,0,0,117.4,1,3,3.0,3,1,0

26,2010-11-22 00:00:00,H,W,25,19,76.0,186,9.78947368421,2,0,1,8,123.1,4,-2,-0.5,0,0,1

27,2010-11-29 00:00:00,A,W,27,21,77.8,341,16.2380952381,4,0,1,3,158.3,4,1,0.3,3,0,0

28,2010-12-06 00:00:00,H,W,29,21,72.4,326,15.5238095238,4,0,3,22,148.9,1,3,3.0,3,0,0

29,2010-12-13 00:00:00,A,W,40,27,67.5,369,13.6666666667,2,0,3,18,113.4,0,0,0,0,0,0

30,2010-12-20 00:00:00,H,W,24,15,62.5,163,10.8666666667,2,0,3,27,110.2,0,0,0,0,0,1

31,2010-12-27 00:00:00,A,W,27,15,55.6,140,9.33333333333,3,0,1,9,107.0,3,13,4.3,7,0,0

32,2010-01-04 00:00:00,H,W,16,10,62.5,199,19.9,2,0,0,0,145.6,0,0,0,0,0,0

33,2010-01-18 00:00:00,H,L,45,29,64.4,299,10.3103448276,2,1,5,40,89.0,2,2,1.0,3,0,1

34,2011-09-12 00:00:00,A,W,48,32,66.7,517,16.15625,4,1,1,1,121.6,1,3,3.0,3,0,0

35,2011-09-19 00:00:00,H,W,40,31,77.5,423,13.6451612903,3,0,2,13,135.7,2,3,1.5,4,0,0

36,2011-09-26 00:00:00,A,L,45,30,66.7,387,12.9,4,4,0,0,86.1,1,5,5.0,5,0,0

37,2011-10-03 00:00:00,A,W,30,16,53.3,226,14.125,2,0,1,0,100.1,1,-1,-1.0,-1,0,0

38,2011-10-10 00:00:00,H,W,33,24,72.7,321,13.375,1,1,4,27,100.7,1,3,3.0,3,0,0

39,2011-10-17 00:00:00,H,W,41,27,65.9,289,10.7037037037,2,2,3,19,82.3,4,17,4.3,8,0,0

40,2011-10-31 00:00:00,A,L,35,24,68.6,198,8.25,2,0,3,28,101.8,0,0,0,0,0,1

41,2011-11-07 00:00:00,H,L,49,28,57.1,342,12.2142857143,2,2,2,10,75.4,1,5,5.0,5,0,1

42,2011-11-14 00:00:00,A,W,39,26,66.7,329,12.6538461538,3,0,0,0,118.4,3,2,0.7,3,0,1

43,2011-11-21 00:00:00,H,W,27,15,55.6,234,15.6,2,0,3,11,109.2,2,10,5.0,8,0,1

44,2011-11-28 00:00:00,A,W,34,24,70.6,361,15.0416666667,3,0,1,8,134.6,5,28,5.6,13,0,0

45,2011-12-05 00:00:00,H,W,38,29,76.3,289,9.96551724138,2,0,1,0,114.9,3,7,2.3,6,0,0

46,2011-12-12 00:00:00,A,W,37,22,59.5,357,16.2272727273,3,1,1,5,107.6,4,8,2.0,5,0,0

47,2011-12-19 00:00:00,A,W,34,23,67.6,320,13.9130434783,2,0,2,10,117.3,6,2,0.3,2,1,1

48,2011-12-26 00:00:00,H,W,46,27,58.7,304,11.2592592593,1,0,4,23,85.8,9,17,1.9,5,2,0

49,2011-01-03 00:00:00,H,W,35,23,65.7,338,14.6956521739,3,1,4,18,113.8,0,0,0,0,0,1

50,2011-01-17 00:00:00,H,W,34,26,76.5,363,13.9615384615,6,1,0,0,137.6,3,8,2.7,4,0,0

51,2011-01-24 00:00:00,H,W,36,22,61.1,239,10.8636363636,0,2,1,5,57.5,6,2,0.3,4,1,0

52,2012-01-16 00:00:00,H,W,25,40,62.5,344,8.60,3,0,1,9,115.0,1,-1,-1.0,-1,0,0

53,2012-01-23 00:00:00,H,L,29,54,53.7,320,5.93,1,2,0,0,62.3,2,5,2.5,3,0,0

54,2012-09-10 00:00:00,A,W,23,31,74.2,236,7.61,2,0,1,8,117.1,2,1,0.5,2,0,0

55,2012-09-17 00:00:00,H,L,28,46,60.9,316,6.87,1,1,4,19,79.6,1,-1,-1.0,-1,0,0

56,2012-09-24 00:00:00,A,L,28,41,68.3,335,8.17,1,0,2,16,101.2,2,7,3.5,7,0,1

57,2012-10-01 00:00:00,A,W,22,36,61.1,340,9.44,3,0,1,7,120.1,1,4,4.0,4,1,0

58,2012-10-08 00:00:00,H,W,23,31,74.2,223,7.19,1,0,4,30,104.6,4,-2,-0.5,1,1,1

59,2012-10-15 00:00:00,A,L,36,58,62.1,395,6.81,2,2,1,7,79.3,0,0,0,0,0,0

60,2012-10-22 00:00:00,H,W,26,42,61.9,259,6.17,2,0,1,9,95.2,0,0,0,0,0,0

61,2012-10-29 00:00:00,A,W,23,35,65.7,304,8.69,4,0,0,0,131.1,1,3,3.0,3,0,0

62,2012-11-12 00:00:00,H,W,23,38,60.5,237,6.24,2,0,1,7,96.1,1,-1,-1.0,-1,0,0

63,2012-11-19 00:00:00,H,W,24,35,68.6,331,9.46,3,0,0,0,127.2,0,0,0,0,0,0

64,2012-11-26 00:00:00,A,W,18,27,66.7,323,11.96,3,0,0,0,144.5,3,5,1.7,2,1,0

65,2012-12-03 00:00:00,A,W,24,40,60.0,238,5.95,1,1,4,25,74.8,4,-1,-0.3,2,0,0

66,2012-12-10 00:00:00,H,W,21,35,60.0,296,8.46,4,0,1,7,125.4,1,6,6.0,6,0,0

67,2012-12-17 00:00:00,H,L,36,65,55.4,443,6.82,1,2,3,18,68.9,3,11,3.7,5,1,0

68,2012-12-24 00:00:00,A,W,24,41,58.5,267,6.51,2,2,3,21,73.9,0,0,0,0,0,0

69,2012-12-31 00:00:00,H,W,22,36,61.1,284,7.89,2,0,1,8,104.4,0,0,0,0,0,0

70,2013-09-09 00:00:00,A,W,29,52,55.8,288,5.54,2,1,2,15,76.4,5,-4,-0.8,0,0,1

71,2013-09-16 00:00:00,H,W,19,39,48.7,185,4.74,1,0,1,7,71.0,2,-2,-1.0,0,0,0

72,2013-09-23 00:00:00,H,W,25,36,69.4,225,6.25,2,1,3,23,92.9,5,5,1.0,5,0,0

73,2013-09-30 00:00:00,A,W,20,31,64.5,316,10.19,2,0,0,0,119.8,5,-2,-0.4,1,0,1

74,2013-10-07 00:00:00,A,L,18,38,47.4,197,5.18,0,1,4,31,52.2,0,0,0,0,0,1

75,2013-10-14 00:00:00,H,W,25,43,58.1,269,6.26,1,1,5,34,74.7,2,16,8.0,11,0,0

76,2013-10-21 00:00:00,A,L,22,46,47.8,228,4.96,0,1,4,23,53.5,0,0,0,0,0,2

77,2013-10-28 00:00:00,H,W,13,22,59.1,116,5.27,1,1,3,16,69.5,4,5,1.3,8,0,0

78,2013-11-04 00:00:00,H,W,23,33,69.7,432,13.09,4,0,3,19,151.8,1,-1,-1.0,-1,0,0

79,2013-11-18 00:00:00,A,L,29,40,72.5,296,7.40,1,1,2,13,91.3,1,3,3.0,3,0,0

80,2013-11-25 00:00:00,H,W,34,50,68.0,344,6.88,3,0,3,20,107.4,2,0,0,1,0,2

81,2013-12-02 00:00:00,A,W,29,41,70.7,371,9.05,2,1,1,6,104.8,0,0,0,0,0,0

82,2013-12-09 00:00:00,H,W,32,52,61.5,418,8.04,2,1,4,21,91.7,2,1,0.5,2,0,1

83,2013-12-16 00:00:00,A,L,34,55,61.8,364,6.62,2,1,1,7,85.7,0,0,0,0,0,0

84,2013-12-23 00:00:00,A,W,14,26,53.8,172,6.62,1,0,2,14,87.3,0,0,0,0,0,0

85,2013-12-30 00:00:00,H,W,14,24,58.3,122,5.08,1,1,1,7,68.4,4,-3,-0.8,0,0,1

86,2014-09-08 00:00:00,A,L,29,56,51.8,249,4.45,1,0,4,23,69.7,1,3,3.0,3,0,2

87,2014-09-15 00:00:00,A,W,14,21,66.7,149,7.10,1,0,1,7,103.1,1,0,0,0,0,0

88,2014-09-22 00:00:00,H,W,24,37,64.9,234,6.32,1,0,2,13,91.5,3,-7,-2.3,-2,0,1

89,2014-09-29 00:00:00,A,L,14,23,60.9,159,6.91,1,2,2,8,59.9,0,0,0,0,0,2

90,2014-10-06 00:00:00,H,W,23,35,65.7,292,8.34,2,0,1,7,110.7,4,13,3.3,6,0,0

91,2014-10-13 00:00:00,A,W,27,37,73.0,361,9.76,4,0,2,15,139.6,4,3,0.8,4,0,0

92,2014-10-20 00:00:00,H,W,20,37,54.1,261,7.05,3,0,1,1,103.5,0,0,0,0,0,0

93,2014-10-27 00:00:00,H,W,30,35,85.7,354,10.11,5,0,0,0,148.4,2,0,0,0,0,1

94,2014-11-03 00:00:00,H,W,33,53,62.3,333,6.28,4,1,1,1,97.4,2,4,2.0,4,0,0

95,2014-11-17 00:00:00,A,W,19,30,63.3,257,8.57,2,2,0,0,85.0,2,-2,-1.0,-1,0,0

96,2014-11-24 00:00:00,H,W,38,53,71.7,349,6.58,2,1,0,0,94.0,0,0,0,0,0,0

97,2014-12-01 00:00:00,A,L,22,35,62.9,245,7.00,2,0,1,9,102.7,1,-1,-1.0,-1,0,0

98,2014-12-08 00:00:00,A,W,28,44,63.6,317,7.20,2,1,1,7,90.8,4,7,1.8,5,0,0

99,2014-12-15 00:00:00,H,W,21,35,60.0,287,8.20,2,1,0,0,93.4,3,18,6.0,17,0,0

100,2014-12-22 00:00:00,A,W,23,35,65.7,182,5.20,1,1,4,36,76.1,7,10,1.4,11,0,0

101,2014-12-29 00:00:00,H,L,8,16,50.0,80,5.00,0,0,1,7,64.6,2,9,4.5,7,0,0

102,2015-09-14 00:00:00,H,W,25,32,78.1,288,9.00,4,0,2,7,143.8,3,1,0.3,2,0,0

QB - Yahoo

//[@id="yui_3_18_1_1_1442371020344_845"] //[@id="yui_3_18_1_1_1442371020344_841"]


In [33]:
%pylab inline

import pandas as pd
import matplotlib.pyplot as plt
import os

def test_run():
    dfSPY = pd.read_csv("tom-brady_187741.csv")
    print dfSPY.head()
    
test_run()


Populating the interactive namespace from numpy and matplotlib
   idx                 DATE OPPONENT RESULT  CMP  PATT   PCT  PYDS       PAVG  \
0    0  2009-09-14 00:00:00        H      W   53    39  73.6   378   9.692308   
1    1  2009-09-20 00:00:00        A      L   47    23  48.9   216   9.391304   
2    2  2009-09-27 00:00:00        H      W   42    25  59.5   277  11.080000   
3    3  2009-10-04 00:00:00        H      W   32    21  65.6   258  12.285714   
4    4  2009-10-11 00:00:00        A      L   33    19  57.6   215  11.315789   

   PTD  INT  SAC  SYDS   RATE  RATT  RYDS  RAVG  RLG  RTD  FUM  
0    2    1    1    10   97.8     1     9   9.0    9    0    0  
1    0    1    0     0   53.1     1     2   2.0    2    0    0  
2    1    0    0     0   87.1     3     0   0.0    2    0    0  
3    1    0    3    24  100.8     5    11   2.2    7    1    1  
4    2    0    1     6   97.4     1    -1  -1.0   -1    0    1  

In [37]:
def get_PassingYards(symbols, dates):
    """Read stock data (adjusted close) for given symbols from CSV files."""
    df = pd.DataFrame(index=dates)

    for symbol in symbols:
        # TODO: Read and join data for each symbol
        df_temp = pd.read_csv("data/{}.csv".format(symbol), index_col=" DATE", parse_dates=True ,usecols= [' DATE', 'PYDS'], 
                        na_values=['nan'])
        df_temp = df_temp.rename(columns={'PYDS': symbol})
        if symbol == 'peyton-manning_12531':  # drop dates SPY did not trade
            df = df.dropna(subset=["tom-brady_187741"])
        df=df.join(df_temp)
    return df


def test_run():
    # Define a date range
    dates = pd.date_range('2014-08-22', '2015-03-26')

    # Choose stock symbols to read
    symbols = ['tom-brady_187741', 'peyton-manning_12531']
    
    # Get stock data
    df = get_PassingYards(symbols, dates)
    print df
    df.plot()
    
    
test_run()


            tom-brady_187741  peyton-manning_12531
2014-09-08               249                   269
2014-09-15               149                   242
2014-09-22               234                   303
2014-09-29               159                   NaN
2014-10-06               292                   479
2014-10-13               361                   237
2014-10-20               261                   318
2014-10-27               354                   286
2014-11-03               333                   438
2014-11-17               257                   389
2014-11-24               349                   257
2014-12-01               245                   179
2014-12-08               317                   173
2014-12-15               287                   233
2014-12-22               182                   311
2014-12-29                80                   273

In [ ]: