作为一个NBA球迷,看到这一章还是挺激动的。
不过内容有点难,研究了半天。。。
要是赌球的,用这章的预测+凯利公式,是不是就能提升赢钱概率了?
数据预处理
回归书本内容,既然要分析,首先需要有数据:
打开basketball-reference数据链接:
点开Get table as CSV (for Excel),这样我们就能获得数据了。
常规赛是4月16日截至,我们使用常规赛的数据~
直接crtl+C,crtl+V到txt,直接改名csv即可。
(就几个月份,如果要弄的数据多的,可以爬虫)
我们先用pandas来读取一下:
import pandas as pd
data_filename = r'保存路径\文件名.csv'
dataset = pd.read_csv(data_filename)
print(dataset)
可以看到,自动识别成了一个1230 rows x 10 columns的<class ‘pandas.core.frame.DataFrame’>。(图片略掉)
各列名称为:
Date Start (ET) Visitor/Neutral PTS Home/Neutral PTS.1 Unnamed: 6 Unnamed: 7 Attend. Notes
其中,空白自己识别为:Unnamed:列号。
现在,我们把它重命名一下,防止客队和主队的分数看不清楚。
同时把日期转换成数据格式:parse_dates=[0] ##代表第0列的数据日期格式进行转换。
import pandas as pd
data_filename = r'保存路径\文件名.csv'
dataset = pd.read_csv(data_filename, parse_dates=[0])
dataset.columns = ["Date","Start","Visitor Team","VisitorPts", "Home Team", "HomePts","Score Type","OT?", "Attend.", "Notes"]
print(dataset)
可以看到这次的格式就相当整齐,且每一列的表头都完善了。
提取新特征
篮球比赛肯定有输赢,得分高的队伍,就是赢家,所以可以通过简单的判断,来增加一列数据,来判断home是否战胜了vistor:
dataset[“HomeWin”]= dataset[“VisitorPts”] < dataset[“HomePts”]
在把这列单独抽取,作为我们的预测是否准确的判断值:
y_true = dataset[“HomeWin”].values
为了预测这个结果,我们先通过简单的方法:
看看这个队伍上一轮,是否取得了胜利,
如果球队是第一次出现,则默认他们上一场是输球。(当然这里是可以改进的。)
实现方法为:
from collections import defaultdict
dataset[“HomeLastWin”] = False
dataset[“VisitorLastWin”] = False
won_last = defaultdict(int)
字典的键为球队,值为是否赢得上一场比赛。
遍历所有行,在此过程中,更新每一行,为其增加两个特征值:两支球队在上场比赛有没有获胜,并且更新defaultdict:
for index, row in dataset.iterrows(): ##遍历所有行,index是行号,row是具体内容。
home_team = row[“Home Team”] ##提取主队名
visitor_team = row[“Visitor Team”] ##提取客队名
row[“HomeLastWin”] = won_last[home_team] ##第n行的主队上一轮否赢球进行赋值,默认为0(False)
row[“VisitorLastWin”] = won_last[visitor_team] ##第n行的客队上一轮否赢球进行赋值,默认为0(False)
dataset.ix[index] = row ##
won_last[home_team] = row[“HomeWin”] ##更新defaultdict
won_last[visitor_team] = not row[“HomeWin”] ##更新defaultdict
我们可以看一下,20~25行的数据,与每一行的结构究竟是如何的:
if index==25:print(row,type(row)) ## 打印index==25的row
print(dataset.ix[20:25]) ##循坏外,打印20~25行(是包含25的)的DataFrame
整理代码并看结果:
import pandas as pd
import numpy as np
from collections import defaultdict
data_filename = r'保存路径\文件名.csv'
dataset = pd.read_csv(data_filename, parse_dates=[0])
dataset.columns = ["Date","Start","Visitor Team","VisitorPts", "Home Team", "HomePts","Score Type","OT?", "Attend.", "Notes"]
dataset["HomeWin"] = dataset["VisitorPts"] < dataset[