Alpsko smučanje

Obdelava podatkov


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="C://Users/Ziva/Documents/AlpineSkiing/csv-datoteke/smucarji.csv"
smucarji = pd.read_csv(pot, parse_dates=['rojstvo'])

Tabela izgleda tako:


In [3]:
smucarji[:10]


Out[3]:
id ime drzava rojstvo smuci
0 70206 ABDERHALDEN Marianne SUI 1986-01-04 Head
1 148274 AERNI Luca SUI 1993-03-27 Salomon
2 166907 AGER Christina AUT 1995-11-11 Atomic
3 137008 AGNELLI Nicole ITA 1992-02-25 Elan
4 139437 ALOPINA Ksenia RUS 1992-05-30 Rossignol
5 163567 ALPHAND Estelle FRA 1995-04-23 Dynastar
6 125750 ANKENY Michael USA 1991-01-17 Nordica
7 80000 BAECK Axel SWE 1987-12-23 Rossignol
8 120086 BAILET Margot FRA 1990-07-25 Salomon
9 104084 BALLERIN Andrea ITA 1989-01-02 Fischer

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 = "C:/Users/Ziva/Documents/AlpineSkiing/csv-datoteke/BREM  Eva-Maria.csv"
brem = pd.read_csv(pot_brem, parse_dates=['datum'])

Tabela za Evo-Mario Brem:


In [5]:
brem[:15]


Out[5]:
datum kraj disciplina mesto zaostanek
0 2016-03-20 St. Moritz Giant Slalom 4 7.78
1 2016-07-03 Jasna Giant Slalom 1 0.00
2 2016-06-03 Jasna Slalom 26 46.21
3 2016-02-15 Crans Montana Slalom DNQ1 NaN
4 2016-01-30 Maribor Giant Slalom 4 2.68
5 2016-01-17 Flachau Giant Slalom 4 10.75
6 2016-01-15 Flachau Slalom 26 22.85
7 2016-12-01 Flachau Slalom 26 34.79
8 2016-05-01 Santa Caterina Valfurva Slalom 26 36.17
9 2015-12-29 Lienz Slalom 21 19.38
10 2015-12-28 Lienz Giant Slalom 4 2.80
11 2015-12-20 Courchevel Giant Slalom 1 0.00
12 2015-12-13 Are Slalom 17 24.38
13 2015-12-12 Are Giant Slalom 2 0.55
14 2015-11-29 Aspen, CO Slalom DNQ1 NaN

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 tabeli dodamo nov stolpec mesto1, kjer besedilne podatke identificiramo z 0. Tu nas ne zanima, zakaj tekmovalka ni osvojila točk.


In [6]:
def pretvori(bes):
    if bes in ['DNQ1', 'DNF1', 'DSQ2', 'DNS1','DNF2']:
        return 0
    else:
        return int(bes)

In [7]:
brem['mesto1'] = brem['mesto'].map(pretvori)
brem[:15]


Out[7]:
datum kraj disciplina mesto zaostanek mesto1
0 2016-03-20 St. Moritz Giant Slalom 4 7.78 4
1 2016-07-03 Jasna Giant Slalom 1 0.00 1
2 2016-06-03 Jasna Slalom 26 46.21 26
3 2016-02-15 Crans Montana Slalom DNQ1 NaN 0
4 2016-01-30 Maribor Giant Slalom 4 2.68 4
5 2016-01-17 Flachau Giant Slalom 4 10.75 4
6 2016-01-15 Flachau Slalom 26 22.85 26
7 2016-12-01 Flachau Slalom 26 34.79 26
8 2016-05-01 Santa Caterina Valfurva Slalom 26 36.17 26
9 2015-12-29 Lienz Slalom 21 19.38 21
10 2015-12-28 Lienz Giant Slalom 4 2.80 4
11 2015-12-20 Courchevel Giant Slalom 1 0.00 1
12 2015-12-13 Are Slalom 17 24.38 17
13 2015-12-12 Are Giant Slalom 2 0.55 2
14 2015-11-29 Aspen, CO Slalom DNQ1 NaN 0

