Data Science Portfolio

Scrape NBA Player Game Logs from ESPN with lxml

Building the Scraper

Import modules

import csv
import time
import string
import datetime
import requests
import lxml.html as lh
import json
import numpy as np
import pandas as pd
def parse_table(table):
    tr_elements = table.xpath('./tbody//tr')
    for tr_element in tr_elements:
        td_elements = tr_element.xpath('./td')
        if td_elements:
            for td_element in td_elements:
                print('td_element: ', td_element.text_content())

Load RPM data and save to new DataFrame

# Load rpm data to extract game log urls
rpm = pd.read_csv('nba_rpm_data_2018.csv')
rpm = rpm.drop(columns='Unnamed: 0')
rpm.head()
RK NAME POS TEAM GP MPG ORPM DRPM RPM WINS GAME LOG PAGE
0 1 Paul George SF OKC 77 36.9 4.48 3.08 7.56 19.73 http://www.espn.com/nba/player/gamelog/_/id/42...
1 2 James Harden PG HOU 78 36.8 7.41 0.00 7.41 18.53 http://www.espn.com/nba/player/gamelog/_/id/39...
2 3 Stephen Curry PG GS 69 33.8 5.92 0.81 6.73 15.07 http://www.espn.com/nba/player/gamelog/_/id/39...
3 4 Giannis Antetokounmpo PF MIL 72 32.8 3.12 3.39 6.51 14.94 http://www.espn.com/nba/player/gamelog/_/id/30...
4 5 Joel Embiid C PHI 64 33.7 2.70 3.71 6.41 12.91 http://www.espn.com/nba/player/gamelog/_/id/30...

Save urls to list

urls = list(rpm['GAME LOG PAGE'])
print('urls[:5]: ', urls[:5])
urls[:5]:  ['http://www.espn.com/nba/player/gamelog/_/id/4251/paul-george', 'http://www.espn.com/nba/player/gamelog/_/id/3992/james-harden', 'http://www.espn.com/nba/player/gamelog/_/id/3975/stephen-curry', 'http://www.espn.com/nba/player/gamelog/_/id/3032977/giannis-antetokounmpo', 'http://www.espn.com/nba/player/gamelog/_/id/3059318/joel-embiid']

Loop through the list and scrape each url

for url in urls:
    page = requests.get(url)
    doc = lh.fromstring(page.content)
    div = doc.xpath('//*[@id="fittPageContainer"]/div[2]/div[5]/div/div[1]/div[1]/div/div[3]')[0]
    tables = div.xpath('//table[@class=\'Table2__table-scroller Table2__right-aligned Table2__table\']')
    tables = tables[2:-3]
    
    # ...
url = 'http://www.espn.com/nba/player/gamelog/_/id/4251/paul-george'

page = requests.get(url)

doc = lh.fromstring(page.content)

div = doc.xpath('//*[@id="fittPageContainer"]/div[2]/div[5]/div/div[1]/div[1]/div/div[3]')

# Convert list to single item
div = div[0]

print('div: ', div)
# Now get the divs that contain the stats tables for each month
divs = div.xpath('//div[@class=\'mb5\']')
print('divs: ', divs)
tables = div.xpath('//table[@class=\'Table2__table-scroller Table2__right-aligned Table2__table\']')
tables = tables[2:-3]
print('tables: ', tables)

Loop through each game log table and extract its <td> elements

for url in urls:

    # ...
    
    # Create empty dataframe with columns
    df = pd.DataFrame(columns=['Date', 'Day of Week', 'Opp', 'Location', 'Result', 'Score', 'Min', 'FG', 'FG%', '3PT', '3PT%', 'FT', 'FT%', 'REB', 'AST', 'BLK', 'STL', 'PF', 'TO', 'PTS', 'FPTS'])
    months = ['october', 'november', 'december', 'january', 'february', 'march', 'april']
    game_log = []

    for table in tables:
        # Get <tr> elements
        tr_elements = table.xpath('./tbody//tr')
        for tr_element in tr_elements:
            # Get <td> elements
            td_elements = tr_element.xpath('./td[@class=\'Table2__td\']')
            
            # ...

Parse each row of the table

for url in urls:

    # ...

    for table in tables:
    
        # ...

            if td_elements:
                # Ignore average stats row
                if td_elements[0].text_content() in months:
                    break
                count = 0
                game = []
                for td_element in td_elements:
                    # Get date
                    if count == 0:
                        game.append(td_element.text_content().split(' ')[1])
                        game.append(td_element.text_content().split(' ')[0])
                    # Determine if home/road
                    elif count == 1:
                        if 'vs' in td_element.text_content():
                            game.append(td_element.text_content().replace('vs', ''))
                            game.append('Home')
                        elif '@' in td_element.text_content():
                            game.append(td_element.text_content().replace('@', ''))
                            game.append('Away')
                    # Determine if win/loss
                    elif count == 2:
                        if 'W' in td_element.text_content():
                            game.append('W')
                            game.append(td_element.text_content().replace('W', ''))
                        elif 'L' in td_element.text_content():
                            game.append('L')
                            game.append(td_element.text_content().replace('L', ''))
                    elif count > 2:
                        game.append(td_element.text_content())
                    count += 1
                    
                    # ...

Calculate Fanduel points and add row to game log DataFrame

for url in urls:

    # ...

    for table in tables:
    
        # ...

            if td_elements:

                # ...
                
                for td_element in td_elements:

                    # ...
                    
                # Calculate total Fanduel points scored
                game.append(1.2*int(game[13])+1.5*int(game[14])+3*int(game[15])+3*int(game[16])+int(game[19])-int(game[18]))

                # Add to game log
                df.loc[len(df)] = game

Our Complete Scraper

import csv
import time
import string
import datetime
import requests
import lxml.html as lh
import json
import numpy as np
import pandas as pd

# Load rpm data to extract game log urls
rpm = pd.read_csv('nba_rpm_data_2018.csv')
rpm = rpm.drop(columns='Unnamed: 0')
rpm.head()

urls = list(rpm['GAME LOG PAGE'])

for url in urls:
    # Create empty dataframe with columns
    df = pd.DataFrame(columns=['Date', 'Day of Week', 'Opp', 'Location', 'Result', 'Score', 'Min', 'FG', 'FG%', '3PT', '3PT%', 'FT', 'FT%', 'REB', 'AST', 'BLK', 'STL', 'PF', 'TO', 'PTS', 'FPTS'])
    months = ['october', 'november', 'december', 'january', 'february', 'march', 'april']
    game_log = []

    for table in tables:
        # Get <tr> elements
        tr_elements = table.xpath('./tbody//tr')
        for tr_element in tr_elements:
            # Get <td> elements
            td_elements = tr_element.xpath('./td[@class=\'Table2__td\']')
            if td_elements:
                # Ignore average stats row
                if td_elements[0].text_content() in months:
                    break
                count = 0
                game = [] # to store data from a single game
                for td_element in td_elements:
                    print('td_element: ', td_element.text_content())
                    print('count: ', count)                
                    # Get date
                    if count == 0:
                        print('count = 0\n')
                        print('Date: {}\n'.format(td_element.text_content().split(' ')[1]))
                        print('Day of Week: {}\n'.format(td_element.text_content().split(' ')[0]))
                        game.append(td_element.text_content().split(' ')[1])
                        game.append(td_element.text_content().split(' ')[0])
                    # Determine if home/road
                    elif count == 1:
                        if 'vs' in td_element.text_content():
                            game.append(td_element.text_content().replace('vs', ''))
                            game.append('Home')
                        elif '@' in td_element.text_content():
                            game.append(td_element.text_content().replace('@', ''))
                            game.append('Away')
                    # Determine if win/loss
                    elif count == 2:
                        if 'W' in td_element.text_content():
                            game.append('W')
                            game.append(td_element.text_content().replace('W', ''))
                        elif 'L' in td_element.text_content():
                            game.append('L')
                            game.append(td_element.text_content().replace('L', ''))
                    elif count > 2:
                        game.append(td_element.text_content())
                    count += 1
                # Calculate total Fanduel points scored
                game.append(1.2*int(game[13])+1.5*int(game[14])+3*int(game[15])+3*int(game[16])+int(game[19])-int(game[18]))

                # Add to game log
                df.loc[len(df)] = game
    break

    df.head()
