Python数据挖掘入门与实践 第三章 用决策树预测获胜球队(一)pandas的数据预处理与决策树(Decision tree)

本文介绍了使用Python的pandas进行NBA比赛数据预处理,包括重命名列、提取新特征如球队胜负。通过决策树算法进行预测,增加了球队上一场比赛胜负和排名作为特征,提高预测准确率。最终通过交叉验证,模型预测准确率提升至60.6%。
摘要由CSDN通过智能技术生成

作为一个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)

1
2
可以看到这次的格式就相当整齐,且每一列的表头都完善了。

提取新特征

篮球比赛肯定有输赢,得分高的队伍,就是赢家,所以可以通过简单的判断,来增加一列数据,来判断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[
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值