久久精品中文字幕免费_91香蕉国产亚洲一区二区三区_国产精品巨作无遮拦_亚洲人成电影

    <center id="oy65s"><ol id="oy65s"></ol></center>

  • <menu id="oy65s"></menu>
    當(dāng)前位置:首頁(yè) > 足球資訊 > 正文內(nèi)容

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

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

    開始之前

    本篇假設(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)。

    我們可以分析些什么?

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

    開發(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é)計(jì)算四件套:numpy、scipy、matplotlib、pandas,這幾個(gè)軟件包可以直接在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ǎng)為基礎(chǔ)的數(shù)據(jù)之外,還支持多種面向球賽/球員統(tǒng)計(jì)數(shù)據(jù)的圖表。mplsoccer還可以直接讀取解析足球數(shù)據(jù)提供商statsbomb的數(shù)據(jù),但本篇中沒有使用mplsoccer的這項(xiàng)功能。

    足球分析軟件kloppy

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

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

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

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

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

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

    顯然事件數(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美國(guó)國(guó)家聯(lián)賽362018英超32618/19 – 20/21合計(jì)1096

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

    wyscout

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

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

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

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

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

    metrica sport

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

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

    skillcorner

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

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

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

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

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

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

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

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

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

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

    球門尺寸:

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

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

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

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

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

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

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

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

    同時(shí)瀏覽一下開放數(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è)計(jì)了一套標(biāo)準(zhǔn)數(shù)據(jù)模型,來適應(yīng)不同數(shù)據(jù)服務(wù)商的數(shù)據(jù)。

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

    第一種方法:直接訪問

    e.raw_event[play_pattern]

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

    第二種方法,使用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)球部位這兩個(gè)屬性,不需要訪問raw_event屬性了。

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

    加載數(shù)據(jù)操作load返回kloppy事件數(shù)據(jù)集EventDataset可以使用迭代器進(jìn)行訪問,可以使用進(jìn)行過濾,也可以使用查找,還可以通過某個(gè)事件獲取關(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()

    通常對(duì)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的文檔頁(yè)面。

    使用mplsoccer

    mplsoccer畫出一個(gè)球場(chǎng)非常簡(jiǎn)單:

    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的許多畫圖操作,可以一對(duì)一使用。

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

    將前面的東西綜合起來,我們可以得到一個(gè)表達(dá)出一場(chǎng)比賽中射門位置、射門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),長(zhǎ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ù),包含了球場(chǎng)大小、進(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)球場(chǎng)大小 pitch_length=105 pitch_width=68 # 我們只分析一只球隊(duì),所以畫半場(chǎng)圖形更方便 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ì)名稱、射門的球場(chǎng)坐標(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ì)伍,這場(chǎng)比賽是巴塞羅那 df = df.loc[df[team]==team1.name] # 將射門事件用點(diǎn)散點(diǎn)圖畫出來,xG用條帶顏色表示,顏色越深進(jìn)球可能性越高 # 坐標(biāo)位于[0,1],還有按照球場(chǎng)長(zhǎng)寬進(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)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。

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

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

    韓國(guó)隊(duì)能進(jìn)16強(qiáng)?逼平烏拉圭隊(duì),韓媒挺滿意

    韓國(guó)隊(duì)能進(jìn)16強(qiáng)?逼平烏拉圭隊(duì),韓媒挺滿意

    來源:環(huán)球時(shí)報(bào) 【環(huán)球時(shí)報(bào)綜合報(bào)道】本屆世界杯的第四場(chǎng)0∶0出現(xiàn)了。北京時(shí)間24日晚進(jìn)行的卡塔爾世界杯H組的一場(chǎng)較量中,韓國(guó)隊(duì)與烏拉圭隊(duì)以0∶0戰(zhàn)成平局。本場(chǎng)比賽,孫興慜與蘇亞雷斯的對(duì)決最引人矚目,但這兩名前鋒本場(chǎng)比賽狀態(tài)平平,沒能幫助球隊(duì)在進(jìn)攻端收獲進(jìn)球。韓國(guó)“最佳11人”網(wǎng)站稱...

    足球是愛,永不止步!

    足球是愛,永不止步!

    她,是清華博士生 她,曾是清華女足隊(duì)長(zhǎng) 她,是清華馬杯男足比賽中 第一個(gè)上場(chǎng)的女生 她,是首都高校五人制冠軍 她為了集體的夢(mèng)想無私奉獻(xiàn) 她私下付出的汗水和無數(shù)訓(xùn)練的日夜 換來今日榮譽(yù)為她加冕 她就是今天的主人公 精儀系...

    競(jìng)彩足球玩法大簡(jiǎn)介,看完才知道怎么玩!

    競(jìng)彩足球玩法大簡(jiǎn)介,看完才知道怎么玩!

    競(jìng)彩足球總共有4種玩法,分別是勝平負(fù)\讓球勝平負(fù)、比分、總進(jìn)球數(shù)、半全場(chǎng)。下面我們就具體來說說這些玩法的規(guī)則。 1、勝平負(fù)/讓球勝平負(fù)玩法 勝平負(fù)是指全場(chǎng)90分鐘(含傷停補(bǔ)時(shí))主隊(duì)的勝、平、負(fù)情況。 讓球勝平負(fù)則是指全場(chǎng)90分鐘(含傷停補(bǔ)時(shí))主隊(duì)加減 “讓球數(shù)” 后...

    【競(jìng)彩足球推薦】 001 西甲 巴倫西亞 VS 皇家貝蒂斯 002 英超 阿斯頓維拉 VS 利物浦?能否穩(wěn)定發(fā)揮?你看好哪一隊(duì)?

    【競(jìng)彩足球推薦】 001 西甲 巴倫西亞 VS 皇家貝蒂斯 002 英超 阿斯頓維拉 VS 利物浦?能否穩(wěn)定發(fā)揮?你看好哪一隊(duì)?

    體彩公益,樂善人生 為國(guó)家公益事業(yè)添磚加瓦 從我做起 前言: 以下賽事解讀,僅代表個(gè)人看法。 風(fēng)水輪流轉(zhuǎn),競(jìng)彩亞盤也是這般!選擇和勇氣同樣重要!合理投注,理性選擇,穩(wěn)步收金! ——小王 奧利給!昨日競(jìng)彩足球推薦了001,00...

    中國(guó)足彩網(wǎng)競(jìng)彩27日推薦:看好比利時(shí)取得兩連勝

    中國(guó)足彩網(wǎng)競(jìng)彩27日推薦:看好比利時(shí)取得兩連勝

      世界杯 比利時(shí)VS摩洛哥   比賽時(shí)間:2022-11-27   21:00   球場(chǎng):阿圖瑪瑪球場(chǎng)   比利時(shí)的黃金一代已經(jīng)在逐步謝幕,球隊(duì)的新老交替還在繼續(xù),后場(chǎng)實(shí)力較為有限,中場(chǎng)則坐擁德布勞內(nèi),阿扎爾等悍將。盧卡庫(kù)目前存在傷...

    中國(guó)足彩網(wǎng)競(jìng)彩27日推薦:加拿大阻擊克羅地亞

    中國(guó)足彩網(wǎng)競(jìng)彩27日推薦:加拿大阻擊克羅地亞

      世界杯 克羅地亞VS加拿大   比賽時(shí)間:2022-11-28   00:00   球場(chǎng):哈里發(fā)國(guó)際體育場(chǎng)   克羅地亞在上一屆世界杯拿到了亞軍,隨后曼朱基奇,拉基蒂奇等功勛從國(guó)家隊(duì)退役,球隊(duì)?wèi)?zhàn)斗力就出現(xiàn)了明顯的下滑趨勢(shì)。本次世界...

    ?