td_element:  Sun 4/7
count:  0
count = 0

Date: 4/7

Day of Week: Sun

td_element:  @BOS
count:  1
td_element:  W116-108
count:  2
td_element:  34
count:  3
td_element:  12-22
count:  4
td_element:  54.5
count:  5
td_element:  1-4
count:  6
td_element:  25.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  12
count:  10
td_element:  4
count:  11
td_element:  2
count:  12
td_element:  1
count:  13
td_element:  3
count:  14
td_element:  3
count:  15
td_element:  25
count:  16
td_element:  Fri 4/5
count:  0
count = 0

Date: 4/5

Day of Week: Fri

td_element:  vsATL
count:  1
td_element:  W149-113
count:  2
td_element:  30
count:  3
td_element:  9-13
count:  4
td_element:  69.2
count:  5
td_element:  2-4
count:  6
td_element:  50.0
count:  7
td_element:  5-6
count:  8
td_element:  83.3
count:  9
td_element:  11
count:  10
td_element:  4
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  3
count:  14
td_element:  2
count:  15
td_element:  25
count:  16
td_element:  Wed 4/3
count:  0
count = 0

Date: 4/3

Day of Week: Wed

td_element:  vsNY
count:  1
td_element:  W114-100
count:  2
td_element:  33
count:  3
td_element:  11-21
count:  4
td_element:  52.4
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  6-8
count:  8
td_element:  75.0
count:  9
td_element:  13
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  0
count:  13
td_element:  4
count:  14
td_element:  3
count:  15
td_element:  29
count:  16
td_element:  Mon 4/1
count:  0
count = 0

Date: 4/1

Day of Week: Mon

td_element:  @TOR
count:  1
td_element:  L121-109
count:  2
td_element:  26
count:  3
td_element:  5-14
count:  4
td_element:  35.7
count:  5
td_element:  2-3
count:  6
td_element:  66.7
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  13
count:  10
td_element:  3
count:  11
td_element:  0
count:  12
td_element:  0
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  13
count:  16
td_element:  Sat 3/30
count:  0
count = 0

Date: 3/30

Day of Week: Sat

td_element:  @IND
count:  1
td_element:  W121-116
count:  2
td_element:  32
count:  3
td_element:  8-18
count:  4
td_element:  44.4
count:  5
td_element:  0-3
count:  6
td_element:  0.0
count:  7
td_element:  3-4
count:  8
td_element:  75.0
count:  9
td_element:  2
count:  10
td_element:  2
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  3
count:  15
td_element:  19
count:  16
td_element:  Thu 3/28
count:  0
count = 0

Date: 3/28

Day of Week: Thu

td_element:  @DET
count:  1
td_element:  L115-98
count:  2
td_element:  33
count:  3
td_element:  5-15
count:  4
td_element:  33.3
count:  5
td_element:  0-2
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  12
count:  10
td_element:  4
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  3
count:  14
td_element:  4
count:  15
td_element:  12
count:  16
td_element:  Tue 3/26
count:  0
count = 0

Date: 3/26

Day of Week: Tue

td_element:  @MIA
count:  1
td_element:  W104-99
count:  2
td_element:  34
count:  3
td_element:  10-18
count:  4
td_element:  55.6
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  16
count:  10
td_element:  5
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  24
count:  16
td_element:  Mon 3/25
count:  0
count = 0

Date: 3/25

Day of Week: Mon

td_element:  vsPHI
count:  1
td_element:  W119-98
count:  2
td_element:  29
count:  3
td_element:  11-21
count:  4
td_element:  52.4
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  4-4
count:  8
td_element:  100.0
count:  9
td_element:  11
count:  10
td_element:  4
count:  11
td_element:  0
count:  12
td_element:  0
count:  13
td_element:  0
count:  14
td_element:  0
count:  15
td_element:  28
count:  16
td_element:  Fri 3/22
count:  0
count = 0

Date: 3/22

Day of Week: Fri

td_element:  vsMEM
count:  1
td_element:  W123-119 OT
count:  2
td_element:  41
count:  3
td_element:  12-23
count:  4
td_element:  52.2
count:  5
td_element:  0-4
count:  6
td_element:  0.0
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  4
count:  10
td_element:  3
count:  11
td_element:  2
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  0
count:  15
td_element:  25
count:  16
td_element:  Wed 3/20
count:  0
count = 0

Date: 3/20

Day of Week: Wed

td_element:  vsNO
count:  1
td_element:  W119-96
count:  2
td_element:  26
count:  3
td_element:  5-14
count:  4
td_element:  35.7
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  4-4
count:  8
td_element:  100.0
count:  9
td_element:  17
count:  10
td_element:  3
count:  11
td_element:  3
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  3
count:  15
td_element:  15
count:  16
td_element:  Sun 3/17
count:  0
count = 0

Date: 3/17

Day of Week: Sun

td_element:  vsATL
count:  1
td_element:  W101-91
count:  2
td_element:  34
count:  3
td_element:  10-20
count:  4
td_element:  50.0
count:  5
td_element:  0-3
count:  6
td_element:  0.0
count:  7
td_element:  7-7
count:  8
td_element:  100.0
count:  9
td_element:  20
count:  10
td_element:  3
count:  11
td_element:  0
count:  12
td_element:  3
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  27
count:  16
td_element:  Thu 3/14
count:  0
count = 0

Date: 3/14

Day of Week: Thu

td_element:  vsCLE
count:  1
td_element:  W120-91
count:  2
td_element:  27
count:  3
td_element:  9-15
count:  4
td_element:  60.0
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  1-1
count:  8
td_element:  100.0
count:  9
td_element:  11
count:  10
td_element:  2
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  0
count:  14
td_element:  1
count:  15
td_element:  19
count:  16
td_element:  Wed 3/13
count:  0
count = 0

Date: 3/13

Day of Week: Wed

td_element:  @WSH
count:  1
td_element:  L100-90
count:  2
td_element:  35
count:  3
td_element:  9-17
count:  4
td_element:  52.9
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  14
count:  10
td_element:  2
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  3
count:  14
td_element:  3
count:  15
td_element:  20
count:  16
td_element:  Sun 3/10
count:  0
count = 0

Date: 3/10

Day of Week: Sun

td_element:  @MEM
count:  1
td_element:  L105-97
count:  2
td_element:  35
count:  3
td_element:  10-24
count:  4
td_element:  41.7
count:  5
td_element:  1-6
count:  6
td_element:  16.7
count:  7
td_element:  5-6
count:  8
td_element:  83.3
count:  9
td_element:  10
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  3
count:  14
td_element:  2
count:  15
td_element:  26
count:  16
td_element:  Fri 3/8
count:  0
count = 0

Date: 3/8

Day of Week: Fri