V 2. in 13. vrstici je vidna razlika med stolpcema 'mesto' in 'mesto1'.

Č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 tekmovalka dobi za osvojeno i-to mesto.


In [44]:
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)];

Opomba: mesto1 in tocke bi bilo bolj smiselno dodati v prvotni csv!!!!


In [42]:
brem['tocke'] = brem['mesto'].map(pretvori_2)
brem[:15]


Out[42]:
datum kraj disciplina mesto zaostanek mesto1 tocke
0 2016-03-20 St. Moritz Giant Slalom 4 7.78 4 50
1 2016-07-03 Jasna Giant Slalom 1 0.00 1 100
2 2016-06-03 Jasna Slalom 26 46.21 26 5
3 2016-02-15 Crans Montana Slalom DNQ1 NaN 0 0
4 2016-01-30 Maribor Giant Slalom 4 2.68 4 50
5 2016-01-17 Flachau Giant Slalom 4 10.75 4 50
6 2016-01-15 Flachau Slalom 26 22.85 26 5
7 2016-12-01 Flachau Slalom 26 34.79 26 5
8 2016-05-01 Santa Caterina Valfurva Slalom 26 36.17 26 5
9 2015-12-29 Lienz Slalom 21 19.38 21 10
10 2015-12-28 Lienz Giant Slalom 4 2.80 4 50
11 2015-12-20 Courchevel Giant Slalom 1 0.00 1 100
12 2015-12-13 Are Slalom 17 24.38 17 14
13 2015-12-12 Are Giant Slalom 2 0.55 2 80
14 2015-11-29 Aspen, CO Slalom DNQ1 NaN 0 0

Pa si poglejmo, v katerih disciplinah najpogosteje tekmuje Eva-Maria Brem:


In [8]:
brem['disciplina'].value_counts()


Out[8]:
Giant Slalom      67
Slalom            49
Super Combined     8
Super G            2
Downhill           1
Name: disciplina, dtype: int64

Eva-Maria Brem je torej najpogosteje tekmuje v slalomu in veleslalomu. Ponazorimo to še z grafom:


In [9]:
brem['disciplina'].value_counts().plot(kind='pie', figsize=(6,6))


Out[9]:
<matplotlib.axes._subplots.AxesSubplot at 0x632bdd0>

Č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 [10]:
slalom = brem['disciplina'] == 'Slalom'
brem[slalom][:15]


Out[10]:
datum kraj disciplina mesto zaostanek mesto1
2 2016-06-03 Jasna Slalom 26 46.21 26
3 2016-02-15 Crans Montana Slalom DNQ1 NaN 0
6 2016-01-15 Flachau Slalom 26 22.85 26
7 2016-12-01 Flachau Slalom 26 34.79 26
8 2016-05-01 Santa Caterina Valfurva Slalom 26 36.17 26
9 2015-12-29 Lienz Slalom 21 19.38 21
12 2015-12-13 Are Slalom 17 24.38 17
14 2015-11-29 Aspen, CO Slalom DNQ1 NaN 0
15 2015-11-28 Aspen, CO Slalom 20 45.09 20
19 2015-03-14 Are Slalom 27 34.29 27
21 2015-02-22 Maribor Slalom 25 21.43 25
23 2015-01-13 Flachau Slalom DNQ1 NaN 0
24 2015-04-01 Zagreb Slalom DNF1 NaN 0
25 2014-12-29 Kuehtai in Tirol Slalom DNQ1 NaN 0
27 2014-12-13 Are Slalom DNQ1 NaN 0

In [11]:
veleslalom = brem['disciplina'] == 'Giant Slalom'
brem[veleslalom][:15]


