国产露脸精品国产沙发|极品妇被弄得99久九精品亚洲|亚洲va成精品在线播放人|日韩精品久久久免费观看

    
    

        <delect id="w59je"></delect>

            當(dāng)前位置:首頁 > 足球資訊 > 正文內(nèi)容

            Soccermatics之一:使用python分析足球數(shù)據(jù)集

            杏彩體育2年前 (2023-03-01)足球資訊91

            開始之前

            本篇假設(shè)讀者熟悉python編程、matplotlib和pandas軟件包的使用

            鳴謝

            本篇的內(nèi)容部分參考了Soccermatics(https://soccermatics.readthedocs.io);

            數(shù)據(jù)集使用了Statsbomb公司(https://www.statsbomb.com)的開放數(shù)據(jù)(https://github.com/statsbomb/open-data)。

            我們可以分析些什么?

            利用豐富的球場比賽數(shù)據(jù),可以分析射門瞬間,防守進(jìn)攻的各種選擇;分析傳球網(wǎng)絡(luò)圖、球場熱點(diǎn);計算射門預(yù)期進(jìn)球,評價球員控球或無球跑動,量化球員招募等等。

            開發(fā)環(huán)境

            基礎(chǔ)環(huán)境

            python環(huán)境

            python3.10 venv,推薦ubuntu,安裝軟件包方便快捷,非常適合用作開發(fā)環(huán)境,直接在應(yīng)用商店中安裝,不需要使用瀏覽器下載軟件安裝包。

            如果系統(tǒng)已經(jīng)安裝了python的軟件包virtualenv,則可以使用如下命令創(chuàng)建并激活虛擬運(yùn)行環(huán)境(假設(shè)所有的數(shù)據(jù)和代碼都存放在eda目錄下):

            mkdir eda cd eda python3.10 -m venv env source env/bin/activate

            科學(xué)計算四件套:numpy、scipy、matplotlib、pandas,這幾個軟件包可以直接在python虛擬運(yùn)行環(huán)境中安裝:

            pip install -U numpy scipy matplotlib pandas

            推薦使用poetry來管理軟件包,pyenv管理虛擬運(yùn)行環(huán)境。

            足球數(shù)據(jù)分析軟件之mplsoccer

            mplsoccer(https://github.com/andrewRowlinson/mplsoccer)是基于畫圖軟件matplotlib的足球可視化軟件,除了可以展示球場為基礎(chǔ)的數(shù)據(jù)之外,還支持多種面向球賽/球員統(tǒng)計數(shù)據(jù)的圖表。mplsoccer還可以直接讀取解析足球數(shù)據(jù)提供商statsbomb的數(shù)據(jù),但本篇中沒有使用mplsoccer的這項(xiàng)功能。

            足球分析軟件kloppy

            kloppy(https://github.com/PySport/kloppy)是設(shè)計用來統(tǒng)一訪問多個足球數(shù)據(jù)集提供商的訪問庫。不同的最取數(shù)據(jù)服務(wù)商的數(shù)據(jù)在格式和描述方式上有區(qū)別,如果需要來自多個服務(wù)商的數(shù)據(jù)或者需要切換數(shù)據(jù)服務(wù)商,則代碼會比較混亂。kloppy提供了數(shù)據(jù)的序列化/反序列化、標(biāo)準(zhǔn)數(shù)據(jù)描述模型、數(shù)據(jù)過濾/轉(zhuǎn)換器等一系列功能,使讀取足球數(shù)據(jù)方便快捷。

            其他配套軟件視個人喜好:編輯器Microsoft vscode以及相關(guān)插件,python軟件包jupyter等。

            足球數(shù)據(jù)集

            足球的數(shù)據(jù)種類很多,涵蓋了球隊(duì)?wèi)?zhàn)績、球員能力等各個方面,但要是想詳細(xì)分析某一長球賽的細(xì)節(jié),目前用來分析的主要是下面幾種數(shù)據(jù)。

            事件數(shù)據(jù)

            事件數(shù)據(jù)詳細(xì)描述了一場球賽中的每一次球處理的詳細(xì)信息,比如傳球、射門、盤帶、爭頂?shù)?,每次事件包含了時間、球員、球場坐標(biāo)等,以及其他詳細(xì)信息。事件數(shù)據(jù)是由數(shù)據(jù)提供商從比賽錄像中人工提取,一般來說一場比賽會包含數(shù)千個事件。

            顯然事件數(shù)據(jù)需要成本,但近年來一些數(shù)據(jù)服務(wù)商免費(fèi)提供了一些公開數(shù)據(jù),這些免費(fèi)的公開數(shù)據(jù)主要有:

            statsbomb

            賽事比賽數(shù)量賽季男足世界杯642018歐洲杯512020英超(阿森納)3303/04西甲(梅西)52004/05 – 20/21歐冠(決賽)1499/00 – 18/19女足世界杯522019美國國家聯(lián)賽362018英超32618/19 – 20/21合計1096

            數(shù)據(jù)下載頁面(https://github.com/statsbomb/open-data

            wyscout

            賽事比賽數(shù)量賽季法甲38017/18英超38017/18意甲38017/18西甲38017/18德甲30617/18世界杯642018歐洲杯512016合計1941

            數(shù)據(jù)下載頁面(https://github.com/koenvo/wyscout-soccer-match-event-dataset)

            追蹤數(shù)據(jù)

            跟蹤數(shù)據(jù)是將球賽每時每刻的球員和足球的位置坐標(biāo)都記錄下來,每秒25幀!

            免費(fèi)的追蹤數(shù)據(jù)主要有:

            metrica sport

            這個公開數(shù)據(jù)包含了三場匿名的比賽追蹤數(shù)據(jù),幀速為25Hz,除了場上所有球員的追蹤數(shù)據(jù)外,還提供了與追蹤數(shù)據(jù)時間對齊的事件數(shù)據(jù)。

            數(shù)據(jù)下載鏈接(https://github.com/metrica-sports/sample-data)

            skillcorner

            SkillCorner的免費(fèi)數(shù)據(jù)包含了9場比賽,幀速為10Hz。數(shù)據(jù)是從直播鏡頭中采集,因此數(shù)據(jù)只包含了位于鏡頭中的球員。

            數(shù)據(jù)下載鏈接(https://github.com/SkillCorner/opendata)

            事件數(shù)據(jù)往往具備語義,適合做機(jī)器統(tǒng)計分析,雖然不同提供商的語義模型稍有差異;而追蹤數(shù)據(jù)包含了每刻球員的位置沒有包含語義,適合進(jìn)行人工分析;如果事件數(shù)據(jù)和追蹤數(shù)據(jù)的時間軸是對齊的,配合起來更加強(qiáng)大。

            開始數(shù)據(jù)分析

            Statsbomb數(shù)據(jù)集更新頻繁,數(shù)據(jù)豐富,還包含了其特有的360數(shù)據(jù)幀。360數(shù)據(jù)記錄了該事件發(fā)生時其他球員的位置,使態(tài)勢分析更加有依據(jù)。StatsBomb 的公開數(shù)據(jù)為 2020 年歐洲杯的 51 場比賽提供了360數(shù)據(jù)幀。

            開放數(shù)據(jù)的每次射門事件還包含了Statsbomb根據(jù)自己的模型計算出的期望進(jìn)球概率(Expected Goals, xG)數(shù)據(jù)。

            本篇使用了Statsbomb的公開數(shù)據(jù)集。

            Statsbomb數(shù)據(jù)說明

            由于數(shù)據(jù)訪問涉及到球場坐標(biāo),因此球場大小、進(jìn)攻方向和坐標(biāo)系統(tǒng)就尤為重要。不幸的事,這事還沒有標(biāo)準(zhǔn)可言,目前不同的數(shù)據(jù)提供商都自有一套。有的廠商坐標(biāo)原點(diǎn)是左上,有的是左下,有的坐標(biāo)范圍是[0,1],有的是標(biāo)準(zhǔn)球場尺寸坐標(biāo),因此在處理數(shù)據(jù)過程中特別需要注意。

            下圖的球場尺寸是來自Statsbomb開放數(shù)據(jù)中的數(shù)據(jù)規(guī)范:

            球門尺寸:

            Statsbomb的位置坐標(biāo)是按照以球場左上為原點(diǎn),球場大小為120×80來記錄的。

            注意:Statsbomb的長度單位是碼(yard),在必要的時候,我們需要將其轉(zhuǎn)換為米,以米為單位的標(biāo)準(zhǔn)球場大小是105×68。

            注意:數(shù)據(jù)中記錄的位置數(shù)據(jù),在進(jìn)攻(射門事件)時,不論主隊(duì)客隊(duì),進(jìn)攻方向總是從左往右的,也就是說射門事件中,一般來說x坐標(biāo)都在100左右。

            數(shù)據(jù)按照賽事、賽季和比賽進(jìn)行組織,采用json格式文件來描述。

            賽事和賽季數(shù)據(jù)保存在competitions.json文件中,每個賽事、賽季、比賽、球員都有一個id標(biāo)識。

            每個賽事和賽季的比賽存放在matches目錄中,按照賽事id目錄存放了比賽的元數(shù)據(jù)。

            在events和lineups目錄中,按照比賽id存放了每個比賽的事件和陣容數(shù)據(jù)。

            在使用數(shù)據(jù)之前,使用json數(shù)據(jù)查看器看一下數(shù)據(jù)的大概內(nèi)容,對格式和描述內(nèi)容有個大概了解,從文件中可以看出,數(shù)據(jù)的可讀性非常好,也有大量冗余數(shù)據(jù),適合人去理解。

            同時瀏覽一下開放數(shù)據(jù)中包含的數(shù)據(jù)規(guī)范。

            使用kloppy

            數(shù)據(jù)加載

            假設(shè)你的網(wǎng)絡(luò)可以很順利的訪問github,那么我們就可以很順利的加載數(shù)據(jù)了:

            from kloppy import statsbomb # 從開放數(shù)據(jù)中加載id為7559的比賽數(shù)據(jù) # 只加載類型為pass(傳球)和shot(射門)這兩類事件 # 數(shù)據(jù)中的坐標(biāo)系統(tǒng)采用statsbomb坐標(biāo)系統(tǒng) dataset = statsbomb.load_open_data(match_id=7559,coordinates=statsbomb,event_types=[pass, shot])

            也可以把開放數(shù)據(jù)從github克隆到本機(jī),然后采用使用kloppy進(jìn)行加載

            match_id = 68366 base_url = /location/to/you/data/statsbomb/data dataset = statsbomb.load( event_data=os.path.join(base_url, events/%s.json%match_id), lineup_data=os.path.join(base_url, lineups/%s.json%match_id), # 轉(zhuǎn)換為kloppy自己的坐標(biāo)系統(tǒng) coordinates=kloppy )

            kloppy設(shè)計了一套標(biāo)準(zhǔn)數(shù)據(jù)模型,來適應(yīng)不同數(shù)據(jù)服務(wù)商的數(shù)據(jù)。

            標(biāo)準(zhǔn)數(shù)據(jù)模型包含了如下類型的事件:ShotEvent、PassEvent以及GenericEvent(不識別的其他類型事件都放在這里面)等13種,大大少于各數(shù)據(jù)服務(wù)商自行定義的事件類型。那如何訪問標(biāo)準(zhǔn)數(shù)據(jù)模型之外的其他數(shù)據(jù)?

            第一種方法:直接訪問

            e.raw_event[play_pattern]

            raw_event屬性保存的原始的事件,在需要時根據(jù)Statsbomb數(shù)據(jù)規(guī)范進(jìn)行訪問,但要注意這里面的數(shù)據(jù)沒有經(jīng)過kloppy的處理轉(zhuǎn)換,使用時要小心。

            第二種方法,使用EventFactory。通過EventFactory將raw_event中需要的數(shù)據(jù)增加為事件的屬性。

            match_id = 7559 base_url = /location/to/you/data/statsbomb/data import os from kloppy import statsbomb from dataclasses import dataclass from kloppy.domain import EventFactory, create_event, ShotEvent, PassEvent, EventDataset @dataclass(repr=False) class StatsBombShotEvent(ShotEvent): statsbomb_xg: float = None class StatsBombEventFactory(EventFactory): def build_shot(self, **kwargs) -> ShotEvent: kwargs[statsbomb_xg] = kwargs[raw_event][shot][statsbomb_xg] kwargs[body_part_type] = kwargs[raw_event][shot][body_part][name] return create_event(StatsBombShotEvent, **kwargs) event_factory = StatsBombEventFactory() dataset = statsbomb.load( event_data=os.path.join(base_url, events/%s.json%match_id), lineup_data=os.path.join(base_url, lineups/%s.json%match_id), event_types=[shot] coordinates=statsbomb, event_factory=event_factory )

            這樣得到的dataset中的事件就包含了statsbomb_xg期望進(jìn)球概率和body_part_type進(jìn)球部位這兩個屬性,不需要訪問raw_event屬性了。

            數(shù)據(jù)轉(zhuǎn)換

            加載數(shù)據(jù)操作load返回kloppy事件數(shù)據(jù)集EventDataset可以使用迭代器進(jìn)行訪問,可以使用進(jìn)行過濾,也可以使用查找,還可以通過某個事件獲取關(guān)聯(lián)事件。

            # 過濾出所有的射門事件中的進(jìn)球事件 filtered_dataset = dataset.filter(shot.goal) # 查找出所有的傳球事件 passes = dataset.find_all(pass) # 從某一事件中獲取關(guān)聯(lián)事件 events = event.get_related_events()

            通常對EventDataset進(jìn)行過濾或者查找之后轉(zhuǎn)換為pandas DataFrame。

            轉(zhuǎn)換操作to_df可以將數(shù)據(jù)集的指定屬性轉(zhuǎn)換成DataFrame

            dataset.to_df( period_id, timestamp, *coordinates*, )

            可以指定需要保留到DataFrame中的列名稱或者名稱通配符,還可以通過lambda進(jìn)行轉(zhuǎn)換:

            dataset.to_df( # 將事件的某些屬性轉(zhuǎn)換為df的列 lambda event: {period: event.period.id, timestamp: event.timestamp}, # 直接指定列常量 some_columns=1234, # 可調(diào)用的列 other_column=lambda x: random.randint(0, 255) )

            而to_pandas操作可以將事件的所有屬性轉(zhuǎn)換為DataFrame的列,并可以增加一些其他列:

            dataframe = dataset.to_pandas( additional_columns={ player_name: lambda event: str(event.player), team_name: lambda event: str(event.player.team) } )

            具體可以參考kloppy的文檔頁面。

            使用mplsoccer

            mplsoccer畫出一個球場非常簡單:

            from mplsoccer.pitch import Pitch pitch = Pitch(pitch_color=grass, line_color=white, stripe=True) fig, ax = pitch.draw()

            效果如下:

            _images/sphx_glr_plot_quick_start_001.png

            pitch封裝了matplotlib中pyplot的許多畫圖操作,可以一對一使用。

            案例:射門數(shù)據(jù)分析

            將前面的東西綜合起來,我們可以得到一個表達(dá)出一場比賽中射門位置、射門xG(Expected Goals)的射門分析圖

            # 導(dǎo)入比賽數(shù)據(jù) import pandas as pd import os from kloppy import statsbomb # 指定比賽id。如果想分析指定的賽事,可以寫代碼從分析competitions.json開始 match_id = 68366 # 指定數(shù)據(jù)位置。這里假定數(shù)據(jù)下載到了本機(jī) base_url = /location/to/your/data/statsbomb/data # 加載數(shù)據(jù)并設(shè)定kloppy坐標(biāo)系統(tǒng),長寬坐標(biāo)為0~1 # 注意有些未經(jīng)轉(zhuǎn)換的statsbomb附加數(shù)據(jù)的單位仍然是yard dataset = statsbomb.load( event_data=os.path.join(base_url, events/%s.json%match_id), lineup_data=os.path.join(base_url, lineups/%s.json%match_id), coordinates=kloppy ) # 從數(shù)據(jù)集中過濾出射門事件 shots = dataset.filter(shot) # 觀察一下數(shù)據(jù)的元數(shù)據(jù),包含了球場大小、進(jìn)攻方向和坐標(biāo)系統(tǒng) print(dataset.metadata.pitch_dimensions) print(dataset.metadata.orientation) print(dataset.metadata.coordinate_system) # 參賽的兩只球隊(duì) (team1, team2) = dataset.metadata.teams print(team1.name, team2.name) # 米表示的標(biāo)準(zhǔn)球場大小 pitch_length=105 pitch_width=68 # 我們只分析一只球隊(duì),所以畫半場圖形更方便 from mplsoccer import VerticalPitch pitch = VerticalPitch(line_color=black, half = True, pitch_length=pitch_length, pitch_width=pitch_width) fig, ax = pitch.grid(grid_height=0.9, title_height=0.06, axis=False, endnote_height=0.04, title_space=0, endnote_space=0) # 將射門事件轉(zhuǎn)換為DataFrame # 保留了參賽隊(duì)名稱、射門的球場坐標(biāo)和期望進(jìn)球xG df = shots.to_df( lambda e: {team: e.team.name}, coordinate*, lambda e: {statsbomb_xg: e.raw_event[shot][statsbomb_xg]} ) # 篩選出其中一只隊(duì)伍,這場比賽是巴塞羅那 df = df.loc[df[team]==team1.name] # 將射門事件用點(diǎn)散點(diǎn)圖畫出來,xG用條帶顏色表示,顏色越深進(jìn)球可能性越高 # 坐標(biāo)位于[0,1],還有按照球場長寬進(jìn)行轉(zhuǎn)換 pitch.scatter( df.coordinates_x*pitch_length, df.coordinates_y*pitch_width, alpha=1, s = 500, c=df.statsbomb_xg*100, cmap=Reds, ax=ax[pitch], edgecolors=black ) fig.suptitle(%s射門位置%team1.name, fontsize = 30) plt.show() # 由于mplsoccer是基于matplotlib, # 注意解決非Windows系統(tǒng)中matplotlib的中文亂碼

            效果如下:

            以上。

            掃描二維碼推送至手機(jī)訪問。

            版權(quán)聲明:本文由財神資訊-領(lǐng)先的體育資訊互動媒體轉(zhuǎn)載發(fā)布,如需刪除請聯(lián)系。

            本文鏈接:http://www.thecityplacetownhomes.com/?id=64401

            “Soccermatics之一:使用python分析足球數(shù)據(jù)集” 的相關(guān)文章

            2022世界杯排名表,2022世界足球排名?

            2022世界杯排名表,2022世界足球排名?

                   長按識別二維碼或者直接搜索sd19499,加我好友,備注世界杯,我就知道你是干嘛的了,要不我是不會通過的 2022年9月29日,世界知識產(chǎn)權(quán)組織(WIPO)在日內(nèi)瓦發(fā)布了2022年全球創(chuàng)新指數(shù)(GII)。中國在世界132個經(jīng)濟(jì)體...

            競彩足球周六:熱那亞 VS 佛羅倫薩 老愛解球賽事分析

            競彩足球周六:熱那亞 VS 佛羅倫薩 老愛解球賽事分析

            意甲第19輪角逐,由熱那亞坐擁主場迎戰(zhàn)佛羅倫薩。熱那亞其實(shí)可以擁有一個好的排名,但可惜的是球隊(duì)的客場戰(zhàn)績慘淡,9場輸足7場讓他們只能排在聯(lián)賽14位,但是球隊(duì)的主場得分能力尚可,至...

            球探體育比分:利桑德羅:海因策是我的偶像 我會一直為球隊(duì)挺身而出

            球探體育比分:利桑德羅:海因策是我的偶像 我會一直為球隊(duì)挺身而出

            點(diǎn)擊上方藍(lán)字,獲取更多大神球料。  曼聯(lián)中衛(wèi)利桑德羅-馬丁內(nèi)斯今天接受了采訪,并談到了球隊(duì)和自己的風(fēng)格。 利桑德羅說道:“感受到球迷的這份愛讓我非常激動,這種愛也是相互的。我真的很開心,因?yàn)槲沂菑臒o到有的,來到曼聯(lián)這支世界最佳俱樂部之一真的非常特別?!?“...

            球探體育比分:卡里克:很榮幸能執(zhí)教米德爾斯堡,希望能帶給球迷激情與喜悅

            球探體育比分:卡里克:很榮幸能執(zhí)教米德爾斯堡,希望能帶給球迷激情與喜悅

            點(diǎn)擊上方藍(lán)字,獲取更多大神球料。 今日,英冠球隊(duì)米德爾斯堡官方宣布曼聯(lián)名宿卡里克擔(dān)任球隊(duì)新帥,這是他首次出任球隊(duì)正式主帥。 官宣就任后卡里克接受了米德爾斯堡官媒的采訪,表達(dá)了自己執(zhí)教米堡的喜悅:“米德爾斯堡是一家有著悠久歷史和濃厚傳統(tǒng)的球隊(duì),很高興我能成為球隊(duì)的一份子,而且...

            給大家科普一下世界杯足球在哪個網(wǎng)站買便宜(2022已更新(今日/知乎)

            給大家科普一下世界杯足球在哪個網(wǎng)站買便宜(2022已更新(今日/知乎)

              還有不到12個小時,2022卡塔爾世界杯就將吹響開場哨,球迷們翹首以盼的大戲終于要上演。除了在電視機(jī)前看球,世界杯的還有很多“玩”法,根據(jù)中國體育彩票的銷售安排,本屆世界杯全部64場比賽都將作為競彩足球游戲的競猜對象,并且玩法多多。 ?!--article_adlist[  ]...

            給大家科普一下世界杯大小球什么意思(2022已更新(今日/知乎)

            給大家科普一下世界杯大小球什么意思(2022已更新(今日/知乎)

            在大家的慣有印象中,烏拉圭是巴西、阿根廷之后的南美勁旅,不過從成績的角度來說,烏拉圭與巴西、阿根廷絕對是處于同一檔的足球強(qiáng)國。2次奧運(yùn)會足球冠軍、2次世界杯足球賽冠軍、15次美洲杯冠軍,在現(xiàn)代足球史上,烏拉圭國家隊(duì)是獲得洲際以上級別冠軍最多的一支國家足球隊(duì)。在贏得過世界杯冠軍的國家里面,烏...

            ?