td_element:  vsDAL
count:  1
td_element:  W111-106
count:  2
td_element:  35
count:  3
td_element:  8-17
count:  4
td_element:  47.1
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  3-4
count:  8
td_element:  75.0
count:  9
td_element:  13
count:  10
td_element:  6
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  3
count:  15
td_element:  20
count:  16
td_element:  Tue 3/5
count:  0
count = 0

Date: 3/5

Day of Week: Tue

td_element:  @PHI
count:  1
td_element:  L114-106
count:  2
td_element:  34
count:  3
td_element:  5-15
count:  4
td_element:  33.3
count:  5
td_element:  0-1
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  12
count:  10
td_element:  2
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  12
count:  16
td_element:  Sun 3/3
count:  0
count = 0

Date: 3/3

Day of Week: Sun

td_element:  @CLE
count:  1
td_element:  L107-93
count:  2
td_element:  36
count:  3
td_element:  13-16
count:  4
td_element:  81.3
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  13
count:  10
td_element:  6
count:  11
td_element:  2
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  3
count:  15
td_element:  28
count:  16
td_element:  Sat 3/2
count:  0
count = 0

Date: 3/2

Day of Week: Sat

td_element:  @IND
count:  1
td_element:  W117-112
count:  2
td_element:  32
count:  3
td_element:  11-19
count:  4
td_element:  57.9
count:  5
td_element:  0-3
count:  6
td_element:  0.0
count:  7
td_element:  5-7
count:  8
td_element:  71.4
count:  9
td_element:  8
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  0
count:  15
td_element:  27
count:  16
td_element:  Thu 2/28
count:  0
count = 0

Date: 2/28

Day of Week: Thu

td_element:  vsGS
count:  1
td_element:  W103-96
count:  2
td_element:  30
count:  3
td_element:  4-15
count:  4
td_element:  26.7
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  3-4
count:  8
td_element:  75.0
count:  9
td_element:  13
count:  10
td_element:  6
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  12
count:  16
td_element:  Tue 2/26
count:  0
count = 0

Date: 2/26

Day of Week: Tue

td_element:  @NY
count:  1
td_element:  L108-103
count:  2
td_element:  34
count:  3
td_element:  12-19
count:  4
td_element:  63.2
count:  5
td_element:  2-2
count:  6
td_element:  100.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  11
count:  10
td_element:  6
count:  11
td_element:  3
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  1
count:  15
td_element:  26
count:  16
td_element:  Sun 2/24
count:  0
count = 0

Date: 2/24

Day of Week: Sun

td_element:  @TOR
count:  1
td_element:  W113-98
count:  2
td_element:  31
count:  3
td_element:  10-17
count:  4
td_element:  58.8
count:  5
td_element:  3-4
count:  6
td_element:  75.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  12
count:  10
td_element:  4
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  1
count:  14
td_element:  0
count:  15
td_element:  23
count:  16
td_element:  Fri 2/22
count:  0
count = 0

Date: 2/22

Day of Week: Fri

td_element:  vsCHI
count:  1
td_element:  L110-109
count:  2
td_element:  29
count:  3
td_element:  9-16
count:  4
td_element:  56.3
count:  5
td_element:  0-1
count:  6
td_element:  0.0
count:  7
td_element:  1-4
count:  8
td_element:  25.0
count:  9
td_element:  13
count:  10
td_element:  7
count:  11
td_element:  2
count:  12
td_element:  2
count:  13
td_element:  3
count:  14
td_element:  2
count:  15
td_element:  19
count:  16
td_element:  Sun 2/17
count:  0
count = 0

Date: 2/17

Day of Week: Sun

td_element:  vsLEB*
count:  1
td_element:  L178-164
count:  2
td_element:  12
count:  3
td_element:  2-2
count:  4
td_element:  100.0
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  5
count:  10
td_element:  2
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  0
count:  14
td_element:  0
count:  15
td_element:  4
count:  16
td_element:  Thu 2/14
count:  0
count = 0

Date: 2/14

Day of Week: Thu

td_element:  vsCHA
count:  1
td_element:  W127-89
count:  2
td_element:  26
count:  3
td_element:  7-13
count:  4
td_element:  53.8
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  2-3
count:  8
td_element:  66.7
count:  9
td_element:  11
count:  10
td_element:  4
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  17
count:  16
td_element:  Tue 2/12
count:  0
count = 0

Date: 2/12

Day of Week: Tue

td_element:  @NO
count:  1
td_element:  W118-88
count:  2
td_element:  27
count:  3
td_element:  10-18
count:  4
td_element:  55.6
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  4-5
count:  8
td_element:  80.0
count:  9
td_element:  17
count:  10
td_element:  3
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  1
count:  14
td_element:  0
count:  15
td_element:  25
count:  16
td_element:  Sun 2/10
count:  0
count = 0

Date: 2/10

Day of Week: Sun

td_element:  @ATL
count:  1
td_element:  W124-108
count:  2
td_element:  29
count:  3
td_element:  8-13
count:  4
td_element:  61.5
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  12
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  0
count:  13
td_element:  2
count:  14
td_element:  1
count:  15
td_element:  19
count:  16
td_element:  Sat 2/9
count:  0
count = 0

Date: 2/9

Day of Week: Sat

td_element:  @MIL
count:  1
td_element:  W103-83
count:  2
td_element:  26
count:  3
td_element:  7-16
count:  4
td_element:  43.8
count:  5
td_element:  1-4
count:  6
td_element:  25.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  17
count:  10
td_element:  5
count:  11
td_element:  1
count:  12
td_element:  0
count:  13
td_element:  0
count:  14
td_element:  1
count:  15
td_element:  15
count:  16
td_element:  Thu 2/7
count:  0
count = 0

Date: 2/7

Day of Week: Thu

td_element:  vsMIN
count:  1
td_element:  W122-112
count:  2
td_element:  31
count:  3
td_element:  9-16
count:  4
td_element:  56.3
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  10
count:  10
td_element:  3
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  1
count:  15
td_element:  21
count:  16
td_element:  Tue 2/5
count:  0
count = 0

Date: 2/5

Day of Week: Tue

td_element:  @OKC
count:  1
td_element:  L132-122
count:  2
td_element:  34
count:  3
td_element:  8-18
count:  4
td_element:  44.4
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  9
count:  10
td_element:  5
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  4
count:  15
td_element:  17
count:  16
td_element:  Sat 2/2
count:  0
count = 0

Date: 2/2

Day of Week: Sat

td_element:  vsBKN
count:  1
td_element:  W102-89
count:  2
td_element:  32
count:  3
td_element:  12-22
count:  4
td_element:  54.5
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  12
count:  10
td_element:  4
count:  11
td_element:  3
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  2
count:  15
td_element:  24
count:  16
td_element:  Thu 1/31
count:  0
count = 0

Date: 1/31

Day of Week: Thu

td_element:  vsIND
count:  1
td_element:  W107-100
count:  2
td_element:  35
count:  3
td_element:  8-15
count:  4
td_element:  53.3
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  10
count:  10
td_element:  5
count:  11
td_element:  0
count:  12
td_element:  0
count:  13
td_element:  3
count:  14
td_element:  3
count:  15
td_element:  17
count:  16
td_element:  Tue 1/29
count:  0
count = 0

Date: 1/29

Day of Week: Tue

td_element:  vsOKC
count:  1
td_element:  L126-117
count:  2
td_element:  34
count:  3
td_element:  12-20
count:  4
td_element:  60.0
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  11
count:  10
td_element:  5
count:  11
td_element:  2
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  3
count:  15
td_element:  27
count:  16
td_element:  Sun 1/27
count:  0
count = 0

