In [1]:
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import numpy as py
#import scipy
# Make the graphs a bit prettier, and bigger
#pd.set_option('display.mpl_style', 'default')
#plt.rcParams['figure.figsize'] = (15, 5)
# This is necessary to show lots of columns in pandas 0.12.
# Not necessary in pandas 0.13.
pd.set_option('display.width', 5000)
pd.set_option('display.max_columns', 60)
Najprej sem spletne strani FIS pobrala podatke o smučarjih in njihovih id številkah na spletišču FIS. Id-je sem potrebovala za sestavljanje url naslovov posameznih športnikov. Zbrane podatke sem nato spravila v datoteko smucarji.csv.
In [2]:
pot="csv-datoteke/smucarji.csv"
smucarji = pd.read_csv(pot, parse_dates=['rojstvo'], index_col='id')
Tabela izgleda tako:
In [3]:
smucarji[:10]
Out[3]:
Nato sem za vsakega od tekmovalcev s strani z njegovimi rezultati (npr. Eva-Maria Brem) pobrala podatke o vsaki tekmi: datum, prizorišče, disciplino, uvrstitev, zaostanek.
In [4]:
pot_brem = "csv-datoteke/BREM Eva-Maria.csv"
brem = pd.read_csv(pot_brem, parse_dates=['datum'])
Tabela za Evo-Mario Brem:
In [5]:
brem[:10]
Out[5]:
Žal si z datumi ne bomo mogli pomagati, saj so na spletni strani z rezultati zapisani v različnih formatih. Kot primer si lahko ogledamo prvo in drugo vrstico zgornje tabele. Iz prve vrstice lahko sklepamo, da je zapis v obliki YYYY-MM-DD, kar pa bi pomenilo, da je bila tekma v drugi vrstici izvedena 3. julija 2016, kar pa iz očitnih razlogov ni res. Tega žal ne morem popraviti.
Da lahko primerjam tudi tekmovalce med seboj, sem naredila še csv datoteko 'vse.csv', v kateri zapišem vse podatke kot zgoraj in id tekmovalca:
In [6]:
pot1 ="csv-datoteke/vse.csv"
vse = pd.read_csv(pot1, parse_dates=['datum'])
Tabela izgleda tako:
In [7]:
vse[197:203]
Out[7]:
V kasnejši analizi se pojavi težava, da so podatki o uvrstitvi lahko številke ali besedilo (npr. DNQ1, DNF1, DSQ2 in DNS1), ki označuje odstope, diskvalifikacije in podobne anomalije. Zato tabelam dodamo nov stolpec mesto1, kjer besedilne podatke identificiramo z 0. Tu nas ne zanima, zakaj tekmovalec ni osvojil točk.
In [8]:
def pretvori(bes):
if bes in ['DNQ1', 'DNF1', 'DSQ2', 'DNS1','DNF2','DSQ1','DNS2','DNQ2','DNF','DNC1','DSQ','DNS']:
return 0
else:
return int(bes)
Če bomo želeli delati analizo skupnega seštevka, moramo pretvoriti mesto tudi v točke. Definiramo seznam 'tocke', v katerega na i-to mesto (i teče od 0 do 30) zapišemo, koliko točk tekmovalec dobi za osvojeno i-to mesto. Nato napišemo še funkcijo, ki nam pretvori mesto v osvojene točke.
In [9]:
tocke=[0,100,80,60,50,45,40,36,32,29,26,24,22,20,18,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
def pretvori_2(bes):
if bes in ["DNQ1", "DNF1", "DSQ2", "DNS1", "DNF2"]:
return 0
else:
if int(bes) > 30:
return 0
else:
return tocke[int(bes)];
Tabelam zdaj dodamo stolpce:
In [10]:
vse['mesto1'] = vse['mesto'].map(pretvori)
brem['mesto1'] = brem['mesto'].map(pretvori)
vse['tocke'] = vse['mesto1'].map(pretvori_2)
brem['tocke'] = brem['mesto1'].map(pretvori_2)
brem[:5]
Out[10]:
Zgornja tabela prikazuje predelano tabelo za Evo-Mario Brem. Enako smo naredili s tabelo z vsemi podatki:
In [11]:
vse[2024:2028]
Out[11]:
Pa si poglejmo, v katerih disciplinah najpogosteje tekmuje Eva-Maria Brem:
In [12]:
brem['disciplina'].value_counts()
Out[12]:
Eva-Maria Brem je torej najpogosteje tekmuje v slalomu in veleslalomu. Ponazorimo to še z grafom:
In [13]:
brem['disciplina'].value_counts().plot(kind='pie', figsize=(6,6))
Out[13]:
Čeprav najpogosteje tekmuje v slalomu in veleslalomu, pa to nista nujno disciplini, v katerih dosega najboljše rezultate. Najprej si poglejmo, kakšni so njeni rezultati v slalomu in nato še veleslalomu:
In [14]:
slalom = brem['disciplina'] == 'Slalom'
brem[slalom][:10]
Out[14]:
In [15]:
veleslalom = brem['disciplina'] == 'Giant Slalom'
brem[veleslalom][:10]
Out[15]:
Iz tabel je razvidno, da so njeni razultati v slalomu v vačini na repu trideseterice, med tem ko se v veleslalomu uvršča med 5 najboljših. To se še lepše vidi z grafov:
In [16]:
brem[slalom]['mesto1'].value_counts().plot(kind='bar', title="Rezultati E. M. Brem v slalomu")
Out[16]:
In [17]:
brem[veleslalom]['mesto1'].value_counts().plot(kind='bar', title='Rezultati E. M. Brem v veleslalomu')
Out[17]:
Poglejmo še koliko točk je v povprečju osvojila pri posamezni disciplini, da določimo njeno "paradno disciplino".
In [18]:
brem.groupby(['disciplina'])['tocke'].sum() / brem['tocke'].sum()
Out[18]:
Veleslalom je torej precej očitno disciplina, ki ji prinaša največ točk.
Poglejmo si še podatke za letošnjo sezono. Prva tekma je bila 24. 10. 2015 v Soeldnu.
In [19]:
prvi_del = brem[brem['datum'].dt.year == 2016]
drugi_del = brem[(brem['datum'].dt.month > 9) & (brem['datum'].dt.year == 2015)]
tabela = prvi_del.append(drugi_del)
tabela
Out[19]:
Ker si z datumi ne moremo pomagati, glejmo le dosežena mesta:
In [20]:
tabela['mesto1'].value_counts().plot(kind='pie')
Out[20]:
Podoben graf si poglejmo posebej še za veleslalom:
In [21]:
tabela[tabela['disciplina'] == 'Giant Slalom']['mesto1'].value_counts().plot(kind='pie')
Out[21]:
Opazimo, da ena uvrstitev odstopa: to je njena prva uvrstitev v sezoni: "le" 8. mesto v Soeldnu 24. 10. 2015.
Poglejmo si še analizo po prizoriščih. Postavimo si vprašanje, kje dosega boljše rezultate.
In [22]:
po_krajih = brem.groupby(['kraj'])['tocke'].sum() / brem['tocke'].sum()
po_krajih.nlargest(7)
Out[22]:
V Are-ju je osvojila kar 20 % vseh svojih točk. Ali tam dosega tudi najvišja mesta?
In [23]:
po_krajih1 = brem.groupby(['kraj'])['tocke'].mean()
po_krajih1.nlargest(7)
Out[23]:
Najvišja mesta očitno dosega v Meribelu. Da rezultate še bolje razložimo, poglejmo, koliko tekem se je Eva-Maria Brem udeležila v posameznem kraju.
In [24]:
brem.groupby(['kraj']).size().sort_values(ascending = False)
Out[24]:
V Are-ju se E. M. Brem je udeležila daleč največ tekem, zato ni čudno, da je tam osvojila največ točk. Prav tako ne moremo trditi, da je Meribel njeno "najboljše" prizorišče, saj je tam tekmovala na le eni tekmi.
V tem razdelku bomo imeli nekaj težav, saj na strani, iz katere pobiramo podatke, ni zapisa o spolu tekmovalca.
Najprej pa poglejmo rezultate za sezono 2015/16.
In [25]:
sezona = vse[vse['datum'].dt.year == 2016]
drugi_del_vse = vse[(vse['datum'].dt.month > 9) & (vse['datum'].dt.year == 2015)]
sezona.append(drugi_del)[40:46]
Out[25]:
Zanima nas, koliko nastopov so zbrali tekmovalci v letošnji sezoni. Prikazujemo število nastopov za 10 tekmovalcev.
In [39]:
sezona.groupby(['id']).size()[:10]
Out[39]:
In [27]:
sezona.groupby(['id']).size().max()
Out[27]:
Tekmovalec ali tekmovalka z največ nastopi je nastopila 21-krat. Kdo pa je to?
In [28]:
nova = sezona.groupby(['id']).size()
nova.nlargest(6)
Out[28]:
To sta torej dva tekmovalca in sicer z id številkama 125871 in 127048 - Lara Gut in Alexis Pinturault.
In [29]:
print(smucarji.get_value(index = 125871, col = 'ime'), ", ", smucarji.get_value(index = 127048, col = 'ime'))
Kdo pa je osvojil največ točk? Poglejmo 10 najboljših:
In [30]:
sezona.groupby(['id']).agg({'tocke':sum}).nlargest(columns = 'tocke', n = 10)
Out[30]:
Še njihova imena:
In [31]:
naj = [106332,127048,154950,125871,104502,27657,30368,107164,109079,137380]
for i in naj:
print(i,': ', smucarji.get_value(index = i, col = 'ime'))
Zanima nas, koliko je smučarjev določene narodnosti. Najprej jih preštejmo, nato pa ponazorimo to z grafom:
In [32]:
smucarji['drzava'].value_counts().head(10)
Out[32]:
In [33]:
smucarji['drzava'].value_counts().plot(kind='bar', figsize = (12,6))
Out[33]:
Najprej si oglejmo, katere znamke smuči so najpogostejše v svetovnem pokalu:
In [34]:
smucarji['smuci'].value_counts()
Out[34]:
In [35]:
smucarji['smuci'].value_counts().plot(kind='pie', figsize=(6,6))
Out[35]:
Poglejmo, predstavniki katerih držav uporabljajo smuči Head (in koliko jih je):
To do: naredi graf, ki bo prikazal to za vse smuči.
In [36]:
smucarji[smucarji['smuci'] == "Head"]['drzava'].value_counts().plot(kind='bar')
Out[36]:
Podobno si lahko pogledamo, katerim proizvajalcem smuči najbolj zaupajo smučarji iz avstrije:
In [37]:
smucarji[smucarji['drzava'] == "AUT"]['smuci'].value_counts().plot(kind='bar')
Out[37]:
Z analizo enega samega proizvajalca oz. ene same države ne dobimo širše slike, zato si oglejmo graf, ki za vsako državo prikaže, smuči katerega proizvajalca uporabljajo njeni reprezentanti.
In [38]:
oboje = smucarji.groupby(['smuci','drzava']).size()
priprava = oboje.unstack().plot(kind='barh', stacked=True, figsize=(20, 14), fontsize=12)
priprava.legend(loc=(0.02,1), ncol=6)
Out[38]:
In [ ]: