Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NBA 史上实力最弱的球队是哪个?用 Python + SQL 我们找到了答案

NBA 史上实力最弱的球队是哪个?用 Python + SQL 我们找到了答案

作者头像
AI研习社
发布于 2018-03-28 07:51:25
发布于 2018-03-28 07:51:25
1.9K0
举报
文章被收录于专栏:AI研习社AI研习社
文中部分代码会有“代码补完”字样的注释,是留给读者自己补完并在线评测的,相当于小作业,这里就请大家自行脑补吧。(编者注:每个需要补充的部分都给出了提示信息)

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圣盾小兵:

研习社特供福利 ID:OKweiwu

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
原来Python自带了数据库,用起来真方便!
Python作为数据科学主流语言,被广泛用于数据读存、处理、分析、建模,可以说是无所不能。
朱小五
2020/09/24
1.1K0
原来Python自带了数据库,用起来真方便!
玩转SQLite5:使用Python来读写数据库
SQLite支持多种编程语言的开发调用:C, C++, PHP, Perl, Java, C#,Python, Ruby等。
xxpcb
2021/12/22
7110
玩转SQLite5:使用Python来读写数据库
[Python从零到壹] 八.数据库之MySQL和Sqlite基础操作万字详解
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,在数据库管理系统中,用户可以对数据进行新增、删除、更新、查询等操作,从而转变为用户所需要的各种数据,并进行灵魂的管理。
Eastmount
2021/12/02
1.4K0
[Python从零到壹] 八.数据库之MySQL和Sqlite基础操作万字详解
Python-sqlite3-04-修改记录
系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2 这个系列讲讲Python对sqlit
zishendianxia
2019/10/23
7460
python 使用pymssql连接sq
----原文地址:http://www.cnblogs.com/baiyangcao/p/pymssql_basic.html
py3study
2020/01/09
1.6K0
python之MySQLdb库的使用
 在开发的过程中避免不了和数据库的交互,在实际环境中用的最多的Mysql数据库,那python是怎么和Mysql进行交互的呢,python使用一个叫MySQLdb的库来连接MySQL,好的,下面最要从MySQLdb的安装、连接MySQL、执行sql语句、如何取得结果、关闭数据库连接来讲述一下:
py3study
2020/01/03
7650
python操作sqlite3小结
使用默认模块sqlite3 使用sqlite3模块的connect方法来创建/打开数据库,需要指定数据库路径,不存在则创建一个新的数据库
py3study
2020/01/03
9420
Python SQLite 基本操作和经验技巧(一)
在一个 C/C++ 程序中(或者脚本语言使用 Tcl/Ruby/Perl/Python 等) 你可以在一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有 表的索引。每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据库的模式。 SQLITE_MASTER 表看起来如下:
cutercorley
2020/07/23
5.3K0
MySQL学习14_游标
有时候我们是需要在检索的结果中,前进或者后退一行或者多行,这个时候需要使用游标cursor。
皮大大
2021/03/02
2.3K0
Python 操作 SQLite 数据库
SQLite 是一个小型的关系型数据库,它最大的特点在于不需要单独的服务、零配置。我们在之前讲过的两个数据库,不管是 MySQL 还是 MongoDB,都需要我们安装。安装之后,然后运行起来,其实这就相当于已经有一个相应的服务在跑着。
编程文青李狗蛋
2019/11/07
8420
用华为MindSpore框架训练数据库类型的数据集
在前面一篇博客我们讲到三种用python去读取一个文件的指定行的操作,最终给出的一个结论大概是,对于大型的数据而言,最快的找到指定行的方法是Linux系统自带的sed指令,那么是否只有这一种办法了呢?很显然不是,之所以采用这些方法,是因为我们被局限在数据的存储格式上,如果在处理数据或者产生数据的阶段,就把数据按照特定的数据结构进行存储,那么就能够大大的提高数据读取的效率。这里我们要介绍一个用sqlite3来读取数据用于MindSpore的训练的案例,在有限的内存空间中避免完整的去加载整个数据集。
DechinPhy
2021/06/10
7280
python3使用json、pickle和sqlite3持久化存储字典对象
在各种python的项目中,我们时常要持久化的在系统中存储各式各样的python的数据结构,常用的比如字典等。尤其是在云服务类型中的python项目中,要持久化或者临时的在缓存中储存一些用户认证信息和日志信息等,最典型的比如在数据库中存储用户的token信息。在本文中我们将针对三种类型的python持久化存储方案进行介绍,分别是json、pickle和python自带的数据库sqlite3。
DechinPhy
2021/05/21
3.5K0
Python - sqlite3 轻量数据库使用
sqlite3模块不同于PyMySQL模块,PyMySQL是一个python与mysql的沟通管道,需要你在本地安装配置好mysql才能使用,SQLite是python自带的数据库,不需要任何配置。
为为为什么
2022/08/04
1.7K0
Python - sqlite3 轻量数据库使用
python 数据分析基础 day10-sqlite3一、使用逻辑二、创建数据库及表三、插入记录四、更新记录五、获取记录
今天是读《python数据分析基础》的第10天,今天的笔记内容是利用sqlite3模块对数据库文件进行操作。这个模块的笔记主要分为五个板块:sqlite3的使用逻辑、创建表、插入记录、更新记录、获取记录。 一、使用逻辑 1.创建数据库连接对象或创建新数据库: sqlite3.cneetct("databasePath") 2.建立游标 cur=con.cursor() 3.执行sql语句 #用于查询语句 cur=con.execute() data=cur.fetchall() #用于更新、插入、删除数据
billyang916
2018/05/02
1.4K0
python使用sqlite简单介绍
以下是基本用法,创建test.db文件,添加一张dept表,添加4条数据,再删除一条,最后读取数据
py3study
2020/01/07
5950
Python学习之GUI--SQL数据库连接
在进行SQL数据库连接之前,我们需要先了解一下pymssql库。有关pymssql的解释推荐大家去官网学习。网上有关这方面的知识大部分是实例为主,不利于学习。另一方面,经过他人咀嚼过的知识也总是差那么点味道。
K同学啊
2019/01/22
1.4K0
Python3 MySQL 数据库连接 - PyMySQL 驱动
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中则使用 mysqldb
十二惊惶
2024/02/28
4500
Python-pymysql
如果要让返回的数据带上列名,也就是要返回字典,那么就需要用到cursors.DictCursor。
职场亮哥
2020/10/10
1.2K0
python处理SQLite数据库
数据库非常重要,程序的数据增删改查需要数据库支持。python处理数据库非常简单。而且不同类型的数据库处理逻辑方式大同小异。本文以sqlite数据库为例,介绍一下python操作数据库的方法。
Crayon鑫
2023/10/10
4240
Python与数据库的那些事
SQL(Structured Query Language)数据库,指关系型数据库。主要代表:SQL Server、Oracle、MySQL、PostgreSQL。
刘早起
2020/04/22
1.8K0
相关推荐
原来Python自带了数据库,用起来真方便!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档