Date: 1/27

Day of Week: Sun

td_element:  @HOU
count:  1
td_element:  L103-98
count:  2
td_element:  34
count:  3
td_element:  8-19
count:  4
td_element:  42.1
count:  5
td_element:  0-2
count:  6
td_element:  0.0
count:  7
td_element:  3-4
count:  8
td_element:  75.0
count:  9
td_element:  17
count:  10
td_element:  5
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  4
count:  14
td_element:  4
count:  15
td_element:  19
count:  16
td_element:  Fri 1/25
count:  0
count = 0

Date: 1/25

Day of Week: Fri

td_element:  vsWSH
count:  1
td_element:  L95-91
count:  2
td_element:  31
count:  3
td_element:  12-17
count:  4
td_element:  70.6
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  3-5
count:  8
td_element:  60.0
count:  9
td_element:  9
count:  10
td_element:  1
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  5
count:  14
td_element:  3
count:  15
td_element:  28
count:  16
td_element:  Wed 1/23
count:  0
count = 0

Date: 1/23

Day of Week: Wed

td_element:  @BKN
count:  1
td_element:  L114-110
count:  2
td_element:  33
count:  3
td_element:  9-20
count:  4
td_element:  45.0
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  14
count:  10
td_element:  5
count:  11
td_element:  4
count:  12
td_element:  2
count:  13
td_element:  3
count:  14
td_element:  4
count:  15
td_element:  21
count:  16
td_element:  Mon 1/21
count:  0
count = 0

Date: 1/21

Day of Week: Mon

td_element:  @ATL
count:  1
td_element:  W122-103
count:  2
td_element:  35
count:  3
td_element:  12-23
count:  4
td_element:  52.2
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  4-4
count:  8
td_element:  100.0
count:  9
td_element:  14
count:  10
td_element:  2
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  0
count:  15
td_element:  29
count:  16
td_element:  Sat 1/19
count:  0
count = 0

Date: 1/19

Day of Week: Sat

td_element:  vsMIL
count:  1
td_element:  L118-108
count:  2
td_element:  30
count:  3
td_element:  11-24
count:  4
td_element:  45.8
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  3-3
count:  8
td_element:  100.0
count:  9
td_element:  6
count:  10
td_element:  4
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  0
count:  14
td_element:  0
count:  15
td_element:  27
count:  16
td_element:  Fri 1/18
count:  0
count = 0

Date: 1/18

Day of Week: Fri

td_element:  vsBKN
count:  1
td_element:  L117-115
count:  2
td_element:  33
count:  3
td_element:  7-20
count:  4
td_element:  35.0
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  1-1
count:  8
td_element:  100.0
count:  9
td_element:  17
count:  10
td_element:  6
count:  11
td_element:  1
count:  12
td_element:  0
count:  13
td_element:  0
count:  14
td_element:  0
count:  15
td_element:  16
count:  16
td_element:  Wed 1/16
count:  0
count = 0

Date: 1/16

Day of Week: Wed

td_element:  @DET
count:  1
td_element:  L120-115 OT
count:  2
td_element:  38
count:  3
td_element:  11-22
count:  4
td_element:  50.0
count:  5
td_element:  2-4
count:  6
td_element:  50.0
count:  7
td_element:  0-1
count:  8
td_element:  0.0
count:  9
td_element:  13
count:  10
td_element:  3
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  2
count:  15
td_element:  24
count:  16
td_element:  Sun 1/13
count:  0
count = 0

Date: 1/13

Day of Week: Sun

td_element:  vsHOU
count:  1
td_element:  W116-109
count:  2
td_element:  35
count:  3
td_element:  9-16
count:  4
td_element:  56.3
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  3-4
count:  8
td_element:  75.0
count:  9
td_element:  9
count:  10
td_element:  6
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  4
count:  14
td_element:  2
count:  15
td_element:  22
count:  16
td_element:  Sat 1/12
count:  0
count = 0

Date: 1/12

Day of Week: Sat

td_element:  vsBOS
count:  1
td_element:  W105-103
count:  2
td_element:  30
count:  3
td_element:  7-18
count:  4
td_element:  38.9
count:  5
td_element:  0-4
count:  6
td_element:  0.0
count:  7
td_element:  2-4
count:  8
td_element:  50.0
count:  9
td_element:  13
count:  10
td_element:  5
count:  11
td_element:  0
count:  12
td_element:  0
count:  13
td_element:  0
count:  14
td_element:  4
count:  15
td_element:  16
count:  16
td_element:  Wed 1/9
count:  0
count = 0

Date: 1/9

Day of Week: Wed

td_element:  @UTAH
count:  1
td_element:  L106-93
count:  2
td_element:  31
count:  3
td_element:  8-17
count:  4
td_element:  47.1
count:  5
td_element:  3-4
count:  6
td_element:  75.0
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  8
count:  10
td_element:  3
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  4
count:  14
td_element:  2
count:  15
td_element:  20
count:  16
td_element:  Mon 1/7
count:  0
count = 0

Date: 1/7

Day of Week: Mon

td_element:  @SAC
count:  1
td_element:  L111-95
count:  2
td_element:  25
count:  3
td_element:  7-14
count:  4
td_element:  50.0
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  3-4
count:  8
td_element:  75.0
count:  9
td_element:  13
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  1
count:  15
td_element:  18
count:  16
td_element:  Sun 1/6
count:  0
count = 0

Date: 1/6

Day of Week: Sun

td_element:  @LAC
count:  1
td_element:  L106-96
count:  2
td_element:  32
count:  3
td_element:  7-17
count:  4
td_element:  41.2
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  24
count:  10
td_element:  8
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  3
count:  15
td_element:  16
count:  16
td_element:  Fri 1/4
count:  0
count = 0

Date: 1/4

Day of Week: Fri

td_element:  @MIN
count:  1
td_element:  L120-103
count:  2
td_element:  27
count:  3
td_element:  10-16
count:  4
td_element:  62.5
count:  5
td_element:  1-4
count:  6
td_element:  25.0
count:  7
td_element:  1-1
count:  8
td_element:  100.0
count:  9
td_element:  7
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  1
count:  15
td_element:  22
count:  16
td_element:  Wed 1/2
count:  0
count = 0

Date: 1/2

Day of Week: Wed

td_element:  @CHI
count:  1
td_element:  W112-84
count:  2
td_element:  26
count:  3
td_element:  10-15
count:  4
td_element:  66.7
count:  5
td_element:  1-1
count:  6
td_element:  100.0
count:  7
td_element:  1-3
count:  8
td_element:  33.3
count:  9
td_element:  12
count:  10
td_element:  3
count:  11
td_element:  3
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  22
count:  16
td_element:  Mon 12/31
count:  0
count = 0

Date: 12/31

Day of Week: Mon

td_element:  @CHA
count:  1
td_element:  L125-100
count:  2
td_element:  23
count:  3
td_element:  5-13
count:  4
td_element:  38.5
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  1-4
count:  8
td_element:  25.0
count:  9
td_element:  5
count:  10
td_element:  2
count:  11
td_element:  2
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  0
count:  15
td_element:  12
count:  16
td_element:  Sun 12/30
count:  0
count = 0

Date: 12/30

Day of Week: Sun

td_element:  vsDET
count:  1
td_element:  W109-107
count:  2
td_element:  34
count:  3
td_element:  10-15
count:  4
td_element:  66.7
count:  5
td_element:  0-2
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  11
count:  10
td_element:  4
count:  11
td_element:  2
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  3
count:  15
td_element:  22
count:  16
td_element:  Fri 12/28
count:  0
count = 0

