返回網站

Python 連線 MySQL 資料分析

利用 pymysql 抓資料回 Python 作統計分析

· Python

將 MySQL 數據用 Python 分析處理

  這篇文章將承接上一篇所上傳至 MySQL 的數據資料,將所有的數據抓回 Python,並利用簡單的語法 for、if ,擷取出需要的部分到串列中,接著再輸出並分析;這次的資料因為是自己寫的輸入系統產生的乾淨數據,所以也不用特別作資料清洗的步驟,主要是做一些字串、串列的操作練習。

  本次紀錄分析的對象是 2019 年世界桌球錦標賽決賽,由 Ma Long 與 Mattias Falck 兩位選手對決所產生的資料,紀錄者為大專校隊乙組程度;文章過程以程式碼講解為主,桌球資訊分析於文末呈現。

分析代碼及結果概覽。

首先將 MySQL 的連線開啟,可以參考上一篇桌球世錦賽決賽紀錄上傳資料庫的文章內容,接著開始編寫 Python 的程式碼,因為會用到 pymysql 模組來和 MySQL 資料庫建立連線,所以先匯入;下圖中可以看到 pymysql 的連線與資料庫的使用方式和 sqlite3 幾乎一樣,如果想知道其他操作方式也可以參考資料庫操作—新增、查詢、刪除和修改這篇文章

連線至資料庫,把資料抓回放至 list_datas 串列中。

將 cursor 裡面的每筆資料一個一個地利用 append 放入 list_datas 串列中,是一個二為串列,再把存好的資料每一筆各別取出第六欄字串的前兩個字。

這裡的 if 條件 wl 是 "得"、"失" 兩種,由整個分析函數 analysis 輸入時會用到。

上圖中的 analysis 自定義函數是全部的資料分析程式碼寫完後,才整個改成可根據 "得"、"失" 兩個輸入條件,而抓取得分方或失分方兩個資料的分析。(wl 是 "得",代表得分才抓取這筆資料)

接著是用 if 函數根據不同球員來抓取其相關的資料,其中第八欄字串資料含有逗點,所以使用函數 split(",") 將資料拆解並放入 list1 串列,然後再分別取字串的前兩字及後三字個放入不同資料串列。

(很多程式碼應該是有更簡潔的寫法,日後還有空間可以改善~)

mykind 是收集其中一方所有擊球的種類,myway則是同一方的所有擊球落點。

下面再利用 set 函數統計共有幾種擊球種類,並使用 sorted 函數來固定排序,再用 count 函數計算各種類的次數;最後格式化輸出文字。

格式化輸出文字除了用 % 之外,還可用 format 函數來編寫。

上面是抓取擊球的種類及其次數來計算得分率,下圖則為抓取擊球路線並作一樣的分析。

使用 format 函數格式化字串。

跟著計算比賽中每一球的板數,因為第八欄資料有包含逗號,所以只要計算逗號數量再加上 1 即完成,其餘程式碼與上面相似。

將得分路線統整後可以觀察球員有沒有固定、喜好的球路。

資料拆解成串列的步驟都差不多,中途若想確定資料串列內容可以用函數 print 將串列輸出觀察,最後是擊球路線點的分析。

這裡的 bs[-3]+","+bs[-2]+","+bs[-1] 是 bs 串列中最後三個資料,然後用逗號連接成字串丟到 list_obs 成為其中的一個元素。

全部分析的程式碼編寫後並完成自定義函數 def analysis(wl):,最後簡單地引用這個自定義函數 analysis 並輸入引數 "得" 來取得 Ma Long 的得分資料(根據比賽登記系統的紀錄方式),"失" 來取得 Ma Long 的失分資料,也就是對手 Mattias Falck 的得分資料。

加上一些分隔線來區別資料內容。

最終的輸出結果整理好後如下面兩張圖。(專有名詞為紀錄者程度之理解,如有疑問歡迎詢問)

Ma Long 的得分資料分析。
Mattias Falck 的得分資料分析。

根據上面的數據分析結果,我們可以看到 Ma Long 這場比賽的得分手段很多是靠側身正手攻以及發球得分,而且發球得分的情況居然高達 12 分,其次才是側身攻擊 9 分,不過側身得分率高達 7 成;而擊球落點是正手長的得分率最高,表示在這場比賽中不論何時,Ma Long 只要打在正手長的落點就會有二分之一機會一定得分,另外這裡特別的是中路短球得分有 9 分,本來猜想多半是發球得分所導致,可是再細看得分的路線點會發現中路短球發球得分只有 4 個,其餘中路短球得分較多的則是擺短有 5 分,這代表了 Ma Long 光是發球以及擺短的球得分就有 18 個,平均 5 局下來,等於每一局都是從 3:0 領先開始比賽,不過也表示 Ma Long 的發球跟擺短非常細膩但有攻擊性。

接著來觀察 Ma Long 的失分資料(也就是 Mattias Falck 的得分資料),雖然台內擰球得分率百分之百,不過只有一個,而發球得分率與 Ma Long 相比就遜色許多,整場比賽的得分手段主要是靠反手擰拉與一般正手擊球(正面顆粒),正手拉衝的得分率雖有八成,可是也只有 4 個;而在落點方面可以看到 Mattias Falck 給對手中路短的落點之得分率非常低,這從上一段的分析就已經知道 Ma Long 的擺短非常好而略知一二,最後可以看到 Mattias Falck 除了擰拉反手長這進攻手段有 6 個得分外,其餘普通且得分手段沒有 Ma Long 這麼多;最後的最後來觀察得失分球的板數,Ma Long 明顯集中在前四板、Mattias Falck 則是集中在二到五板。

以上就是根據紀錄的數據而篩選出來資料的粗略分析,其實光是這八欄資料(詳見上一篇文章)就能知道這麼多的事情,而且還可以知道更多資訊,像是根據每一局的比賽來作上述的分析或是隨著比賽時間推進時某些數據所產生的差異變化等等,並且再利用 matplotlib 製成圖表也非常的有趣!