Tässä artikkelissa käydään läpi miten MyVideoanalyserin aikajanan JSON -tiedosto saadaan parsittua Pythonissa analysoitavaan muotoon.

Edellinen kirjoitukseni koski MyVideoanalyserin analyysipohjaa, jolla pystyy lisäämään ohjelman tapahtumiin lisätietoa. Jotta näistä lisätiedoista olisi enemmän hyötyä, ja niitä kannattaisi lisäillä tapahtumiin, tulee myös aikajanan tapahtumadataa käsitellä analyysivaiheessa. Itse suosin tässä Pythonia, koska kyseisellä ohjelmointikielellä on helppo ja nopea tehdä sovelluksia, joita voi hyödyntää määrällisessä analyysissa. Kaiken lisäksi Python pitää sisällään monipuolisia kirjastoja, joilla esimerkiksi visualisointien tekeminen käy lähes kuin itsestään.

Toki visualisointien tekemiseen ja tapahtumadatan käsittelyyn vaaditaan kärsivällisyyttä sekä systemaattisuutta, jotta luotavalla analyysilla olisi hyötyä myös valmennuksellisesta näkökulmasta. Jotta emme vain tekisi kuvaajia sekä erilaisia syöttökarttoja sen vuoksi, että se on mahdollista tulee olla määriteltynä joukkueen KPI-mittarit. Eli kyseisen joukkueen kannalta keskeiset suorituksen avainmittarit, joiden avulla meidän on mahdollista saavuttaa haluttu lopputulos, eli voittaa ottelu. Olen aikaisemmin kirjoittanutkin KPI-mittareista, ja pääset lukemaan kyseisen artikkelin halutessasi tästä. Tästä aiheesta on minulle tullut sen verran kysymyksiä, että luultavasti tulevaisuudessa tulen kirjoittamaan jokusen sanan vielä aiheesta.

MyVideoanalyserin raportointityökalu

Kaikki lähtee liikkeelle siitä, että olet MyVideoanalyserissa täydentänyt tapahtumadataa haluamillasi lisämääreillä. Kun olet saanut halutut lisämääreet lisättyä ja laadullista analyysia varten trimmattua haluamasi tapahtumat, voit siirtyä määrällisen analyysin pariin.

Pystyt MyVideoanalyserissa itsessään luomaan rajoitettuja raportteja ottelun tapahtumadataan pohjautuen. Näitä raportteja ei kuitenkaan pysty tulostamaan, mutta ruutukaappauksia niistä saa, jos haluat liittää kuvaajia esimerkiksi PowerPoint esitykseen. Itse näen, että oletten aikaiseen määrälliseen analysointiin tuo MyVideoanalyserin raporttipohja toimii hyvin, mutta tarkempaan määrälliseen analyysiin näiden raporttien luominen on turhan hankalaa. Tämä on toki vain minun ongelmani, eikä välttämättä tarkoita, että kaikki kokevat näin. Joka tapauksessa itselleni on helpompi luoda raporttipohjia turvautuen JSON-tiedostoon sekä Pythoniin.

Esimerkki MyVideoanalyserin raportointityökalun käytöstä

Kuten yllä olevasta kuvasta on helposti huomattavissa, niin numereellisen ja miksei myös graafisen informaation nopea raportointi onnistuu kyseisellä raportointityökalulla helposti. Hienoa tässä on myös se, että käyttämällä ottelun aikana MyVA remotea, valmennuksen on mahdollista nähdä vastaava raporttikatsaus livenä penkillä. Toki tämän edellytyksena on se, että analyytikko pystyy taggaamaan vaadittavat lisämääreet ottelun aikana lennosta.

Tapahtumadatan käsitteleminen Pythonilla

MyVideoanalyserista on mahdollista tuoda aikajanan tapahtumadataa ulos kahdessa eri tiedostomuodossa, XML sekä JSON. Molemmat vaativat jonkun verran työstöä Pythonin päässä, mutta minusta JSON oli selkeämpi formaatti ja sen vuoksi itse hyödynnän kyseistä formaattia.

Kaikki lähtee liikkeelle siitä, että Pythonissa ladataan tarvittavat kirjastot ohjelmaan.

# Build-in modules
import json
import os

# Other modules
import matplotlib.pyplot as plt
import pandas as pd

FILENAME = 'Events.json'

directory = os.path.dirname(os.path.abspath(__file__))
events = f"{directory}/{FILENAME}"
json_df = pd.DataFrame()

Riveillä 1 – 7 ladataan tarvittavat kirjastot mukaan sovellukseen. Tässä tapauksessa en hyödynnä grafiikkakirjastoa matplotlib mihinkään, mutta yleensä aina lataan sen mukaan, koska haluan luoda datasta erilaisia visualisointeja. Näiden kirjastojen lisäksi yleensä käytän myös itse luomaani DrawField -kirjastoa, jonka avulla pystyn luomaan eri kokoisia jalkapallokenttiä eri värityksillä.

Mikäli haluan tehdä helppo käyttöisiä sovelluksia, joissa ei tarvitse käydä kooditasolla muuttamassa esimerkiksi tiedostonimiä, niin silloin lataan myös mukaan streamlit -kirjaston. Streamlit mahdollistaa helpon HTML-pohjaisen Python sovelluksen luonnin, jota hallinnoidaan verkkoselaimella. Streamlit mahdollistaa myös interaktiivisten visualisointien luonnin, niin siinäkin mielessä se on monipuolinen ja hyvä kirjasto data-analyysien pohjalle.

Riveillä 9 – 13 määrittelen hakemiston sekä JSON -tiedoston nimen, jossa tapahtumadata sijaitsee sekä luon tyhjän DataFramen, johon tapahtumadata tallennettaan. Tapahtumadata voitaisiin yhtähyvin tallentaa dictionary -tyyppiseen muuttujaan, mutta DataFrame mahdollistaa joustavammat haut, ryhmittelyt sekä perustilastomatematiikan laskutoimitukset suoraan DataFramen sisällä, niin sen vuoksi itse suosin sitä.

Seuraavassa vaiheessa sitten tuleekin avata kyseinen tiedosto ja alkaa parsimaan dataa DataFrameen, sellaiseen muotoon, että sitä olisi sitten helppo jatkossa käyttää ja käsitellä esimerkiksi visualisointien tekemisessä.

# Open JSON file to Pandas DataFrame
if os.path.isfile(events):
    with open(events, 'r') as data_file:
        data = json.loads(data_file.read())

    tmp_df = pd.json_normalize(data['rows'], errors='ignore', sep='_')

    i = 0
    for key, row in tmp_df.iterrows():
        for h in row.highlights:
            json_df.at[i, 'Name'] = row['name']
            json_df.at[i, 'Start'] = h['start']
            json_df.at[i, 'End'] = h['end']
            json_df.at[i, 'Duration'] = h['end'] - h['start']

            # Parse highlights extra parameters, extra name should be category:value
            for e in h['events']:
                (category, value) = e['name'].split(':')
                if (category in json_df.columns) and (not pd.isna(json_df.at[i, category])) and (not pd.isnull(json_df.at[i, category])):
                    json_df.at[i, category] = f"{json_df.at[i, category]}, {value}"
                else:
                    json_df.at[i, category] = value

            i += 1

Seuraavilla riveillä avataan tapahtumadatatiedosto sekä lähdetään käsittelemään sitä rivi kerrallaan ja lisäämään löydettyt tapahtumat lisämääreineen json_df -nimiseen DataFrameen. Tuossa koodissa luodaan muun muossa tapahtuman nimi sarakkeeseen Name sekä tapahtuman alkukohta ja loppukohta sarakkeisiin Start ja End. Olen myös laskenut suoraan tuossa DataFrameen mukaan tapahtuman keston (Duration), jotta olisi helpompi luoda esimerkiksi tilastollisia yhteenvetoja eri pelin vaiheiden kestoista.

Varsinainen hauskuus ja vaativa osuus on tapahtumien lisämääreiden käsitteleminen. Lisämääreiden käsittely on siinä mielessä mielenkiintoista, että MyVideoanalyserissa ei lisämääreiden osalta ole käytössä kategorioita tai muitakaan lisämääreiden ryhmittelyyn tarkoitettuja ominaisuuksia. Käytännössä voit antaa lisämääreelle vain nimen. Tästä syystä minulla on tapana käyttää lisämääreiden nimissä : -merkkiä, jonka avulla erotan toisistaan kategorian sekä lisämääreen arvon. Kun teen analyysipohjaa ja haluan lisätä lisämääreen, joka liittyy avaamiseen ja avaamisen kohteena on vaikka 10-alue, niin silloin nimeän kyseisen lisämääreen avaaminen:10-alue. Tällöin avaaminen on kategoria ja varsinainen arvo on 10-alue. Näin saan määrälliseen analyysiin lisää merkityksellistä data, koska ilman ryhmittelyä (kategoriointia) kyseisen lisämääreen arvo olisi vain 10-alue, jolloin määrällisen analyysin tekeminen olisi hankalaa, kun lisämääreitä on paljon.

Edellä esitetyssä koodissa lisään jokaisen kategorian omaksi sarakkeekseen DataFrameen ja lisämääreen arvon kyseisen solun arvoksi. Mikäli kyseisessä rivissä kyseisssä kategoriassa on jo arvo, niin erottelen useammat arvot toisistaan pilkulla. Näin esimerkiksi saman tapahtuman aikana (kuvataan vaikka avaamista) on avaaminen -kategoriaan voinut tulla arvot laitaan sekä 10-alue, jolloin DataFramessa sarakkeessa avaaminen olis arvona laitaan, 10-alue.

Käytännössä tuossa olikin kaikki tuon datan parsimisesta eli tuomisesta Pythoniin. Tämän jälkeen voit tehdä erilaisia hakuja json_df -DataFrameen ja näiden hakujen pohjalta visualisointeja, jotka tuovat lisäarvoa ottelun analysointiin. Hyödyntämällä matplotlib -kirjastoa voit luoda erilaisia taulukoita, graafeja tai visualisointeja.

Mikäli koet tällaiset kirjoitukset tarpeelliseksi, niin laita ihmeessä viestiä. Ehdota myös aiheita, joista haluaisit lukea.

Ei muuta kuin tsemppiä pelien analysointiin ja toivottavasti sait tästä uusia ideoita omaan analyysityöskentelyysi.