Date: 12/28

Day of Week: Fri

td_element:  vsTOR
count:  1
td_element:  W116-87
count:  2
td_element:  33
count:  3
td_element:  12-17
count:  4
td_element:  70.6
count:  5
td_element:  0-1
count:  6
td_element:  0.0
count:  7
td_element:  6-8
count:  8
td_element:  75.0
count:  9
td_element:  19
count:  10
td_element:  8
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  1
count:  14
td_element:  1
count:  15
td_element:  30
count:  16
td_element:  Wed 12/26
count:  0
count = 0

Date: 12/26

Day of Week: Wed

td_element:  vsPHX
count:  1
td_element:  L122-120 OT
count:  2
td_element:  39
count:  3
td_element:  10-20
count:  4
td_element:  50.0
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  13
count:  10
td_element:  2
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  1
count:  14
td_element:  4
count:  15
td_element:  22
count:  16
td_element:  Sun 12/23
count:  0
count = 0

Date: 12/23

Day of Week: Sun

td_element:  vsMIA
count:  1
td_element:  L115-91
count:  2
td_element:  29
count:  3
td_element:  3-12
count:  4
td_element:  25.0
count:  5
td_element:  0-1
count:  6
td_element:  0.0
count:  7
td_element:  2-5
count:  8
td_element:  40.0
count:  9
td_element:  7
count:  10
td_element:  0
count:  11
td_element:  1
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  3
count:  15
td_element:  8
count:  16
td_element:  Fri 12/21
count:  0
count = 0

Date: 12/21

Day of Week: Fri

td_element:  @CHI
count:  1
td_element:  L90-80
count:  2
td_element:  37
count:  3
td_element:  8-19
count:  4
td_element:  42.1
count:  5
td_element:  1-5
count:  6
td_element:  20.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  19
count:  10
td_element:  4
count:  11
td_element:  4
count:  12
td_element:  0
count:  13
td_element:  3
count:  14
td_element:  0
count:  15
td_element:  19
count:  16
td_element:  Sat 12/15
count:  0
count = 0

Date: 12/15

Day of Week: Sat

td_element:  vsUTAH
count:  1
td_element:  W96-89
count:  2
td_element:  30
count:  3
td_element:  5-14
count:  4
td_element:  35.7
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  4-4
count:  8
td_element:  100.0
count:  9
td_element:  19
count:  10
td_element:  5
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  3
count:  14
td_element:  2
count:  15
td_element:  15
count:  16
td_element:  Thu 12/13
count:  0
count = 0

Date: 12/13

Day of Week: Thu

td_element:  vsCHI
count:  1
td_element:  W97-91
count:  2
td_element:  33
count:  3
td_element:  11-21
count:  4
td_element:  52.4
count:  5
td_element:  3-6
count:  6
td_element:  50.0
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  10
count:  10
td_element:  2
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  26
count:  16
td_element:  Mon 12/10
count:  0
count = 0

Date: 12/10

Day of Week: Mon

td_element:  @DAL
count:  1
td_element:  L101-76
count:  2
td_element:  26
count:  3
td_element:  4-15
count:  4
td_element:  26.7
count:  5
td_element:  0-1
count:  6
td_element:  0.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  16
count:  10
td_element:  4
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  1
count:  14
td_element:  3
count:  15
td_element:  8
count:  16
td_element:  Fri 12/7
count:  0
count = 0

Date: 12/7

Day of Week: Fri

td_element:  vsIND
count:  1
td_element:  L112-90
count:  2
td_element:  26
count:  3
td_element:  9-17
count:  4
td_element:  52.9
count:  5
td_element:  1-4
count:  6
td_element:  25.0
count:  7
td_element:  3-3
count:  8
td_element:  100.0
count:  9
td_element:  10
count:  10
td_element:  2
count:  11
td_element:  0
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  2
count:  15
td_element:  22
count:  16
td_element:  Wed 12/5
count:  0
count = 0

Date: 12/5

Day of Week: Wed

td_element:  vsDEN
count:  1
td_element:  L124-118 OT
count:  2
td_element:  37
count:  3
td_element:  11-19
count:  4
td_element:  57.9
count:  5
td_element:  2-4
count:  6
td_element:  50.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  15
count:  10
td_element:  4
count:  11
td_element:  0
count:  12
td_element:  0
count:  13
td_element:  2
count:  14
td_element:  1
count:  15
td_element:  24
count:  16
td_element:  Tue 12/4
count:  0
count = 0

Date: 12/4

Day of Week: Tue

td_element:  @MIA
count:  1
td_element:  W105-90
count:  2
td_element:  33
count:  3
td_element:  8-16
count:  4
td_element:  50.0
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  10
count:  10
td_element:  3
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  1
count:  15
td_element:  19
count:  16
td_element:  Fri 11/30
count:  0
count = 0

Date: 11/30

Day of Week: Fri

td_element:  @PHX
count:  1
td_element:  W99-85
count:  2
td_element:  32
count:  3
td_element:  11-20
count:  4
td_element:  55.0
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  15
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  3
count:  14
td_element:  2
count:  15
td_element:  25
count:  16
td_element:  Wed 11/28
count:  0
count = 0

Date: 11/28

Day of Week: Wed

td_element:  @POR
count:  1
td_element:  L115-112
count:  2
td_element:  29
count:  3
td_element:  8-12
count:  4
td_element:  66.7
count:  5
td_element:  2-2
count:  6
td_element:  100.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  8
count:  10
td_element:  7
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  6
count:  14
td_element:  1
count:  15
td_element:  20
count:  16
td_element:  Mon 11/26
count:  0
count = 0

Date: 11/26

Day of Week: Mon

td_element:  @GS
count:  1
td_element:  L116-110
count:  2
td_element:  33
count:  3
td_element:  12-21
count:  4
td_element:  57.1
count:  5
td_element:  1-4
count:  6
td_element:  25.0
count:  7
td_element:  5-6
count:  8
td_element:  83.3
count:  9
td_element:  12
count:  10
td_element:  6
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  4
count:  14
td_element:  1
count:  15
td_element:  30
count:  16
td_element:  Sun 11/25
count:  0
count = 0

Date: 11/25

Day of Week: Sun

td_element:  @LAL
count:  1
td_element:  W108-104
count:  2
td_element:  36
count:  3
td_element:  10-20
count:  4
td_element:  50.0
count:  5
td_element:  3-8
count:  6
td_element:  37.5
count:  7
td_element:  8-8
count:  8
td_element:  100.0
count:  9
td_element:  15
count:  10
td_element:  7
count:  11
td_element:  3
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  3
count:  15
td_element:  31
count:  16
td_element:  Fri 11/23
count:  0
count = 0

Date: 11/23

Day of Week: Fri

td_element:  @DEN
count:  1
td_element:  L112-87
count:  2
td_element:  28
count:  3
td_element:  7-14
count:  4
td_element:  50.0
count:  5
td_element:  0-2
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  8
count:  10
td_element:  0
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  2
count:  15
td_element:  16
count:  16
td_element:  Tue 11/20
count:  0
count = 0

Date: 11/20

Day of Week: Tue

td_element:  vsTOR
count:  1
td_element:  L93-91
count:  2
td_element:  34
count:  3
td_element:  6-12
count:  4
td_element:  50.0
count:  5
td_element:  0-3
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  18
count:  10
td_element:  4
count:  11
td_element:  0
count:  12
td_element:  0
count:  13
td_element:  2
count:  14
td_element:  3
count:  15
td_element:  14
count:  16
td_element:  Sun 11/18
count:  0
count = 0