Out[11]:
datum kraj disciplina mesto zaostanek mesto1
0 2016-03-20 St. Moritz Giant Slalom 4 7.78 4
1 2016-07-03 Jasna Giant Slalom 1 0.00 1
4 2016-01-30 Maribor Giant Slalom 4 2.68 4
5 2016-01-17 Flachau Giant Slalom 4 10.75 4
10 2015-12-28 Lienz Giant Slalom 4 2.80 4
11 2015-12-20 Courchevel Giant Slalom 1 0.00 1
13 2015-12-12 Are Giant Slalom 2 0.55 2
16 2015-11-27 Aspen, CO Giant Slalom 2 0.80 2
17 2015-10-24 Soelden Giant Slalom 8 19.56 8
18 2015-03-22 Meribel Giant Slalom 2 2.53 2
20 2015-03-13 Are Giant Slalom 3 7.27 3
22 2015-02-21 Maribor Giant Slalom 10 13.43 10
26 2014-12-28 Kuehtai in Tirol Giant Slalom 4 2.63 4
28 2014-12-12 Are Giant Slalom 3 1.91 3
30 2014-11-29 Aspen Giant Slalom 1 0.00 1

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 [12]:
brem[slalom]['mesto1'].value_counts().plot(kind='bar')


Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x6370df0>

In [13]:
urejen = brem[veleslalom].sort_values(['mesto1'], ascending=True)
#urejen['mesto1'].value_counts()
#urejen['mesto1'].value_counts().plot(kind='bar')
#ne more uredit, ker DNQ1, DNF1, DSQ2 in DNS1 niso legit uvrstitve.

In [14]:
brem[veleslalom]['mesto1'].value_counts().plot(kind='bar')


Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x6379af0>

Analiza narodnosti

Zanima nas, koliko je smučarjev določene narodnosti. Najprej jih preštejmo, nato pa ponazorimo to z grafom:


In [24]:
smucarji['drzava'].value_counts()


Out[24]:
AUT    61
SUI    45
ITA    42
FRA    39
USA    31
GER    26
SWE    20
NOR    18
CAN    18
SLO    15
CZE     8
RUS     5
SVK     4
FIN     4
CRO     3
JPN     2
GBR     2
HUN     2
ARG     2
AUS     1
AND     1
SRB     1
LAT     1
LIE     1
SPA     1
POL     1
MON     1
Name: drzava, dtype: int64

In [45]:
smucarji['drzava'].value_counts().plot(kind='pie', figsize = (6,6))


Out[45]:
<matplotlib.axes._subplots.AxesSubplot at 0x3cf7a10>

Popravi graf, da najmanjše lepo prikaže!!!

Analiza smuči

Najprej si oglejmo, katere znamke smuči so najpogostejše v svetovnem pokalu:


In [15]:
smucarji['smuci'].value_counts()


Out[15]:
Head          76
Rossignol     68
Fischer       48
Atomic        43
Voelkl        32
Salomon       25
Stoeckli      20
Nordica       14
Ni_podatka     9
Dynastar       9
Blizzard       6
Elan           4
Hart           1
Name: smuci, dtype: int64

In [16]:
smucarji['smuci'].value_counts().plot(kind='pie', figsize=(6,6))


Out[16]:
<matplotlib.axes._subplots.AxesSubplot at 0x646cad0>

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 [31]:
smucarji[smucarji['smuci'] == "Head"]['drzava'].value_counts().plot(kind='bar')


Out[31]:
<matplotlib.axes._subplots.AxesSubplot at 0x3dcc030>

Podobno si lahko pogledamo, katerim proizvajalcem smuči najbolj zaupajo smučarji iz avstrije:

To do: naredi tak graf, ki bo prikazal to za vse države!


In [34]:
smucarji[smucarji['drzava'] == "AUT"]['smuci'].value_counts().plot(kind='bar')


Out[34]:
<matplotlib.axes._subplots.AxesSubplot at 0x8d7bad0>

In [ ]: