NBA 史上實力最弱的球隊是哪個?用 Python + SQL 我們找到了答案

2020-11-23 雷鋒網

雷鋒網按:此前我們專門發布了一篇文章分析NBA史上實力最強的球隊,詳見《用 Python 分析過去四年的比賽數據,實力最強的 NBA 球隊原來是它》,這次我們來看看最弱的是哪個。原文作者 Kaiser,景略集智總經理,原載於集智網專欄,雷鋒網(公眾號:雷鋒網)已獲授權。

文中部分代碼會有「代碼補完」字樣的注釋,是留給讀者自己補完並在線評測的,相當於小作業,這裡就請大家自行腦補吧。(編者註:每個需要補充的部分都給出了提示信息)

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

雷鋒網(公眾號:雷鋒網)相關閱讀:

用 Python 分析過去四年的比賽數據,實力最強的 NBA 球隊原來是它

禪與奶罩識別藝術(上)


「TensorFlow & 神經網絡算法高級應用班」開課了!

最受歡迎的谷歌TensorFlow 框架,ThoughtWorks大牛教你玩轉深度學習!

課程連結:http://www.mooc.ai/course/82

加入AI慕課學院人工智慧學習交流QQ群:624413030,與AI同行一起交流成長



雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 科普:建立一支新的NBA球隊需要怎麼做
    NBA聯盟是全球的籃球頂級聯賽,從1946年成立至今,已經有70多年的歷史了,如今已經發展出32支球隊,並且商業化繁榮,在這裡很多人就有疑問了,NBA球隊是如何組建的?都需要做些什麼?首先當然需要聯盟的認可,nba會根據聯盟的經營狀況進行有序的擴張計劃,就拿多倫多猛龍舉例,多倫多並不屬於美國,但是由於地理位置因素,地處美國邊境的多倫多也會受到nba市場的影響,當地球迷市場潛力大,而且也便於管理,比賽的飛行時間也可以有效管理,所以多倫多也被納入nba市場擴張計劃中,還有一種情況,就是被收購,球隊老闆轉手後,球隊也可以搬遷,也可以更名,這也算是建立新球隊的一部分。
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    這篇文章將介紹一種在pandas的dataframe中使用SQL的python包,並且使用一個不等連結的查詢操作來介紹PandasSQL的使用方法。不等連接(Non-equi join)假設你必須連接兩個dataframe。其中一個顯示了我們對某些商品進行促銷的時間段。第二個是事務Dataframe。
  • 如何用python在工作中「偷懶」?
    這個時候,你已經可以寫個循環,不停地點擊屏幕上不同的幾個點,最基礎的掛機腳本就實現了。Excel自動化處理Excel合併在實際應用中可能會有不同月份的數據或者不同周的報告等等的Excel數據,都是單個獨立的文件,如果想要整體使用的話就需要合併一下,那麼如何利用python把指定目錄下的所有Excel數據合併成一個文件呢?
  • PySpark源碼解析,用Python調用高效Scala接口,搞定大規模數據分析
    .*")java_import(gateway.jvm,"org.apache.spark.ml.python.*")java_import(gateway.jvm,"org.apache.spark.mllib.api.python.*")#TODO(davies):moveintosqljava_import(gateway.jvm,"org.apache.spark.sql.*")java_import
  • ——論nba巨星中殺手和軸心的區別
    歷史單季第一,超過了「數據狂魔」張伯倫和「GOAT」麥可·喬丹,憑這兩年的表現字母哥已經晉升為nba歷史上最恐怖的常規賽怪物。 14-15賽季nba歷史上最聰明的後衛之一賈森·基德執掌雄鹿教鞭,他做出的第一個重要決定就是扶正剛打完新秀賽季、場均6.8分4.4個籃板的字母哥。
  • NBA經典的雙人組合,詹韋連線,科比雙上榜
    nba 自己創立以來,有著光輝的歷史,炫彩的籃球文化。 在nba這一肌肉碰撞的叢林中,時時出英雄,出現許多英雄少年,如喬丹,馬龍,巴克利,奧尼爾,科比,詹姆斯,艾弗森,卡特,麥迪等。當然最讓球迷津津樂道的還有他們之間默契的配合。
  • 這是NBA史上唯一一次下半區球隊奪冠!奧拉朱旺個人能力極限發揮
    要說到史上最具傳奇性的總冠軍,94-95賽季的火箭隊必定是載入史冊的,這是NBA史上唯一一次下半區奪冠的球隊,奧拉朱旺的能力被發揮到了極限。在這個賽季的常規賽中,火箭隊取得了47勝35負的戰績位居西部第六,看似平平,但是在接下來的四輪季後賽的對決中,火箭隊都是一步一個腳印戰勝了四支強大的球隊。
  • 末日到來前,所有人都想登上諾亞方舟——nba轉會市場開盤綜述
    上賽季聯盟第一的戰績,加上攻防效率等高階數據均排名榜首,再加上對陣熱火第四場字母哥傷退後反而三軍用命拼下唯一一場勝利,你能說如今的這支雄鹿實力不濟嗎? 雄鹿最大的問題其實是字母哥。 在雄鹿花費數年為他量身打造了一套陣容助他在常規賽飛龍在天后,到了季後賽的他依然不濟。
  • 詳解Python在資料庫測試中的應用
    對於我們的測試工作而言,Python最吸引我們的特性有如下幾個方面:  1 具備語言粘合劑的能力  2 解釋執行的機制  3 語法簡單易學  4 相對較高的性能  語言粘合劑是比較形象的說法,具體的說,Python支持通過引入自帶的cytpes庫,達到在python腳本中執行已有的動態庫中的代碼的目標。
  • 最詳細的SQL注入相關的命令整理
    利用這項功能,我們可以先建一張臨時表,然後在表中一行一行地輸入一個ASP木馬,然後用BCP命令導出形成ASP文件。目前我們已經知道了根目錄所在的盤符和深度,要找到根目錄的具體位置,我們來從D盤根目錄開始逐一搜尋,當然,沒有必要知道每個目錄的名稱,否則太耗費時間了。
  • Python數據分析:pandas讀取和寫入數據
    平時工作中,我們會接觸到不同的數據文件,比如很常見的excel文件(後綴名為xls和xlsx),csv、txt等文本文件,json文件以及sql文件等等。使用cat命令顯示文件內容:import pandas as pddf = pd.read_csv('01.csv')df當使用read_table()時,運行代碼後出現一個Warning,使用的是最新的版本python3.7。
  • 如何在Python中重寫SQL查詢?
    一些程式設計師只熟悉SQL中的數據操作,卻不熟悉Python中的數據操作,因此在完成項目時,我們不得不頻繁地在SQL和Python之間進行切換,導致了工作效率低下和生產能力下降。本文就教你一種方法,使用Pandas在Python中輕鬆重現SQL結果。
  • 用一篇短文來告訴大家,學習Python都可以用來幹嘛
    python能做太多有趣的事了,看看我是怎麼玩的1.自動發郵件2.自動化操作excel3.定製酷炫二維碼4.下載視頻、MP35.爬蟲6.HTML\網頁自動生成PDF7.製作可視化圖表8.地理空間分析9.數據分析10連接資料庫11.機器學習如果你不知道如何學習python,入門困難,如果你想從事數據分析,學習分析技術,如果你想學習sql
  • 從蜂王到船長再到火箭,保羅每一次交易都換掉對方半個球隊!
    克裡斯·保羅,4次nba助攻王,全明星賽,三振王,最佳陣容,最佳防守線全明星賽mvp,太多的榮譽,他的身體,現在的保羅是唯一唯一缺乏的冠軍說,其他的已經在眼前了。去年夏天火箭和快船達成交易,火箭得到了保羅,為哈登找到了nba最適合他的搭檔,也是火箭最適合的得分手,再往前看,黃蜂隊和快船在2011年達成了交易,保羅從蜂王時代進入天使之城,變成了船長,黃蜂隊在失去保羅後連續好幾年未能進入季後賽,快船在擁有保羅之後每年都進入季後賽,細心的球迷可以發現,保羅現在的兩場交易職業生涯,幾乎都換了對方的一半球隊!
  • 季後賽為什麼西部競爭明顯比東部激烈,NBA真的是西強東弱嗎?
    東部首輪就好像是強隊練兵似的,次輪才是廝殺的地方,而西部從首輪就打的難分難解,你死我活,兩邊完全不是一個畫面,難道NBA真的是西強東弱嗎?我們從幾個方面來說說是什麼造成這種現象的。美國起源於東部,西部是後來才發展的,所以東部大多都是一些貴族,西部更加開放,好萊塢就是最好的例子,西部的經濟最開始也是十分薄弱的,窮人家的孩子最喜歡的就是籃球這項運動,所籃球文化從小就站在西部孩子的心中,一直到現在,西部的籃球文化肯定是要比東部好的,說起東部,人們想起的都是大學,說起西部就是牛仔。這種文化造就了以下幾點細節。第一, 西部更注重國際球員。
  • 從0開始學python-6.2 用python讀寫文件
    上節課我們學習了什麼文件系統,文件樹的組成結構是什麼樣的。我們還學習了用python來查找、重命名一個文件。這節課,我們一起學習一下怎麼用python操作一個文件的內容。文件操作對一個文件,我們可以1)讀取裡面的內容、2)往文件裡寫內容、3)追加文件內容。我們來看看用python怎麼做這些事情。打開文件在對文件內容操作之前,我們首先要打開文件。我們可以使用open函數打開文件,看代碼:file = open('.
  • 媒體搞笑發問:史上最棒的NBA梗是哪個?
    (見新聞配圖)圖中的四個梗分別是「史上最強『白曼巴』——布萊恩-斯卡拉布萊恩」、「哭泣的表情包MJ——喬丹的名人堂演講」、「積極互動杜蘭特——杜蘭特和網友在推特上互懟」以及「JR你幹啥勒布朗——詹姆斯拷問JR今年總決賽的操作」。「9年前的今天,『哭泣的喬丹』梗正式誕生了,哪個梗是目前最棒的NBA梗呢?」該媒體配文問道。
  • 此國擁有23位NBA球員,為何無人願意為國出戰世界盃?
    在籃球領域,縱然戰術和團隊很重要,但是球隊還需要有絕對的核心,往往一個巨星球員擁有恐怖的牽制力,能吸引包夾並給隊友創造機會,這一點在NBA表現得尤為明顯。如今在國際賽場中,每一個國家隊同樣希望隊伍裡有巨星,而球迷往往對一個國家隊實力的評定,就看他們有幾個NBA球星。
  • NBA球隊在內地和港臺的翻譯你更鍾意哪個?
    由於接觸時間的不同和文化的差異,內地與港臺對NBA球隊的翻譯有一些不同,來看看你喜歡哪種譯名吧。內地與港臺譯名相同的球隊有:布魯克林籃網、費城76人、芝加哥公牛、克利夫蘭騎士、底特律活塞、夏洛特黃蜂、邁阿密熱火、奧蘭多魔術、猶他爵士、金州勇士、洛杉磯湖人、達拉斯獨行俠、聖安東尼奧馬刺。內地與港臺譯名不相同的球隊列表:
  • NBA裡誰打架最厲害?盤點NBA史上打架最厲害前五位,瓜哥上榜
    在NBA裡誰打架最厲害?今天就來盤點NBA史上打架最厲害前五位,瓜哥上榜!雖然阿泰斯特在賽場上蠻橫粗暴,但是他對自己的球隊非常負責,能為兄弟出頭。 第三位:丹尼斯·羅曼德 在很多球迷們看來羅曼德的實力非常強悍,這讓他的脾氣也火爆十足