Date: 11/18

Day of Week: Sun

td_element:  vsNY
count:  1
td_element:  W131-117
count:  2
td_element:  32
count:  3
td_element:  10-15
count:  4
td_element:  66.7
count:  5
td_element:  2-3
count:  6
td_element:  66.7
count:  7
td_element:  6-6
count:  8
td_element:  100.0
count:  9
td_element:  10
count:  10
td_element:  9
count:  11
td_element:  2
count:  12
td_element:  0
count:  13
td_element:  2
count:  14
td_element:  3
count:  15
td_element:  28
count:  16
td_element:  Sat 11/17
count:  0
count = 0

Date: 11/17

Day of Week: Sat

td_element:  vsLAL
count:  1
td_element:  W130-117
count:  2
td_element:  31
count:  3
td_element:  15-23
count:  4
td_element:  65.2
count:  5
td_element:  2-5
count:  6
td_element:  40.0
count:  7
td_element:  4-5
count:  8
td_element:  80.0
count:  9
td_element:  13
count:  10
td_element:  0
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  1
count:  14
td_element:  3
count:  15
td_element:  36
count:  16
td_element:  Wed 11/14
count:  0
count = 0

Date: 11/14

Day of Week: Wed

td_element:  vsPHI
count:  1
td_element:  W111-106
count:  2
td_element:  39
count:  3
td_element:  10-19
count:  4
td_element:  52.6
count:  5
td_element:  3-6
count:  6
td_element:  50.0
count:  7
td_element:  7-8
count:  8
td_element:  87.5
count:  9
td_element:  8
count:  10
td_element:  4
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  1
count:  14
td_element:  1
count:  15
td_element:  30
count:  16
td_element:  Mon 11/12
count:  0
count = 0

Date: 11/12

Day of Week: Mon

td_element:  @WSH
count:  1
td_element:  L117-109
count:  2
td_element:  32
count:  3
td_element:  8-17
count:  4
td_element:  47.1
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  11
count:  10
td_element:  3
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  17
count:  16
td_element:  Sun 11/11
count:  0
count = 0

Date: 11/11

Day of Week: Sun

td_element:  @NY
count:  1
td_element:  W115-89
count:  2
td_element:  26
count:  3
td_element:  10-17
count:  4
td_element:  58.8
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  14
count:  10
td_element:  1
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  2
count:  15
td_element:  21
count:  16
td_element:  Fri 11/9
count:  0
count = 0

Date: 11/9

Day of Week: Fri

td_element:  vsWSH
count:  1
td_element:  W117-108
count:  2
td_element:  31
count:  3
td_element:  10-16
count:  4
td_element:  62.5
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  14
count:  10
td_element:  3
count:  11
td_element:  2
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  21
count:  16
td_element:  Wed 11/7
count:  0
count = 0

Date: 11/7

Day of Week: Wed

td_element:  vsDET
count:  1
td_element:  L103-96
count:  2
td_element:  34
count:  3
td_element:  6-14
count:  4
td_element:  42.9
count:  5
td_element:  0-3
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  9
count:  10
td_element:  4
count:  11
td_element:  1
count:  12
td_element:  0
count:  13
td_element:  5
count:  14
td_element:  4
count:  15
td_element:  14
count:  16
td_element:  Mon 11/5
count:  0
count = 0

Date: 11/5

Day of Week: Mon

td_element:  vsCLE
count:  1
td_element:  W102-100
count:  2
td_element:  27
count:  3
td_element:  6-13
count:  4
td_element:  46.2
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  10
count:  10
td_element:  1
count:  11
td_element:  2
count:  12
td_element:  1
count:  13
td_element:  0
count:  14
td_element:  2
count:  15
td_element:  14
count:  16
td_element:  Sun 11/4
count:  0
count = 0

Date: 11/4

Day of Week: Sun

td_element:  @SA
count:  1
td_element:  W117-110
count:  2
td_element:  32
count:  3
td_element:  6-11
count:  4
td_element:  54.5
count:  5
td_element:  0-1
count:  6
td_element:  0.0
count:  7
td_element:  1-3
count:  8
td_element:  33.3
count:  9
td_element:  8
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  0
count:  15
td_element:  13
count:  16
td_element:  Fri 11/2
count:  0
count = 0

Date: 11/2

Day of Week: Fri

td_element:  vsLAC
count:  1
td_element:  L120-95
count:  2
td_element:  32
count:  3
td_element:  10-21
count:  4
td_element:  47.6
count:  5
td_element:  1-3
count:  6
td_element:  33.3
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  11
count:  10
td_element:  3
count:  11
td_element:  3
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  1
count:  15
td_element:  22
count:  16
td_element:  Tue 10/30
count:  0
count = 0

Date: 10/30

Day of Week: Tue

td_element:  vsSAC
count:  1
td_element:  L107-99
count:  2
td_element:  27
count:  3
td_element:  5-11
count:  4
td_element:  45.5
count:  5
td_element:  0-2
count:  6
td_element:  0.0
count:  7
td_element:  5-6
count:  8
td_element:  83.3
count:  9
td_element:  15
count:  10
td_element:  5
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  1
count:  14
td_element:  3
count:  15
td_element:  15
count:  16
td_element:  Sat 10/27
count:  0
count = 0

Date: 10/27

Day of Week: Sat

td_element:  @MIL
count:  1
td_element:  L113-91
count:  2
td_element:  21
count:  3
td_element:  7-10
count:  4
td_element:  70.0
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  9
count:  10
td_element:  1
count:  11
td_element:  1
count:  12
td_element:  1
count:  13
td_element:  4
count:  14
td_element:  3
count:  15
td_element:  16
count:  16
td_element:  Thu 10/25
count:  0
count = 0

Date: 10/25

Day of Week: Thu

td_element:  vsPOR
count:  1
td_element:  L128-114
count:  2
td_element:  31
count:  3
td_element:  10-16
count:  4
td_element:  62.5
count:  5
td_element:  2-3
count:  6
td_element:  66.7
count:  7
td_element:  2-2
count:  8
td_element:  100.0
count:  9
td_element:  11
count:  10
td_element:  3
count:  11
td_element:  1
count:  12
td_element:  2
count:  13
td_element:  5
count:  14
td_element:  3
count:  15
td_element:  24
count:  16
td_element:  Mon 10/22
count:  0
count = 0

Date: 10/22

Day of Week: Mon

td_element:  @BOS
count:  1
td_element:  W93-90
count:  2
td_element:  33
count:  3
td_element:  11-18
count:  4
td_element:  61.1
count:  5
td_element:  1-2
count:  6
td_element:  50.0
count:  7
td_element:  1-2
count:  8
td_element:  50.0
count:  9
td_element:  12
count:  10
td_element:  1
count:  11
td_element:  0
count:  12
td_element:  3
count:  13
td_element:  1
count:  14
td_element:  0
count:  15
td_element:  24
count:  16
td_element:  Sat 10/20
count:  0
count = 0

Date: 10/20

Day of Week: Sat

td_element:  @PHI
count:  1
td_element:  L116-115
count:  2
td_element:  38
count:  3
td_element:  10-15
count:  4
td_element:  66.7
count:  5
td_element:  4-4
count:  6
td_element:  100.0
count:  7
td_element:  3-3
count:  8
td_element:  100.0
count:  9
td_element:  13
count:  10
td_element:  12
count:  11
td_element:  0
count:  12
td_element:  2
count:  13
td_element:  2
count:  14
td_element:  2
count:  15
td_element:  27
count:  16
td_element:  Fri 10/19
count:  0
count = 0

