代碼詳解:用SQL GROUP BY語句,找出最強精靈寶可夢

全文共3168字,預計學習時長6分鐘python

圖片來源:Unsplash/Jay

本文所涉及代碼都可在GitHub中獲取:https://github.com/rmacaraeggit

知道如何在SQL內完成基礎操做後(若是不知道,請閱讀「Python SQL基礎簡介」,傳送門:https://medium.com/better-programming/a-gentle-introduction-to-sql-basics-in-python-b137651ed1ff),就能夠開始使用SQL提供的更多其餘工具了。github

GROUP BY語句是SQL中一個很實用的工具。有了它,就能夠對數據進行深刻研究,並使用一些函數將相同數據進行分組。sql

若是一欄中不一樣的行具備相同的值,這些行就會被放到一個單獨的分組中。數據庫

使用GROUP BY語句要注意如下重要的三點:bash

1. GROUP BY 是與SELECT語句一塊兒使用的。微信

2. 查詢時,GROUP BY位於WHERE語句以後。app

3. 查詢時,GROUP BY置於ORDER BY語句以前(若是使用到ORDER BY)。函數

在瞭解這些基本規則之後,就能夠打開筆記本電腦進行實操了!工具

設置

如下例子將使用Kaggle數據集(https://www.kaggle.com/abcsds/pokemon)中Pokémon遊戲的數據。

圖片來源:unsplash.com/@melvina

儘管使用遊戲數據是爲了給SQL增長趣味性,這些例子一樣也很是適用於更加商業化的決策,好比按照年齡段,收入水平,地理位置等給人羣進行分組。

首先導入所需的庫,並在python中加載CSV文件。

import pandas as pdimport sqlite3cnx = sqlite3.connect(':memory:')
csvfile = ('/Users/randy/Documents/GitHub/Pokemon-Stat-Predictor/Pokemon.csv')
 #Original datacolumns = ['#','name','type1','type2','total','hp','attack','defense',
\           'sp_atk','sp_def','speed','generation','legendary']
#open the csv filedf = pd.read_csv(csvfile, names=columns, header=0複製代碼

接下來,先清理數據,而後將其導入SQLite數據庫(https://www.sqlite.org/):

#find NaN valuesnan_rows = df[df.isnull().T.any().T]nan_rows.head()複製代碼

這一步將會找到全部空值並返回其中一部分(若是有的話)。

當全部空值都出如今type2一欄時,將全部空值都變成「none」。

#change all Type 2 NaN values to 'None':df['type2'] = df['type2'].fillna('none')複製代碼

由於SQL對字符串很敏感(同一字符串大寫與小寫表明含義不一樣),因此要將全部字符都設置爲小寫形式。


#change all strings within the dataframe to lower casedf = df.astype(str).
apply(lambda x: x.str.lower())複製代碼

而後將其設置爲一個SQL數據庫。

#set the database for pokemondf.to_sql
('pokemon', con=cnx, if_exists='append', index=False)
#function for the SQL queries belowdef sql_query(query): 
return pd.read_sql(query, cnx)複製代碼

太棒了,接下來能夠開始執行一些SQL語句!

GROUP BY的基本語法

GROUP BY函數的基本語法是:

SELECT column_name(s), function_name(column_name)
FROM table_nameWHERE conditionGROUP BY column_name(s)
ORDER BY column_name(s);function_name: SUM(), AVG(), MIN(), MAX(), COUNT().
table_name: name of the table. 
In this example, there is only the pokemon tablecondition: condition used.複製代碼

有了它,就能夠從新組織和操做數據,以獲得更好的分析。

簡單的GROUP BY語句

若是隻想獲得Pokémon中能力最高的那個精靈的名稱,類別與總能力值,能夠以一個簡單的MAX()查詢開始:

query = '''SELECT name, type1, type2, MAX(total)FROM pokemonWHERE legendary = 'true';'''sql_query(query)複製代碼

這個操做將輸出超級Mewtwo X,一個同時具備精神與戰鬥屬性,總能力值高達780的Pokémon。

但若是隻想要了解type1種類下能力最強的Pokémon呢?GROUP BY語句在這時就展示出其用武之地了:

query = '''SELECT name, type1, type2, MAX(total) FROM pokemonWHERE legendary = 'true'GROUP BY type1;'''sql_query(query)複製代碼

如今輸出的就不僅是一個Pokémon(超級Mewtwo X)了,而是14個傳奇的小精靈。

SQL查詢找到了全部傳奇小Pokémon,並基於type1欄將它們分到了單獨的組中。

Pokémon在被分到了暗系、龍系、電系、飛行系等不一樣的組後,SQL查詢將返回每個組中小Pokémon的名字、type一、type2與總能力值。

GROUP BY和HAVING語句

WHERE語句能給各欄加設條件,但若是想要給組加設條件呢?引入HAVING語句!

因爲WHERE關鍵詞不能用在聚合函數中,在此選用帶有GROUP BY的HAVING語句。

能夠用HAVING語句輸入條件來決定哪一組將會成爲最終結果的一部分。一樣的, WHERE語句對聚合函數不起任何做用。因此若是想要加設條件,就要將HAVING語句用於聚合函數中。

HAVING語句的基本語法:

SELECT column_name(s)FROM table_nameWHERE conditionGROUP BY column_name(s)
HAVING conditionORDER BY column_name(s);複製代碼

帶有HAVING語句的GROUP BY

圖片來源:unsplash.com/@jeshoots

若是想知道全部Pokémon的數量、type一、最小和最大總能力值與全部type1分組下小Pokémon的平均HP,且只包含那些總HP值高於4000的Pokémon組:

query = '''SELECT COUNT(name) as pokemon_count, type1, MIN(total), MAX(total), AVG(HP) FROM pokemonGROUP BY type1HAVING SUM(HP) > 4000;'''sql_query(query)複製代碼

這有助於肯定哪些小Pokémon組在其類別中具備最高的HP值,同時也能剔除事先設定好的HP小於4000的Pokémon組。

若是想從具備高HP值的小Pokémon裏進行挑選,最好選擇普通type1組,其中的小精靈具備最高平均HP值(77.28)且很是耐打。

HAVING語句真的有助於精簡數據,並得出更有用更深入的結果。

留言 點贊 關注

咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」

(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)

相關文章
相關標籤/搜索