NBA 史上实力最弱的球队是哪个?用 Python + SQL 我们找到了答案
文中部分代码会有“代码补完”字样的注释,是留给读者自己补完并在线评测的,相当于小作业,这里就请大家自行脑补吧。(编者注:每个需要补充的部分都给出了提示信息)
01. elo值
elo值就像现在竞技网游里的天梯系统,队伍在每场比赛后会根据表现有所调整,胜增败减,小胜小增,大胜大增。elo值反映了一支队伍在常规赛中的胜场期望,1800的对应期望是获胜67场以上,就是王朝级强队了。具体的天梯分段分布如下:
ELO值 匹配战绩 对应队伍描述
1800 67-15 史诗级别
1700 60-22 总冠军争夺者
1600 51-31 季后赛水平
1500 41-41 平均水平
1400 31-51 乐透水平
1300 22-60 无言以对
1200 15-67 糟糕透顶
历史上最高纪录是96年总决赛阶段的公牛,曾一度突破了1850分。
知名数据分析网站538(fivethirtyeight.com)提供了NBA历史赛程的 elo 值记录(至2015赛季),有六万余条数据。这个数据量不能算很大,但是在本地用Excel直接打开操作,估计体验还是挺痛苦的,这里就介绍一下如何用 Python+SQL 来处理,或许会对广大劳形于 Excel 之间的朋友们有所帮助。
02. 元组
元组(tuple)是另一种Python中常用的数据类型,他跟列表非常相似,都可以包含若干元素,并且元素的调用都是通过方括号[]+索引的形式。
sample_list = [0,1,2,3]
sample_tuple = (0,1,2,3)# 列表的第1个元素
sample_list[0]# 元组的第2个元素
sample_tuple[1]
主要区别在于:
● 元组用括号()定义,列表用方括号[]定义
● 元组不可更改
● 即使只有一个元素,也需要有逗号,如(item1, )。如果缺了这个逗号,得到的仍是元素本身,而不是元组。
元组只能在定义时赋值,如果强行更改会得到解释器的错误提示。
TypeError:
'tuple' object does not support item assignment
有的函数返回值并非一个数值或字符,而是具有多重输出,这时就以元组格式存在。比如下例返回的是两个输入参数的和与乘积,可以点击运行查看,两个输出在()中。
def sum_times(x, y):
return (x + y), (x * y)sum_times(2,3)
03. 数据库
在之前的几篇教程中,我们已经接触过了一些数据集,既有在程序中生成的,也有存储在文本文件中的。对于体积较大的数据集,一般都存在文件中,程序运行时再读入内存。
但是文件存储数据(.txt或.csv)还面临很大的问题,一是当数据量比计算机内存还要大的时候,会带来沉重的计算负担甚至无法运行;二是数据有可能高频变化,比如电商在双11高峰期每秒就有几万次交易,普通的文件格式显然无法处理。
于是数据库(database)应运而生。数据库首先是结构化(structured)存储数据的方式,为了更加灵活的处理数据,程序不再一次性将所有数据读入内存,而是根据具体需要进行查询(query),获得相应的数据集。完成这些工作的程序语言叫作SQL(Structured Query Language),在计算机方面稍有常识的朋友想必都对这个缩写不会陌生。
著名的关系型数据库管理系统有MySQL, Oracle等。
04. SQLite
SQL是专为查询、操作数据库所用的语言,所以不像Python, JavaScript等语言那样功能丰富,扩展多样。
一个数据库由若干个表(table)组成,就像每个Excel文件里有多个Sheets。每个表又包含行(row)与列(column),这就比较好理解了。一行代表一个样本,而多列定义了各个维度上的属性。
SQLite是一种轻型的数据库管理系统,占用资源极低且处理速度快,目前更新到了3版本。Python有专门处理SQLite语句的库sqlite3。
import sqlite3
以下我们将以一份NBA的历史赛程数据为例,来了解SQL的基本法则与应用方法。(数据来源:FiveThirtyEight)
05. 查询
与数据库进行通信的最基本形式是查询(query),即返回符合条件的数据子集,其基本关键字是SELECT,SELECT后面跟所选列的表头。前面提到过一个数据库里可能存在多个表,所以查询语句必须指定来源表,关键字是FROM。
SELECT column1, column2, ... FROM table;
注意SQL是要求句末有分号(;)的,这与Python的习惯大为不同,可能会唤起一度为C++支配的恐惧。
NBA数据库里只含一张表,名为sheet,假设我们想要查询sheet表中的team_id列,那么对应的SQL是:
SELECT team_id FROM nba_history;
如果数据库非常庞大,那么即使哪怕仅仅查询某些列,也是不小的计算量,这里可以引入新的关键字LIMIT,之后接想要查询的行数。比如只想要前 5 行的 team_id 列,那么SQL为:
SELECT team_id FROM nba_history LIMIT 5;
下例将通过Python调用SQLite,查询elo_n和win_equiv两列的前5行:
import sqlite3
conn = sqlite3.connect('/mnt/vol0/Py_Intro/05_tuple_database/nbaallelo.db')
cur = conn.cursor()
# 代码补完
query =
#代码补完
cur.execute(query)
elos = cur.fetchall()
conn.close()
print(elos)
补完提示:回顾示例,替换关键字之间的名称,并以字符类型赋值予变量 query
可见,查询语句返回的是以元组(tuple)为元素的列表(list)。上例的输出即是5个(elo_n, win_equiv)组成的列表,应为:
[(1293.2767, 40.29483),
(1306.7233, 41.70517),
(1309.6521, 42.012257),
(1297.0712, 40.692783),
(1279.6189, 38.864048)]
06. SQLite with Python
在04节最后的例子中,除了SQL语句,还有很多Python命令,这些是Python调用SQLite的语句。
连接对象
首先是建立与数据库的联系,sqlite3.connect()将返回Connection实例对象,然后存为conn变量,此时的conn对应的是整个数据库。
import sqlite3
conn = sqlite3.connect("/mnt/vol0/Py_Intro/05_tuple_database/nbaallelo.db")
游标对象
Connection对象的.cursor()可以创建游标对象(cursor object)。游标对象可以对数据库执行SQL语句并进行更灵活的数据操作。
王莽的游标
query是纯SQL语句,通过cur.execute()实际执行,此时数据库查询的结果仍在cur对象中。最后调用cur.fetchall()将查询结果全部返回,并存至变量elos,就是最终得到的元组列表。
如果只想返回一条查询结果,可以使用cur.fetchone()。
关于Python与SQLite3的联合应用,以后还会深入讲解,本篇仍将重点回归到SQL语句上。
07. Where
仅仅从数据库的某个表中查询某一列的前若干行,这样的操作局限性太大,很难满足应用需求。实际上我们感兴趣的数据子集并非总是按照顺序排列,而是符合某种限制条件。
为了进一步缩减精确查询范围,可以使用关键字WHERE。比如我们想要查询NBA历史上,赛后elo值elo_n高于1850的强队ID,其SQL语句是:
SELECT team_id, elo_n FROM sheet WHERE elo_n > 1850
查询结果表明,历史上唯一一支elo值曾经突破1850的队伍是1996年总决赛时期的芝加哥公牛。
下面请查询elo_n低于1100的弱队ID,及其对应比赛日期。sqlite3库以及连接对象、游标对象已经预定义,可以从定义SQL查询语句query开始。
# 代码补完
query =
# 代码补完
cur.execute(query)
elo_1100 = cur.fetchall()
conn.close()
print(elo_1100)
补完提示:请以"fran_id", "date_game", "elo_n"的顺序进行查询。
查询筛选结果显示,历史上一度衰到1100以下的弱旅,也只有1968年一支名为"Squires"的队伍。
他们这么弱,我认为与名字起的不好是分不开的。"Squire"在英文中是“侍从”的意思,在《炉石传说》中,就有很多仆从名为"Squire",比如11圣盾小兵:
NBA 史上实力最弱的球队是哪个?用 Python + SQL 我们找到了答案相关推荐
- mysql查球队胜场和败场sql_NBA 史上实力最弱的球队是哪个?用 Python + SQL 我们找到了答案...
原标题:NBA 史上实力最弱的球队是哪个?用 Python + SQL 我们找到了答案 雷锋网按:此前我们专门发布了一篇文章分析NBA史上实力最强的球队,详见<用 Python 分析过去四年的比 ...
- mysql查球队胜场和败场sql_NBA球队_nba有哪些球队_NBA史上实力最弱的球队是哪个?用Python+SQL我们找到了答案...
文中部分代码会有"代码补完"字样的注释,是留给读者自己补完并在线评测的,相当于小作业,这里就请大家自行脑补吧.(编者注:每个需要补充的部分都给出了提示信息) 01. elo值 el ...
- NBA史上薪水最高球员排行榜
NBA史上薪水最高球员排行榜,加内特以3.28亿排在第一位,奥尼尔.科比.邓肯和诺维茨基分列第二到第五.姚明以9339万排在第81位,篮球之神乔丹排在这份榜单的第87位.
- mysql查球队胜场和败场sql_[Python + SQL] NBA史上最弱的球队是哪一个
部分代码会有"代码补完"字样的注释,原文是留给读者自己补完并在线评测的,相当于小作业,这里就请大家自行脑补吧. 01. elo值 elo值就像现在竞技网游里的天梯系统,队伍在每场比 ...
- 史上最全近百条Oracle DBA日常维护SQL脚本指令
查询碎片程度高(实际使用率小于30%)的表 可以收缩的表条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的 ...
- 最少交换次数python_史上最简单!冒泡、选择排序的Python实现及算法优化详解
1.排序概念 内部排序和外部排序 根据排序过程中,待排序的数据是否全部被放在内存中,分为两大类: 内部排序:指的是待排序的数据存放在计算机内存中进行的排序过程: 外部排序:指的是排序中要对外存储器进行 ...
- 史上最全的69个经典Spring面试专题解析(干货分享答案)
欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. 微信公众号:慕容千语的架构笔记.欢迎关注一起进步. Spring 概 述 1. 什 么 ...
- 史上最全的2022年最新版Android安卓面试题集锦(含答案+源码)
金三银四,又到了一年一度的黄金跳槽季,想必也许有不少Android程序员开始摩拳擦掌,蠢蠢欲动了.而网络上的面试题大部分已经过时甚至是错误成堆,漏洞百出,今天结合自己这段时间的面试经验和几个Andro ...
- 史上最简单的 MySQL 教程(五)「SQL 基本操作 之 表操作」
温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋Star.Fork,纠错. SQL 基本操作 基本操作:CURD,即增删改查. 根据操作对象的不同 ...
最新文章
- 技术开发项目收获了什么_有幸入职字节跳动一年,附上百度、字节跳动等后台面经,谈谈我的收获!...
- WPF自定义控件(1)——仪表盘设计[1]
- 黄哥漫谈Python 生成器
- XSD(Schema)教程
- VS2019 停止WEB项目调试时 保持IIS Express 不关闭
- 超图软件试用许可操作步骤_软件中的操作步骤
- LintCode 1859. 最小振幅(排序)
- Node.js Path 模块
- mongodb的架构 副本集搭建
- CRC码计算及校验原理计算
- Xpose框架的入门学习
- 查看源文件默认编辑器打开
- FFMPEG使用摄像头录像并编码
- python之小说下载器version2.0
- 关于软件测试未来发展趋势分析与总结
- 小程序里显示店铺地址,可在地图上查看,可点击导航到店铺
- phalapi-入门篇1(简单介绍以及环境搭建)
- 阿里程序员,过完年第一天就要被劝退!让人感觉现实是如此残酷!
- 邻居好说话:冒泡排序
- java基本数据类型长度