Date: 10/19

Day of Week: Fri

td_element:  vsCHA
count:  1
td_element:  L120-88
count:  2
td_element:  22
count:  3
td_element:  6-11
count:  4
td_element:  54.5
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  0-0
count:  8
td_element:  0.0
count:  9
td_element:  8
count:  10
td_element:  4
count:  11
td_element:  4
count:  12
td_element:  0
count:  13
td_element:  1
count:  14
td_element:  2
count:  15
td_element:  12
count:  16
td_element:  Wed 10/17
count:  0
count = 0

Date: 10/17

Day of Week: Wed

td_element:  vsMIA
count:  1
td_element:  W104-101
count:  2
td_element:  28
count:  3
td_element:  4-12
count:  4
td_element:  33.3
count:  5
td_element:  0-0
count:  6
td_element:  0.0
count:  7
td_element:  4-5
count:  8
td_element:  80.0
count:  9
td_element:  8
count:  10
td_element:  4
count:  11
td_element:  0
count:  12
td_element:  1
count:  13
td_element:  2
count:  14
td_element:  4
count:  15
td_element:  12
count:  16

Data Engineering

Remove All-Star exhibition from game log

# Remove All-Star game from gamelog
df = df[df.Opp != 'LEB*']
df = df[df.Opp != 'GIA*']

Add year to ‘Date’ column

# Data engineering
df['Date'] = df['Date'].apply(lambda x: x + '/19' if int(x.split('/')[0]) > 0 and int(x.split('/')[0]) <= 4 else x + '/18')
df.head()
Date Day of Week Opp Location Result Score Min FG FG% 3PT ... FT FT% REB AST BLK STL PF TO PTS FPTS
0 4/7/19 Sun BOS Away W 116-108 34 12-22 54.5 1-4 ... 0-0 0.0 12 4 2 1 3 3 25 51.4
1 4/5/19 Fri ATL Home W 149-113 30 9-13 69.2 2-4 ... 5-6 83.3 11 4 0 1 3 2 25 45.2
2 4/3/19 Wed NY Home W 114-100 33 11-21 52.4 1-3 ... 6-8 75.0 13 3 1 0 4 3 29 49.1
3 4/1/19 Mon TOR Away L 121-109 26 5-14 35.7 2-3 ... 1-2 50.0 13 3 0 0 2 2 13 31.1
4 3/30/19 Sat IND Away W 121-116 32 8-18 44.4 0-3 ... 3-4 75.0 2 2 0 2 2 3 19 27.4

5 rows × 21 columns

Add ‘Days Rest’ column

# Insert column with empty cells
df.insert(2, 'Days Rest', '')

# Convert date to datetime format
df['Date'] = df['Date'].apply(lambda x: datetime.datetime.strptime(x, '%m/%d/%y'))

# Calculate days rest since previous game
df['Days Rest'] = (df['Date'] - df['Date'].shift(-1)).dt.days

df.head()
Date Day of Week Days Rest Opp Location Result Score Min FG FG% ... FT FT% REB AST BLK STL PF TO PTS FPTS
0 2019-04-07 Sun 2.0 BOS Away W 116-108 34 12-22 54.5 ... 0-0 0.0 12 4 2 1 3 3 25 51.4
1 2019-04-05 Fri 2.0 ATL Home W 149-113 30 9-13 69.2 ... 5-6 83.3 11 4 0 1 3 2 25 45.2
2 2019-04-03 Wed 2.0 NY Home W 114-100 33 11-21 52.4 ... 6-8 75.0 13 3 1 0 4 3 29 49.1
3 2019-04-01 Mon 2.0 TOR Away L 121-109 26 5-14 35.7 ... 1-2 50.0 13 3 0 0 2 2 13 31.1
4 2019-03-30 Sat 2.0 IND Away W 121-116 32 8-18 44.4 ... 3-4 75.0 2 2 0 2 2 3 19 27.4

5 rows × 22 columns

Do rolling calculations

# Do rolling calculations
# Rolling calculation template
# df[''] = df[''].iloc[::-1].rolling().mean()

df['FPTS LAST 3'] = df['FPTS'].iloc[::-1].rolling(3).mean()
df['FPTS LAST 5'] = df['FPTS'].iloc[::-1].rolling(5).mean()
df['FPTS LAST 10'] = df['FPTS'].iloc[::-1].rolling(10).mean()

