我是个NBA伪球迷,去打篮球很少,但是天天看球赛,什么NBA,CBA甚至连NCAA的八强赛也关注,前几天接触Python的数据分析,发现挺有意思,于是我就自己搞了一个简单的程序来分析—从96-97赛季开始,平均哪个月的NBA比赛最多。

数据

我自己喜欢搞爬虫,自己爬了一点数据到数据库,至于怎么爬取,请关注公众号:爱代码的Cyning,后续会将爬虫代码程序发出来。
我将爬取的数据放到了Mysql的数据库,大概的数据如下:

数据库连接和数据获取

  • 安装pymysql

目前使用的是Python3.5+,那么Python怎么链接Mysql呢?
首先需要安装pymysql

1
pip3 install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pymysql
  • 获取数据库的数据

跟其他语言获取数据库方式一样,拿到游标就可以拿到数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
with  MySQLdb.connect(host='localhost', user='root', passwd='root', port=3306, db="nba") as cursor:
# 使用cursor()方法获取操作游标
sql = "select * from `match-time`"
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
p = np.array(results)


return p

except:
print("Error: unable to fecth data")
return np.nan

通过MySQLdb库来拿到数据库的游标,执行sql语句,就可以通过.fetchall()获取数据库中所有的列表信息。

  • Numpy分析

在Python3.X上开发是个很开心的过程,因为Python平台下丰富的第三方库,为我们提供了各式各样的轮子,我们只需要按照自己的需求组装或者组合。我们可以通过Numpy库来处理目前我们能拿到的数据。

上面的np.array其实就是将从数据库的二维数据向量化。

我们需要将1996-1997赛季到2016-2017赛季所有的按照月份给列出来,首先我们需要获取每隔赛季有哪几个月是比赛月(常规赛和季后赛),因为每隔赛季的情况千差万别,如停摆,全明星赛,以及各种因素会导致每隔赛季有所差异。

那我们如何拿到每隔赛季的月份呢:

  1. 过滤2017-2018赛季(比赛尚未结束)
  2. 按照月份来去重,拿到有比赛的月份(比赛月)
  3. 每一个的比赛求总和

过滤2017-2018赛季以及求月份

1
2
3
4
5
6
7
# 从数据库获取数据
data_arr = getAllData()
# 过滤2017-2018赛季
data_arr = data_arr[ (data_arr[:, 6] != "2017-2018")]

# 拿到月份
month_list = np.unique(data_arr[:, 4])

输出结果

1
['1' '10' '11' '12' '2' '3' '4' '5' '6']

跟实际情况是一致的。

求每个月份比赛数

只需将刚才的比赛月一一遍历,求和即可:

1
2
3
4
5
6
7
month_list_result = []
for month in month_list:
# 和month相同的月份的向量
month_list_data = data_arr[data_arr[:,4] == month]
# 求和,Y轴
match_cnt = np.sum(month_list_data[:, 1].astype(int), axis=0)
month_list_result.append([month, match_cnt])

将获取的month_list_result存到csv文件中:

1
2
file_name = os.path.join("./",   "month_cnt.csv")
save_stats_to_csv(np.array(month_list_result), file_name, headers=['month', "match_cnt"])
  • 结果

打开csv文件,用excel的图标展示如下:

通过这个图,我们很容易知道:NBA 3月份的比赛最多