df.head(100)
Date Day of Week Days Rest Opp Location Result Score Min FG FG% ... AST BLK STL PF TO PTS FPTS FPTS LAST 3 FPTS LAST 5 FPTS LAST 10
0 2019-04-07 Sun 2.0 BOS Away W 116-108 34 12-22 54.5 ... 4 2 1 3 3 25 51.4 48.566667 40.84 42.97
1 2019-04-05 Fri 2.0 ATL Home W 149-113 30 9-13 69.2 ... 4 0 1 3 2 25 45.2 41.800000 36.84 44.08
2 2019-04-03 Wed 2.0 NY Home W 114-100 33 11-21 52.4 ... 3 1 0 4 3 29 49.1 35.866667 38.74 43.58
3 2019-04-01 Mon 2.0 TOR Away L 121-109 26 5-14 35.7 ... 3 0 0 2 2 13 31.1 29.966667 38.36 42.95
4 2019-03-30 Sat 2.0 IND Away W 121-116 32 8-18 44.4 ... 2 0 2 2 3 19 27.4 37.833333 41.40 44.49
5 2019-03-28 Thu 2.0 DET Away L 115-98 33 5-15 33.3 ... 4 0 1 3 4 12 31.4 44.433333 45.10 46.81
6 2019-03-26 Tue 1.0 MIA Away W 104-99 34 10-18 55.6 ... 5 1 1 2 2 24 54.7 49.400000 51.32 46.71
7 2019-03-25 Mon 3.0 PHI Home W 119-98 29 11-21 52.4 ... 4 0 0 0 0 28 47.2 46.466667 48.42 47.40
8 2019-03-22 Fri 2.0 MEM Home W 123-119 OT 41 12-23 52.2 ... 3 2 2 2 0 25 46.3 51.566667 47.54 47.69
9 2019-03-20 Wed 3.0 NO Home W 119-96 26 5-14 35.7 ... 3 3 0 1 3 15 45.9 49.533333 47.58 47.12
10 2019-03-17 Sun 3.0 ATL Home W 101-91 34 10-20 50.0 ... 3 0 3 2 2 27 62.5 48.500000 48.52 48.45
11 2019-03-14 Thu 1.0 CLE Home W 120-91 27 9-15 60.0 ... 2 0 2 0 1 19 40.2 43.166667 42.10 47.44
12 2019-03-13 Wed 3.0 WSH Away L 100-90 35 9-17 52.9 ... 2 1 1 3 3 20 42.8 46.633333 46.38 48.93
13 2019-03-10 Sun 2.0 MEM Away L 105-97 35 10-24 41.7 ... 3 1 1 3 2 26 46.5 42.500000 47.84 48.67
14 2019-03-08 Fri 3.0 DAL Home W 111-106 35 8-17 47.1 ... 6 1 2 2 3 20 50.6 47.533333 46.66 49.61
15 2019-03-05 Tue 2.0 PHI Away L 114-106 34 5-15 33.3 ... 2 0 1 2 2 12 30.4 47.366667 48.38 48.54
16 2019-03-03 Sun 1.0 CLE Away L 107-93 36 13-16 81.3 ... 6 2 2 2 3 28 61.6 50.766667 52.78 49.99
17 2019-03-02 Sat 2.0 IND Away W 117-112 32 11-19 57.9 ... 3 1 2 2 0 27 50.1 49.966667 51.48 48.08
18 2019-02-28 Thu 2.0 GS Home W 103-96 30 4-15 26.7 ... 6 2 0 2 2 12 40.6 50.733333 49.50 46.50
19 2019-02-26 Tue 2.0 NY Away L 108-103 34 12-19 63.2 ... 6 3 1 2 1 26 59.2 55.566667 52.56 47.88
20 2019-02-24 Sun 2.0 TOR Away W 113-98 31 10-17 58.8 ... 4 1 2 1 0 23 52.4 49.233333 48.70 45.31
21 2019-02-22 Fri 8.0 CHI Home L 110-109 29 9-16 56.3 ... 7 2 2 3 2 19 55.1 50.400000 47.20 45.44
23 2019-02-14 Thu 2.0 CHA Home W 127-89 26 7-13 53.8 ... 4 1 1 2 2 17 40.2 45.333333 44.68 45.12
24 2019-02-12 Tue 2.0 NO Away W 118-88 27 10-18 55.6 ... 3 0 2 1 0 25 55.9 46.900000 43.50 45.13
25 2019-02-10 Sun 1.0 ATL Away W 124-108 29 8-13 61.5 ... 3 1 0 2 1 19 39.9 42.433333 43.20 45.47
26 2019-02-09 Sat 2.0 MIL Away W 103-83 26 7-16 43.8 ... 5 1 0 0 1 15 44.9 40.566667 41.92 46.96
27 2019-02-07 Thu 2.0 MIN Home W 122-112 31 9-16 56.3 ... 3 2 0 1 1 21 42.5 43.733333 43.68 47.09
28 2019-02-05 Tue 3.0 OKC Away L 132-122 34 8-18 44.4 ... 5 0 1 2 4 17 34.3 40.733333 45.56 47.68
29 2019-02-02 Sat 2.0 BKN Home W 102-89 32 12-22 54.5 ... 4 3 1 1 2 24 54.4 47.200000 46.76 48.76
30 2019-01-31 Thu 2.0 IND Home W 107-100 35 8-15 53.3 ... 5 0 0 3 3 17 33.5 46.366667 47.74 47.60
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
51 2018-12-21 Fri 6.0 CHI Away L 90-80 37 8-19 42.1 ... 4 4 0 3 0 19 59.8 52.366667 46.26 46.78
52 2018-12-15 Sat 2.0 UTAH Home W 96-89 30 5-14 35.7 ... 5 2 0 3 2 15 49.3 45.500000 43.70 47.95
53 2018-12-13 Thu 3.0 CHI Home W 97-91 33 11-21 52.4 ... 2 1 2 2 2 26 48.0 40.733333 41.34 45.68
54 2018-12-10 Mon 3.0 DAL Away L 101-76 26 4-15 26.7 ... 4 1 2 1 3 8 39.2 40.400000 42.04 44.74
55 2018-12-07 Fri 2.0 IND Home L 112-90 26 9-17 52.9 ... 2 0 0 1 2 22 35.0 39.833333 43.22 46.47
56 2018-12-05 Wed 1.0 DEN Home L 124-118 OT 37 11-19 57.9 ... 4 0 0 2 1 24 47.0 45.333333 47.30 48.43
57 2018-12-04 Tue 4.0 MIA Away W 105-90 33 8-16 50.0 ... 3 0 1 1 1 19 37.5 44.700000 52.20 48.79
58 2018-11-30 Fri 2.0 PHX Away W 99-85 32 11-20 55.0 ... 3 1 1 3 2 25 51.5 50.666667 50.02 48.61
59 2018-11-28 Wed 2.0 POR Away L 115-112 29 8-12 66.7 ... 7 2 0 6 1 20 45.1 57.333333 47.44 47.79
60 2018-11-26 Mon 1.0 GS Away L 116-110 33 12-21 57.1 ... 6 0 1 4 1 30 55.4 51.166667 49.72 48.21
61 2018-11-25 Sun 2.0 LAL Away W 108-104 36 10-20 50.0 ... 7 3 2 2 3 31 71.5 45.566667 49.56 45.65
62 2018-11-23 Fri 3.0 DEN Away L 112-87 28 7-14 50.0 ... 0 0 1 1 2 16 26.6 40.566667 45.38 41.95
63 2018-11-20 Tue 2.0 TOR Home L 93-91 34 6-12 50.0 ... 4 0 0 2 3 14 38.6 49.900000 47.20 42.60
64 2018-11-18 Sun 1.0 NY Home W 131-117 32 10-15 66.7 ... 9 2 0 2 3 28 56.5 53.900000 48.14 43.51
65 2018-11-17 Sat 3.0 LAL Home W 130-117 31 15-23 65.2 ... 0 0 2 1 3 36 54.6 46.966667 46.70 42.21
66 2018-11-14 Wed 2.0 PHI Home W 111-106 39 10-19 52.6 ... 4 0 2 1 1 30 50.6 43.200000 41.74 39.88
67 2018-11-12 Mon 1.0 WSH Away L 117-109 32 8-17 47.1 ... 3 0 1 2 2 17 35.7 42.766667 38.52 39.59
68 2018-11-11 Sun 2.0 NY Away W 115-89 26 10-17 58.8 ... 1 1 1 1 2 21 43.3 40.800000 38.00 40.91
69 2018-11-09 Fri 2.0 WSH Home W 117-108 31 10-16 62.5 ... 3 2 1 2 2 21 49.3 37.866667 38.88 43.04
70 2018-11-07 Wed 2.0 DET Home L 103-96 34 6-14 42.9 ... 4 1 0 5 4 14 29.8 32.466667 37.72 41.87
71 2018-11-05 Mon 1.0 CLE Home W 102-100 27 6-13 46.2 ... 1 2 1 0 2 14 34.5 38.433333 38.02 41.55
72 2018-11-04 Sun 2.0 SA Away W 117-110 32 6-11 54.5 ... 3 1 1 1 0 13 33.1 41.433333 40.66 NaN
73 2018-11-02 Fri 3.0 LAC Home L 120-95 32 10-21 47.6 ... 3 3 0 1 1 22 47.7 40.833333 43.82 NaN
74 2018-10-30 Tue 3.0 SAC Home L 107-99 27 5-11 45.5 ... 5 1 1 1 3 15 43.5 40.833333 47.20 NaN
75 2018-10-27 Sat 2.0 MIL Away L 113-91 21 7-10 70.0 ... 1 1 1 4 3 16 31.3 42.633333 46.02 NaN
76 2018-10-25 Thu 3.0 POR Home L 128-114 31 10-16 62.5 ... 3 1 2 5 3 24 47.7 53.733333 45.08 NaN
77 2018-10-22 Mon 2.0 BOS Away W 93-90 33 11-18 61.1 ... 1 0 3 1 0 24 48.9 50.366667 NaN NaN
78 2018-10-20 Sat 1.0 PHI Away L 116-115 38 10-15 66.7 ... 12 0 2 2 2 27 64.6 42.933333 NaN NaN
79 2018-10-19 Fri 2.0 CHA Home L 120-88 22 6-11 54.5 ... 4 4 0 1 2 12 37.6 NaN NaN NaN
80 2018-10-17 Wed NaN MIA Home W 104-101 28 4-12 33.3 ... 4 0 1 2 4 12 26.6 NaN NaN NaN

80 rows × 25 columns