In [1]:
# Python-3-Skript zum Auslesen und Auswerten von Daten zu internatonal tätigen Schweizer Fussballspielern. 
# Skript: Mathias Born
In [2]:
import requests
from bs4 import BeautifulSoup
from time import sleep, strftime
from random import randint
from os import path
import csv
import re
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
plt.rcParams['pdf.fonttype'] = 42
%matplotlib inline
from dateutil.relativedelta import relativedelta
import ast
import warnings
warnings.filterwarnings('ignore')
import mpld3
import folium
import locale
In [3]:
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
In [4]:
# Eine Liste mit den europäischen Ligen wird kreiert. Diese benötigen wir später fürs automatisierte
# Auslesen der Gastarbeiter in den einzelnen Ligen. 

ligen = list()
for i in range(1,4):
    temp_liga = requests.get('http://www.transfermarkt.de/wettbewerbe/europa/wettbewerbe?page=' + str(i) + '&plus=1', headers=headers)
    temp_liga = BeautifulSoup(temp_liga.text, 'html.parser')
    temp_liga = temp_liga.find('div', {'class':'responsive-table'})
    temp_liga = temp_liga.find_all('a')
    
    for liga in temp_liga: 
        if liga.has_attr('href'):
            liga = (liga['href'])
            if re.search(r'/startseite/wettbewerb/[A-Z]{1,3}1', liga):
                ligen.append(re.search(r'/startseite/wettbewerb/([A-Z]{1,3}1)', liga).group(1))
    sleep(5)
ligen.append('FARO')
ligen.remove('C1')
In [5]:
# Falls die Daten noch nicht vorliegen: Zuerst werden die Listen mit den Gastarbeitern 
# für jede Saison zwischen 1992 und 2016 ausgelesen. 
# Extrahiert wird der Spielername und die URL zu den Detailinfos.

if path.isfile('daten/linkdict.csv'):
    if path.isfile('daten/jahrbuch.csv'):
        linkdict = dict()
        jahrbuch = dict()
        
        # Öffne die vorhandenen Daten mit den Links. 
        with open('daten/linkdict.csv', 'r') as csv_file:
            reader = csv.reader(csv_file)
            for key, value in reader:
                linkdict[key] = value
        
        # Öffne das vorhandene Jahrbuch.
        with open('daten/jahrbuch.csv', 'r') as csv_file:
            reader = csv.reader(csv_file)
            for key, value in reader:
                jahrbuch[key] = ast.literal_eval(value)
else:
    linkdict = dict()
    jahrbuch = dict()
    for jahr in range(1992,2017):
        temp_ligen = dict()
        print(jahr)
        for liga in ligen:
            temp_schüttelerliste = list()
            temp_namensliste = list()
            url = 'http://www.transfermarkt.de/premier-league/gastarbeiterdetail/wettbewerb/' + liga + '?saison_id=' + str(jahr) + '&land_id=148'
            response = requests.get(url, headers=headers)
            transfermarkt_soup = BeautifulSoup(response.text, 'html.parser')
            temp_gastarbeiter = transfermarkt_soup.findAll('td',{'class':'hauptlink'})
            if len(temp_gastarbeiter) == 0:
                pass
            else:
                for schütteler in temp_gastarbeiter:
                    try:
                        schüttelername = schütteler.find('a').text
                        schüttelerurl = 'http://www.transfermarkt.de' + schütteler.find('a')['href']
                        linkdict[schüttelername] = schüttelerurl
                        temp_schüttelerliste.append(schüttelername)
                        temp_ligen[liga] = temp_schüttelerliste
                    except:
                        pass    
            jahrbuch[jahr] = temp_ligen
            sleep(randint(2,14))
        sleep(randint(33,99))

    # Die Daten werden lokal abgespeichert, so dass sie später nicht nochmal geladen werden müssen. 
    with open('daten/linkdict.csv', 'w') as csv_file:
        writer = csv.writer(csv_file)
        for key, value in linkdict.items():
            writer.writerow([key, value])
    with open('daten/jahrbuch.csv', 'w') as csv_file:
        writer = csv.writer(csv_file)
        for key, value in jahrbuch.items():
            writer.writerow([key, value])
In [6]:
# Nun werden die Informationen zu den einzelnen Gastarbeitern heruntergeladen und extrahiert. 
# Dieser Vorgang dauert sehr lange. Er wird nur ausgeführt, wenn noch keine entsprechenden Daten
# vorhanden sind. Liegen solche vor, werden die vorhandenen Daten geladen. 

kat_spielerdaten = ['Geburtsdatum', 'Geburtsort', 'Größe', 'Nationalität', 
                    'Position', 'Fuß', 'Spielerberater', 'Im Team seit', 
                    'Vertrag bis', 'Ausrüster', 'Schuhmodell']
kat_zusatz = ['Aktueller Verein', 'Aktueller Marktwert', 'Nationalmannschaft', 'Länderspiele', 'Jugendvereine', 'Link Leistungsdaten']
kat_socialmedia = ['Twitter', 'Facebook', 'Instagram', 'Offizielle Homepage']
    
# Prüfen, ob bereits Daten vorhanden sind.
if path.isfile("daten/spielerdetails.csv"):
    df = pd.read_csv('output/df.csv')
    df.index = df['Unnamed: 0']
    del df['Unnamed: 0']
    df.head()
    transfernummer = list()
    for i in range(len(df.columns) - len(kat_spielerdaten) - len(kat_socialmedia) - len(kat_zusatz)):
        transfernummer.append('Transfer_' + str(i + 1))
    
else: 
    spielerdetails = dict()

    for spieler in linkdict:
        if path.isfile('daten/' + spieler + '.html'):
            with open('daten/' + spieler + '.html', 'r') as f:
                response = f.read()
                soup_spieler = BeautifulSoup(response, 'html.parser')
        else:
            sleep(randint(4,120))
            # Herunterladen der Spieler-Daten von Transfermarkt. 
            url = linkdict[spieler]
            response = requests.get(url, headers=headers)
            soup_spieler = BeautifulSoup(response.text, 'html.parser')
            # Die Webseite wird für spätere Arbeiten abgespeichert. 
            with open('daten/' + spieler + '.html', 'w') as f:
                f.write(str(soup_spieler))

        # Auslesen der Basisinformationen aus der ersten Tabelle. 
        spielerdaten = soup_spieler.find('table',{'class':'auflistung'})
        temp_zeile = list()

        for angabe in kat_spielerdaten:    
            try:
                temp_daten = spielerdaten.find('th', text= angabe + ':').nextSibling.nextSibling.text.replace('\t', '').replace('\xa0', ' ').strip().replace('  ', '/ ')
                temp_zeile.append(temp_daten)
            except:
                temp_zeile.append('')
        # Hack für den Spezialfall des aktuellen Vereins.
        for angabe in kat_zusatz:
            try:
                if angabe == 'Aktueller Verein':
                    temp_daten = soup_spieler.find('span', {'itemprop':"affiliation"}).text
                elif angabe == 'Aktueller Marktwert':
                    temp_daten = soup_spieler.find('div', {'class':"dataMarktwert"}).text.strip()
                    temp_daten = re.match(r'\d*,\d*.*€', test).group(0)
                elif angabe == 'Länderspiele':
                    länderspiele = soup_spieler.find('span', {'class':'dataItem'}, text='Länderspiele/Tore:').next.next.next.text
                    temp = re.match(r'(\d*)/(\d*)', länderspiele)
                    länderspiele = temp.group(1)
                    länderspiele_tore = temp.group(2)
                    temp_daten = [länderspiele, länderspiele_tore]
                elif angabe == 'Nationalmannschaft':
                    temp_daten = soup_spieler.find('p', {'class':'notTablet forMobile'}).next.next.next.next.next.find('a').text
                elif angabe == 'Jugendvereine':
                    temp_daten = soup_spieler.find('span', {'class':'headerueberschrift'}, text='Jugendvereine').next.next.next.next.text.strip()
                elif angabe == 'Link Leistungsdaten':
                    temp_daten = soup_spieler.find('a', text='Zu den kompletten Leistungsdaten')['href']
                    temp_daten = 'http://www.transfermarkt.de' + temp_daten
                temp_zeile.append(temp_daten)
            except:
                temp_zeile.append('')
        for angabe in kat_socialmedia:
            try:
                temp_socialmedia = spielerdaten.find('th', text='Social Media:').nextSibling.nextSibling.find('a', title=angabe)['href']
                temp_zeile.append(temp_socialmedia)
            except:
                temp_zeile.append('')

        # Auslesen der Informationen zu den Transfers (2. Tabelle)
        try:
            soup_transfers = soup_spieler.find('div', {'class': 'box transferhistorie'}).find('table').find('tbody')
            soup_transfers = soup_transfers.find_all('tr', {'class': 'zeile-transfer'})
        except:
            soup_transfers = []
        for t in reversed(range(len(soup_transfers))):
            try:
                temp_tds = soup_transfers[t].find_all('td')
            except:
                temp_tds = []
            try:
                temp_saison = temp_tds[0].text
            except:
                temp_saison = ''
            try:
                temp_datum = temp_tds[1].text
            except:
                temp_datum = ''
            try:
                temp_abgebend = temp_tds[5].find('a').text
            except:
                temp_abgebend = ''
            try:
                temp_land1 = temp_tds[3].find('img')['alt']
            except:
                temp_land1 = ''
            try:
                temp_aufnehmend = temp_tds[9].find('a').text
            except:
                temp_aufnehmend = ''
            try:
                temp_land2 = temp_tds[7].find('img')['alt']
            except:
                temp_land2 = ''
            try:
                temp_marktwert = temp_tds[10].text
            except:
                temp_marktwert = ''
            try:
                temp_ablöse = temp_tds[11].text
            except:
                temp_ablöse = ''
            #Zusammensetzen der gesammelten Informationen.
            temp_transfers = [temp_saison, temp_datum, temp_abgebend, temp_land1, temp_aufnehmend, temp_land2, temp_marktwert, temp_ablöse]
            temp_zeile.append(temp_transfers)
            spielerdetails[spieler] = temp_zeile

    with open('daten/spielerdetails.csv', 'w') as csv_file:
        writer = csv.writer(csv_file)
        for key, value in spielerdetails.items():
            writer.writerow([key, value])
    
    # Einlesen der Daten in Pandas. 
    df = pd.DataFrame.from_dict(spielerdetails, orient='index')
    
    # Anpassen der Namen der einzelnen Spalten. 
    transfernummer = list()
    for i in range(len(df.columns) - len(kat_spielerdaten) - len(kat_socialmedia) - len(kat_zusatz)):
        transfernummer.append('Transfer_' + str(i + 1))
    df.columns = kat_spielerdaten + kat_zusatz + kat_socialmedia + transfernummer
    
    # Konvertieren der Angaben im Dataframe 
    df['Größe'] = df['Größe'].str.replace(',','.')
    df['Größe'] = df['Größe'].str.replace('m','')
    
    pd.options.display.max_columns = 50
    df.to_csv('output/df.csv')
    df.to_excel('output/df.xlsx')
    df.to_json('output/df.json')
In [7]:
# Nun haben wir die folgenden Daten (Auszug mit den ersten paar Spielern). 
df.head(5)
Out[7]:
Geburtsdatum Geburtsort Größe Nationalität Position Fuß Spielerberater Im Team seit Vertrag bis Ausrüster ... Transfer_12 Transfer_13 Transfer_14 Transfer_15 Transfer_16 Transfer_17 Transfer_18 Transfer_19 Transfer_20 Transfer_21
Unnamed: 0
Ciriaco Sforza 02.03.1970 Wohlen 1.80 Schweiz Mittelfeld - Zentrales Mittelfeld rechts NaN 01.07.2006 - NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Diego Lattmann 22.02.1985 NaN 1.77 Schweiz Mittelfeld - Linkes Mittelfeld links NaN 01.01.2013 - NaN ... ['11/12', '01.07.2011', 'FC Gossau', 'Schweiz'... ['11/12', '01.01.2012', 'Rapperswil-Jona', 'Sc... ['12/13', '01.01.2013', 'Schwamendingen', 'Sch... NaN NaN NaN NaN NaN NaN NaN
Enes Azizi 09.02.1994 Lausanne 1.91 Schweiz/ Mazedonien Torwart rechts NaN 01.01.2017 30.06.2017 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Eren Derdiyok 12.06.1988 Basel 1.91 Schweiz/ Türkei Sturm - Mittelstürmer rechts SportsTotal 05.08.2016 30.06.2019 Nike ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Sébastien Wüthrich 29.05.1990 Neuchâtel 1.78 Schweiz Mittelfeld - Linkes Mittelfeld links Atalentis 01.07.2016 30.06.2018 Nike ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 42 columns

In [8]:
# Zur Kontrolle: Anzahl Links zu Spielerseiten sowie Anzahl extrahierter Spieler. Bei Bedarf
# können die fehlenden Spieler manuell importiert werden. 

print('Anzahl Links:', len(linkdict))
print('Anzahl extrahierter Profile:', len(df))
temp_linkdict = linkdict
for row in df.index:
    if row in temp_linkdict:
        temp_linkdict.pop(row, None)
print('Wegen Fehlern wurden nicht einbezogen:', ', '.join(temp_linkdict.keys()))
Anzahl Links: 208
Anzahl extrahierter Profile: 206
Wegen Fehlern wurden nicht einbezogen: Dario Cigolini, Joanis Vagias
In [9]:
# To do: Aleksandar Prijovic fehlt. 
df[df.index.str.contains("Aleksandar")]
Out[9]:
Geburtsdatum Geburtsort Größe Nationalität Position Fuß Spielerberater Im Team seit Vertrag bis Ausrüster ... Transfer_12 Transfer_13 Transfer_14 Transfer_15 Transfer_16 Transfer_17 Transfer_18 Transfer_19 Transfer_20 Transfer_21
Unnamed: 0

0 rows × 42 columns

Auswertungen

In [10]:
# Welches ist der grösste Spieler?
df[df['Größe'] == df['Größe'].max()]
Out[10]:
Geburtsdatum Geburtsort Größe Nationalität Position Fuß Spielerberater Im Team seit Vertrag bis Ausrüster ... Transfer_12 Transfer_13 Transfer_14 Transfer_15 Transfer_16 Transfer_17 Transfer_18 Transfer_19 Transfer_20 Transfer_21
Unnamed: 0
Fabio Coltorti 03.12.1980 Kriens 1.97 Schweiz Torwart rechts NaN 01.07.2012 30.06.2017 adidas ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Pascal Zuberbühler 08.01.1971 Frauenfeld 1.97 Schweiz Torwart rechts NaN 01.07.2011 - NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Raphael Spiegel 19.12.1992 Rüttenen 1.97 Schweiz Torwart rechts IFM 23.07.2012 30.06.2018 Nike ... ['14/15', '23.03.2015', 'Carlisle United', 'En... NaN NaN NaN NaN NaN NaN NaN NaN NaN
Léo Lacroix 27.02.1992 Lausanne 1.97 Schweiz/ Brasilien Abwehr - Innenverteidiger rechts Atalentis 31.08.2016 30.06.2020 Nike ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

4 rows × 42 columns

In [11]:
# Wie viele CH-Spieler gibts pro Saison in allen ausländischen Ligen? 

internationaleprojahr = dict()
for jahr in jahrbuch.keys():
    counter = 0
    #jahr = int(jahr)
    for liga in jahrbuch[jahr]:
        counter = counter + len(jahrbuch[jahr][liga])
    internationaleprojahr[jahr] = counter
df_internationaleprojahr = pd.DataFrame.from_dict(internationaleprojahr, orient='index')
df_internationaleprojahr.columns = ['Anzahl Schweizer Internationale']
df_internationaleprojahr.sort_index(ascending=True, inplace=True)
df_internationaleprojahr
Out[11]:
Anzahl Schweizer Internationale
1992 2
1993 7
1994 5
1995 8
1996 12
1997 13
1998 13
1999 11
2000 15
2001 17
2002 17
2003 24
2004 29
2005 39
2006 39
2007 38
2008 45
2009 40
2010 46
2011 39
2012 46
2013 53
2014 52
2015 56
2016 55
In [12]:
fig, ax = plt.subplots(figsize=(14,8))
df_internationaleprojahr.plot(kind='bar', ax=ax, color='darkred')
plt.title('Schweizer in ausländischen Erstmannschaften')
plt.xlabel('')
plt.ylabel('')
plt.tight_layout()
plt.show()
fig.savefig('output/internationaleprojahr.pdf')
fig.savefig('output/internationaleprojahr.png')
In [13]:
# Wie viele Schweizer gibts pro Jahr in den fünf Topligen? 

topligen = ['FR1', 'IT1', 'ES1', 'GB1', 'L1']
ch_in_top = dict()

for jahr in range(1992,2017):
    temp_liste = list()
    for topliga in topligen:
        try:
            temp_liste.append(len(jahrbuch[str(jahr)][topliga]))
        except:
            temp_liste.append(0)
    ch_in_top[jahr] = temp_liste
df_ch_in_top = pd.DataFrame.from_dict(ch_in_top, orient='index')
df_ch_in_top.columns = topligen
df_ch_in_top
Out[13]:
FR1 IT1 ES1 GB1 L1
1992 0 0 0 0 2
1993 0 1 0 0 4
1994 0 0 0 1 4
1995 1 0 0 2 5
1996 1 3 0 2 5
1997 3 1 0 3 6
1998 1 1 1 2 6
1999 2 2 0 2 3
2000 3 3 0 2 5
2001 4 0 0 3 6
2002 6 0 0 1 7
2003 6 1 0 1 9
2004 4 3 2 3 11
2005 9 3 1 4 12
2006 5 3 2 5 11
2007 5 5 3 5 10
2008 3 9 3 7 10
2009 3 6 2 6 12
2010 2 15 1 4 10
2011 3 9 0 3 11
2012 2 12 0 4 12
2013 2 10 2 3 18
2014 5 7 0 2 18
2015 4 8 0 7 23
2016 4 5 0 6 25
In [14]:
fig, ax = plt.subplots(figsize=(14,8))
df_ch_in_top.sort_index(ascending=False).plot(kind='barh', stacked=True, ax=ax)
plt.title('Schweizer in den fünf Topligen')
plt.xlabel('')
plt.ylabel('')
plt.tight_layout()
plt.show()
fig.savefig('output/internationaleprojahr_topligen_horizontal.pdf')
fig.savefig('output/internationaleprojahr_topligen_horizontal.png')
fig.savefig('output/internationaleprojahr_topligen_horizontal.svg')
In [15]:
# ... und das Ganze noch als klassisches Säulendiagramm. 
fig, ax = plt.subplots(figsize=(12,8))
df_ch_in_top.sort_index(ascending=True).plot(kind='bar', stacked=True, ax=ax)
plt.title('Schweizer in den fünf Topligen')
plt.xlabel('')
plt.ylabel('')
plt.tight_layout()
#plt.show()
fig.savefig('output/internationaleprojahr_topligen_vertikal.pdf')
fig.savefig('output/internationaleprojahr_topligen_vertikal.png')
fig.savefig('output/internationaleprojahr_topligen_vertikal.svg')
mpld3.save_html(fig, 'output/internationaleprojahr_topligen_vertikal.html')
In [16]:
# Prozentualer Anteil der in ausländischen Topligen tätigen Schweizer fürs Jahr 2016.
100 * df_ch_in_top.loc[2016] / df_ch_in_top.loc[2016].sum()
Out[16]:
FR1    10.0
IT1    12.5
ES1     0.0
GB1    15.0
L1     62.5
Name: 2016, dtype: float64
In [17]:
# Welche Spieler waren wann in einer der Topligen tätig? 
topligen = ['FR1', 'IT1', 'ES1', 'GB1', 'L1']

df_jahrbuch = pd.DataFrame.from_dict(jahrbuch)
pd.set_option('display.max_colwidth', -1)
df_jahrbuch.ix[topligen].transpose()
Out[17]:
FR1 IT1 ES1 GB1 L1
1992 NaN NaN NaN NaN [Stéphane Chapuisat, Adrian Knup]
1993 NaN [Andrea Fattizzo] NaN NaN [Stéphane Chapuisat, Alain Sutter, Ciriaco Sforza, Adrian Knup]
1994 NaN NaN NaN [Marc Hottiger] [Ciriaco Sforza, Alain Sutter, Stéphane Chapuisat, Adrian Knup]
1995 [Marco Grassi] NaN NaN [Marc Hottiger, Giuseppe Mazzarelli] [Stéphane Henchoz, Ciriaco Sforza, Alain Sutter, Adrian Knup, Stéphane Chapuisat]
1996 [Marco Grassi] [Ciriaco Sforza, Marco Pascolo, Ramon Vega] NaN [Marc Hottiger, Ramon Vega] [Marco Walker, Stéphane Chapuisat, Alain Sutter, Stéphane Henchoz, Sébastien Fournier]
1997 [Marco Grassi, Gaetano Giallanza, Jean-Pierre La Placa] [Dario Cigolini] NaN [Stéphane Henchoz, Ramon Vega, Gaetano Giallanza] [Ciriaco Sforza, Raphael Wicky, Stéphane Chapuisat, Murat Yakin, Marco Walker, Adrian Kunz]
1998 [Marco Grassi] [Patrick Bettoni] [Antonio Esposito] [Stéphane Henchoz, Ramon Vega] [Ciriaco Sforza, Raphael Wicky, Stéphane Chapuisat, Andreas Hilfiker, Adrian Kunz, Pascal Thüler]
1999 [Alexandre Comisetti, Nestor Subiat] [David Sesa, Feliciano Magro] NaN [Stéphane Henchoz, Ramon Vega] [Ciriaco Sforza, Oumar Kondé, Raphael Wicky]
2000 [Patrick Müller, Fabio Celestini, Alexandre Comisetti] [Giuseppe Mazzarelli, David Sesa, Kubilay Türkyilmaz] NaN [Stéphane Henchoz, Ramon Vega] [Ciriaco Sforza, Raphael Wicky, Oumar Kondé, Pascal Zuberbühler, Murat Yakin]
2001 [Patrick Müller, Fabio Celestini, Badile Lubamba, Claudio Gentile] NaN NaN [Stéphane Henchoz, Bernt Haas, Patrick Foletti] [Jörg Stiel, Oumar Kondé, Ciriaco Sforza, Raphael Wicky, Marc Zellweger, Ludovic Magnin]
2002 [Patrick Müller, Fabio Celestini, Johann Lonfat, Alexander Frei, Stéphane Grichting, Badile Lubamba] NaN NaN [Stéphane Henchoz] [Jörg Stiel, Rémo Meyer, Raphael Wicky, Ciriaco Sforza, Ludovic Magnin, Blaise Nkufo, Diego Benaglio]
2003 [Patrick Müller, Johann Lonfat, Alexander Frei, Fabio Celestini, Ricardo Cabanas, Stéphane Grichting] [Davide Chiumiento] NaN [Stéphane Henchoz] [Bruno Berner, Raphael Wicky, Jörg Stiel, Oumar Kondé, Rémo Meyer, Marco Streller, Hakan Yakin, Ludovic Magnin, Diego Benaglio]
2004 [Alexander Frei, Johann Lonfat, Stéphane Grichting, Bernt Haas] [Fabrizio Zambrella, Davide Chiumiento, Johan Vonlanthen] [Fabio Celestini, Patrick Müller] [Reto Ziegler, Philippe Senderos, Bernt Haas] [Mario Cantaluppi, Raphael Wicky, Ludovic Magnin, Ciriaco Sforza, Bruno Berner, Marco Streller, Tranquillo Barnetta, Oumar Kondé, Hakan Yakin, Diego Benaglio, Marco Walker]
2005 [Stephan Lichtsteiner, Stéphane Grichting, Alexander Frei, Daniel Gygax, Davide Chiumiento, Arnaud Bühler, Patrick Müller, Alain Rochat, Johann Lonfat] [Valon Behrami, Johann Vogel, Bruno Fontes Da Mota] [Fabio Celestini] [Stéphane Henchoz, Philippe Senderos, Reto Ziegler, Johan Djourou] [Mario Cantaluppi, Philipp Degen, Tranquillo Barnetta, Benjamin Huggel, Ludovic Magnin, Christoph Spycher, Marco Streller, Raphael Wicky, Ricardo Cabanas, Reto Ziegler, Ciriaco Sforza, Christian Schwegler]
2006 [Stephan Lichtsteiner, Stéphane Grichting, Patrick Müller, Daniel Gygax, Julian Esteban] [Valon Behrami, Reto Ziegler, Bruno Fontes Da Mota] [Fabio Celestini, Johann Vogel] [Johan Djourou, Philippe Senderos, Stéphane Henchoz, Bruno Berner, Reto Ziegler] [Alexander Frei, Christoph Spycher, Tranquillo Barnetta, Philipp Degen, Marco Streller, Benjamin Huggel, Ludovic Magnin, Pirmin Schwegler, David Degen, Raphael Wicky, David Pallas]
2007 [Stephan Lichtsteiner, Stéphane Grichting, Daniel Gygax, Julian Esteban, Patrick Müller] [Gökhan Inler, Valon Behrami, Reto Ziegler, Rijat Shala, Daniel Unal] [Fabio Celestini, Xavier Margairaz, Fabio Coltorti] [Gelson Fernandes, Philippe Senderos, Johan Djourou, Johann Vogel, Bruno Berner] [Mario Eggimann, Tranquillo Barnetta, Christoph Spycher, Ludovic Magnin, Steve von Bergen, Fabian Lustenberger, Diego Benaglio, Alexander Frei, Pirmin Schwegler, Philipp Degen]
2008 [Stéphane Grichting, Patrick Müller, Julian Esteban] [Gökhan Inler, Stephan Lichtsteiner, Marco Padalino, Blerim Dzemaili, Reto Ziegler, Philippe Senderos, Alain Nef, Simone Grippo, Michel Morganella] [Fabio Celestini, Alain Nef, Fabio Coltorti] [Valon Behrami, Gelson Fernandes, Johan Djourou, Johann Vogel, Pascal Zuberbühler, Philipp Degen, Blerim Dzemaili] [Diego Benaglio, Tranquillo Barnetta, Alexander Frei, Mario Eggimann, Ludovic Magnin, Christoph Spycher, Steve von Bergen, Pirmin Schwegler, Fabian Lustenberger, Marwin Hitz]
2009 [Stéphane Grichting, Gelson Fernandes, Almen Abdi] [Reto Ziegler, Gökhan Inler, Stephan Lichtsteiner, Marco Padalino, Blerim Dzemaili, Michel Morganella] [Fabio Celestini, Fabio Coltorti] [Valon Behrami, Philipp Degen, Fabio Daprelà, Philippe Senderos, Johan Djourou, Pascal Zuberbühler] [Eren Derdiyok, Tranquillo Barnetta, Christoph Spycher, Steve von Bergen, Pirmin Schwegler, Fabian Lustenberger, Diego Benaglio, Mario Eggimann, Daniel Gygax, Ludovic Magnin, Marwin Hitz, Mario Gavranovic]
2010 [Stéphane Grichting, Gelson Fernandes] [Gökhan Inler, Stephan Lichtsteiner, Steve von Bergen, Reto Ziegler, Blerim Dzemaili, Gelson Fernandes, Gaetano Berardi, Almen Abdi, Valon Behrami, Pajtim Kasami, Fabio Daprelà, Marco Padalino, Haris Seferovic, Jonathan Rossini, Bruno Martignoni] [Fabio Coltorti] [Johan Djourou, Valon Behrami, Philippe Senderos, Pascal Zuberbühler] [Pirmin Schwegler, Eren Derdiyok, Diego Benaglio, Tranquillo Barnetta, Mario Eggimann, Mario Gavranovic, Marwin Hitz, Philipp Degen, Daniel Sereinig, Nassim Ben Khalifa]
2011 [Stéphane Grichting, Innocent Emeghara, Jérémy Frick] [Gökhan Inler, Stephan Lichtsteiner, Valon Behrami, Michel Morganella, Blerim Dzemaili, Steve von Bergen, Almen Abdi, Gelson Fernandes, Haris Seferovic] NaN [Philippe Senderos, Johan Djourou, Pajtim Kasami] [Diego Benaglio, Eren Derdiyok, Ricardo Rodríguez, Mario Eggimann, Timm Klose, François Affolter, Fabian Lustenberger, Tranquillo Barnetta, Beg Ferati, Mario Gavranovic, Marwin Hitz]
2012 [Innocent Emeghara, Jérémy Frick] [Steve von Bergen, Blerim Dzemaili, Valon Behrami, Gökhan Inler, Michel Morganella, Stephan Lichtsteiner, Jonathan Rossini, Gaetano Berardi, Innocent Emeghara, Haris Seferovic, Cephas Malele, Andelko Savic] NaN [Philippe Senderos, Pajtim Kasami, Johan Djourou, Raphael Spiegel] [Diego Benaglio, Timm Klose, Pirmin Schwegler, Xherdan Shaqiri, Ricardo Rodríguez, Mario Eggimann, Granit Xhaka, Tranquillo Barnetta, Eren Derdiyok, Johan Djourou, Adrian Nikci, Marwin Hitz]
2013 [François Moubandje, Jérémy Frick] [Gökhan Inler, Innocent Emeghara, Stephan Lichtsteiner, Blerim Dzemaili, Valon Behrami, Reto Ziegler, Silvan Widmer, Jonathan Rossini, Gaetano Berardi, Saulo Decarli] [Haris Seferovic, Philippe Senderos] [Pajtim Kasami, Philippe Senderos, Eldin Jakupovic] [Ricardo Rodríguez, Josip Drmic, Admir Mehmedi, Gelson Fernandes, Diego Benaglio, Granit Xhaka, Orhan Ademi, Tranquillo Barnetta, Johan Djourou, Fabian Lustenberger, Marwin Hitz, Eren Derdiyok, Pirmin Schwegler, Xherdan Shaqiri, Martin Angha, Timm Klose, Salim Khelifi, Adrian Nikci]
2014 [Gelson Fernandes, François Moubandje, Michael Frey, Sébastien Wüthrich, Dylan Gissi] [Silvan Widmer, Stephan Lichtsteiner, Fabio Daprelà, Michel Morganella, Gökhan Inler, Ivan Martic, Xherdan Shaqiri] NaN [Philippe Senderos, Eldin Jakupovic] [Yann Sommer, Roman Bürki, Johan Djourou, Haris Seferovic, Diego Benaglio, Granit Xhaka, Pirmin Schwegler, Admir Mehmedi, Fabian Lustenberger, Valentin Stocker, Ricardo Rodríguez, Marwin Hitz, Josip Drmic, Valon Behrami, Tranquillo Barnetta, Steven Zuber, Timm Klose, Xherdan Shaqiri]
2015 [Gelson Fernandes, François Moubandje, Goran Karanovic, Sébastien Wüthrich] [Silvan Widmer, Blerim Dzemaili, Stephan Lichtsteiner, Michel Morganella, Matteo Fedele, Fabio Daprelà, Remo Freuler, Samuel Delli Carri] NaN [Almen Abdi, Xherdan Shaqiri, Valon Behrami, Timm Klose, Gökhan Inler, Kevin Mbabu, Raphael Spiegel] [Roman Bürki, Marwin Hitz, Yann Sommer, Fabian Lustenberger, Haris Seferovic, Admir Mehmedi, Granit Xhaka, Johan Djourou, Fabian Schär, Ricardo Rodríguez, Valentin Stocker, Diego Benaglio, Pirmin Schwegler, Nico Elvedi, Josip Drmic, Fabian Frei, Steven Zuber, Ulisses Garcia, Timm Klose, Andreas Hirzel, Albian Ajeti, Francisco Rodríguez, Djibril Sow]
2016 [Léo Lacroix, Gelson Fernandes, François Moubandje, Vincent Rüfli] [Silvan Widmer, Remo Freuler, Stephan Lichtsteiner, Blerim Dzemaili, Michel Morganella] NaN [Granit Xhaka, Xherdan Shaqiri, Edimilson Fernandes, Valon Behrami, Eldin Jakupovic, Raphael Spiegel] [Breel Embolo, Ricardo Rodríguez, Yann Sommer, Roman Bürki, Nico Elvedi, Marwin Hitz, Josip Drmic, Admir Mehmedi, Fabian Schär, Valentin Stocker, Fabian Lustenberger, Haris Seferovic, Shani Tarashaj, Fabian Frei, Steven Zuber, Florent Hadergjonaj, Diego Benaglio, Johan Djourou, Pirmin Schwegler, Vincent Sierro, Djibril Sow, Ulisses Garcia, Fabio Coltorti, Vasilije Janjicic, Andreas Hirzel]
In [18]:
# Körpergrösse: Wie gross sind die Schweizer Internationalen (alle ausländischen Ligen)? 
df['Größe'] = df['Größe'].replace('', np.NaN).astype('float')
df['Größe'].describe()
Out[18]:
count    203.000000
mean     1.831034  
std      0.058618  
min      1.690000  
25%      1.795000  
50%      1.830000  
75%      1.875000  
max      1.970000  
Name: Größe, dtype: float64
In [19]:
# ... und als grafische Darstellung (Histogramm).
temp_min = df['Größe'].min()
temp_max = df['Größe'].max()

fig, ax = plt.subplots(figsize=(12,4))
df['Größe'].value_counts().sort_index().plot(kind='bar', color='darkred', ax=ax)
#plt.xticks(range(int(temp_min),int(temp_max)),range(int(temp_min),int(temp_max)))
plt.title('Wie gross sind die Schweizer Internationalen?')
plt.xlabel('Grösse in Metern')
plt.ylabel('Anzahl Spieler')
plt.tight_layout()
plt.show()
fig.savefig('output/grösse.pdf')
fig.savefig('output/grösse.png')
fig.savefig('output/grösse.svg')
mpld3.save_html(fig, 'output/grösse.html')
In [20]:
df[['Größe']].to_excel('output/grösse.xlsx')
In [21]:
# Wer sind die Kleinsten?
df[df['Größe'] < 1.74][['Größe', 'Position']].sort_values(by='Größe')
Out[21]:
Größe Position
Unnamed: 0
David Pallas 1.69 Abwehr - Innenverteidiger
Xherdan Shaqiri 1.70 Sturm - Rechtsaußen
Innocent Emeghara 1.70 Sturm - Mittelstürmer
Vincenzo Zinnà 1.70 Mittelfeld - Offensives Mittelfeld
Daniel Unal 1.72 Mittelfeld - Zentrales Mittelfeld
Gabriel Lüchinger 1.72 Mittelfeld - Offensives Mittelfeld
Carlo Polli 1.72 Mittelfeld - Rechtes Mittelfeld
Salim Khelifi 1.72 Sturm - Rechtsaußen
Vural Önen 1.73 Mittelfeld
Jean-Pierre La Placa 1.73 Sturm
Davide Chiumiento 1.73 Mittelfeld - Offensives Mittelfeld
Mauro Lustrinelli 1.73 Sturm - Mittelstürmer
Ricardo Cabanas 1.73 Mittelfeld - Zentrales Mittelfeld
In [22]:
# Wer sind die Grössten?
df[df['Größe'] > 1.90][['Größe', 'Position']].sort_values(by='Größe', ascending=False)
Out[22]:
Größe Position
Unnamed: 0
Léo Lacroix 1.97 Abwehr - Innenverteidiger
Raphael Spiegel 1.97 Torwart
Fabio Coltorti 1.97 Torwart
Pascal Zuberbühler 1.97 Torwart
Marco Streller 1.96 Sturm - Mittelstürmer
Timm Klose 1.95 Abwehr - Innenverteidiger
Diego Benaglio 1.94 Torwart
Marwin Hitz 1.93 Torwart
Dylan Gissi 1.93 Abwehr - Innenverteidiger
Mihael Kovacevic 1.93 Abwehr - Rechter Verteidiger
Patrick Bettoni 1.92 Torwart
Jérémy Frick 1.92 Torwart
Danijel Subotic 1.91 Sturm - Mittelstürmer
Johan Djourou 1.91 Abwehr - Innenverteidiger
Enes Azizi 1.91 Torwart
Ramon Vega 1.91 Abwehr - Innenverteidiger
Eren Derdiyok 1.91 Sturm - Mittelstürmer
Orhan Mustafi 1.91 Sturm - Mittelstürmer
Eldin Jakupovic 1.91 Torwart
In [23]:
# Auf welcher Position sollte man spielen, wenn man es in eine internationale Mannschaft schaffen will (alle Ligen)?
df['Position'].value_counts()
Out[23]:
Abwehr - Innenverteidiger             44
Sturm - Mittelstürmer                 31
Torwart                               20
Abwehr - Rechter Verteidiger          20
Mittelfeld - Offensives Mittelfeld    18
Mittelfeld - Zentrales Mittelfeld     16
Mittelfeld - Defensives Mittelfeld    14
Abwehr - Linker Verteidiger           10
Mittelfeld - Rechtes Mittelfeld       6 
Mittelfeld - Linkes Mittelfeld        6 
Sturm - Hängende Spitze               5 
Mittelfeld                            5 
Sturm                                 5 
Sturm - Linksaußen                    3 
Sturm - Rechtsaußen                   3 
Name: Position, dtype: int64
In [24]:
df[df['Position'] == 'Mittelfeld']['Geburtsort']
Out[24]:
Unnamed: 0
Vural Önen          Zürich   
Andrea Fattizzo     Zofingen 
Pascal Thüler       NaN      
Antonio Esposito    Viganello
Patrick Isabella    NaN      
Name: Geburtsort, dtype: object
In [25]:
# ... und als Plot. 

fig, ax = plt.subplots(figsize=(10,6))
df['Position'].value_counts().sort_values().plot(kind='barh', color='darkred', ax=ax)
plt.title('Auf welcher Position spielen die Schweizer Internationalen?')
plt.xlabel('Anzahl Spieler')
plt.ylabel('')
plt.tight_layout()
plt.show()
fig.savefig('output/position.pdf')
fig.savefig('output/position.png')
fig.savefig('output/position.svg')
mpld3.save_html(fig, 'output/position.html')
In [26]:
# Mit welchem Fuss sollte man spielen, wenn man es in ein internationales Team schaffen will (alle Ligen)? 
df['Fuß'].value_counts()
Out[26]:
rechts       137
links        39 
beidfüßig    13 
Name: Fuß, dtype: int64
In [27]:
# Welche Spielerberater betreuen besoners viele Schweizer Internationale? 
df['Spielerberater'].value_counts().head(10)
Out[27]:
Ohne Berater                 21
IFM                          9 
Soccer Mondial               8 
Familienangehöriger          6 
Gold-Kick & Sport Service    6 
ESHA                         5 
SportsTotal                  4 
Ellipse Agency               3 
ISMA                         3 
Giallanza Sport              3 
Name: Spielerberater, dtype: int64
In [28]:
# In welchem Ort wurden die meisten der Schweizer Internationalen geboren? 
df['Geburtsort'].value_counts().head(30)
Out[28]:
Zürich          18
Basel           11
Genf            10
Lausanne        9 
Bellinzona      7 
Sion            5 
St. Gallen      5 
Winterthur      4 
Frauenfeld      3 
Kinshasa        3 
Neuchâtel       3 
Liestal         3 
Aarau           3 
Viganello       2 
Locarno         2 
Kriens          2 
Olten           2 
Prizren         2 
Ettiswil        2 
Sorengo         2 
Gostivar        2 
Luzern          2 
Morges          2 
Münsingen       2 
Wohlen          2 
Buenos Aires    2 
Wolhusen        2 
Lugano          2 
Wil             2 
Loznica         2 
Name: Geburtsort, dtype: int64
In [29]:
# Welche Schweizer Internationalen wurden in Bern geboren?
df[df['Geburtsort'] == 'Bern']
Out[29]:
Geburtsdatum Geburtsort Größe Nationalität Position Fuß Spielerberater Im Team seit Vertrag bis Ausrüster ... Transfer_12 Transfer_13 Transfer_14 Transfer_15 Transfer_16 Transfer_17 Transfer_18 Transfer_19 Transfer_20 Transfer_21
Unnamed: 0
Alain Sutter 22.01.1968 Bern 1.78 Schweiz Mittelfeld - Offensives Mittelfeld rechts NaN 01.07.1998 - NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

1 rows × 42 columns

In [30]:
# Welche Schweizer Internationalen wurden im Kanton Bern geboren? (Die Personen werden anhand einer Liste mit sämtlichen
# Gemeindenamen gesucht. Aufgrund verschieder Schreibweisen ist diese Lösung aber nicht perfekt.)
kantonbern = ['Aarberg', 'Aarwangen', 'Adelboden', 'Aefligen', 'Aegerten', 'Aeschi bei Spiez', 'Aeschlen', 'Affoltern im Emmental', 'Albligen', 'Alchenstorf', 'Allmendingen', 'Amsoldingen', 'Arch', 'Arni (BE)', 'Attiswil', 'Auswil', 'Ballmoos', 'Bangerten', 'Bannwil', 'Bargen (BE)', 'Bäriswil', 'Bätterkinden', 'Beatenberg', 'Bellmund', 'Belp', 'Belpberg', 'Belprahon', 'Berken', 'Bern', 'Bettenhausen', 'Bévilard', 'Biel/Bienne', 'Biglen', 'Bleienbach', 'Bleiken bei Oberdiessbach', 'Blumenstein', 'Bolligen', 'Bollodingen', 'Boltigen', 'Bönigen', 'Bowil', 'Bremgarten bei Bern', 'Brenzikofen', 'Brienz (BE)', 'Brienzwiler', 'Brügg (BE)', 'Brüttelen', 'Buchholterberg', 'Büetigen', 'Bühl', 'Büren an der Aare', 'Büren zum Hof', 'Burgdorf', 'Burgistein', 'Busswil bei Büren', 'Busswil bei Melchnau', 'Champoz', 'Châtelat', 'Clavaleyres', 'Corcelles (BE)', 'Corgémont', 'Cormoret', 'Cortébert', 'Court', 'Courtelary', 'Crémines', 'Därligen', 'Därstetten', 'Deisswil bei', 'Münchenbuchsee', 'Diemerswil', 'Diemtigen mit Oey', 'Diessbach bei Büren', 'Diesse', 'Dotzigen', 'Dürrenroth', 'Eggiwil', 'Epsach', 'Eriswil', 'Eriz', 'Erlach', 'Erlenbach im Simmental', 'Ersigen', 'Eschert', 'Etzelkofen', 'Evilard', '  	Fahrni', 'Farnern', 'Ferenbalm', 'Finsterhennen', 'Forst', 'Fraubrunnen', 'Frauenkappelen', 'Freimettigen', 'Frutigen ', 'Gadmen', 'Gals', 'Gampelen', 'Gelterfingen', 'Gerzensee', 'Golaten', 'Gondiswil', 'Graben', 'Grafenried', 'Grandval', 'Grindelwald', 'Grossaffoltern', 'Grosshöchstetten', 'Gsteig', 'Gsteigwiler', 'Guggisberg', 'Gündlischwand', 'Gurbrü', 'Gurzelen', 'Gutenburg', 'Guttannen', 'Habkern', 'Hagneck', 'Hasle bei Burgdorf', 'Hasliberg', 'Häutligen', 'Heiligenschwendi', 'Heimberg', 'Heimenhausen', 'Heimiswil', 'Hellsau', 'Herbligen', 'Hermiswil', 'Hermrigen', 'Herzogenbuchsee', 'Hilterfingen', 'Hindelbank', 'Höchstetten', 'Höfen bei Thun', 'Hofstetten bei Brienz', 'Homberg', 'Horrenbach-Buchen', 'Huttwil', 'Iffwil', 'Inkwil', 'Innertkirchen', 'Ins', 'Interlaken', 'Ipsach', 'Iseltwald', 'Ittigen', 'Jaberg', 'Jegenstorf', 'Jens', 'Kallnach', 'Kandergrund', 'Kandersteg', 'Kappelen', 'Kaufdorf', 'Kehrsatz', 'Kernenried', 'Kienersrüti', 'Kiesen', 'Kirchberg (BE)', 'Kirchdorf (BE)', 'Kirchenthurnen', 'Kirchlindach', 'Kleindietwil', 'Köniz', 'Konolfingen', 'Koppigen', 'Krattigen', 'Krauchthal', 'Kriechenwil', '  	La Ferrière', 'La Heutte', 'La Neuveville', 'Lamboing', 'Landiswil', 'Längenbühl', 'Langenthal', 'Langnau im Emmental', 'Lauenen', 'Laupen', 'Lauperswil', 'Lauterbrunnen', 'Leimiswil', 'Leissigen', 'Lengnau (BE)', 'Lenk', 'Leuzigen', 'Ligerz', 'Limpach', 'Linden', 'Lohnstorf', 'Lotzwil', 'Loveresse', 'Lüscherz', 'Lütschental', 'Lützelflüh', 'Lyss', 'Lyssach', 'Madiswil', 'Malleray', 'Matten bei Interlaken', 'Mattstetten', 'Meienried', 'Meikirch', 'Meinisberg', 'Meiringen', 'Melchnau', 'Merzligen', 'Mirchel', 'Monible', 'Mont-Tramelan', 'Moosseedorf', 'Mörigen', 'Mötschwil', 'Moutier', 'Mühleberg', 'Mühledorf (BE)', 'Mühlethurnen', 'Mülchi', 'Münchenbuchsee', 'Münchenwiler', 'Münchringen', 'Münsingen', 'Müntschemier', 'Muri bei Bern', 'Neuenegg', 'Nidau', 'Niederbipp', 'Niederhünigen', 'Niedermuhlern', 'Niederönz', 'Niederösch', 'Niederried bei Interlaken', 'Niederried bei Kallnach', 'Niederstocken', 'Nods', 'Noflen', 'Oberbalm', 'Oberbipp', 'Oberburg', 'Oberdiessbach', 'Oberhofen am Thunersee', 'Oberhünigen', 'Oberlangenegg', 'Oberönz', 'Oberösch', 'Oberried am Brienzersee', 'Obersteckholz', 'Oberstocken', 'Oberthal', 'Oberwil bei Büren', 'Oberwil im Simmental', 'Ochlenberg', 'Oeschenbach', 'Oppligen', 'Orpund', 'Orvin', 'Ostermundigen 	Perrefitte', 'Péry', 'Pieterlen', 'Plagne', 'Pohlern', 'Pontenet', 'Port', 'Prêles', 'Radelfingen', 'Rapperswil (BE)', 'Rebévelier', 'Reconvilier', 'Reichenbach im Kandertal', 'Reisiswil', 'Renan (BE)', 'Reutigen', 'Riggisberg', 'Ringgenberg (BE)', 'Roches (BE)', 'Roggwil (BE)', 'Rohrbach', 'Rohrbachgraben', 'Romont (BE)', 'Röthenbach bei', 'Herzogenbuchsee', 'Röthenbach im Emmental', 'Rubigen', 'Rüderswil', 'Rüdtligen-Alchenflüh', 'Rüeggisberg', 'Rüegsau', 'Rumendingen', 'Rumisberg', 'Rümligen', 'Ruppoldsried', 'Rüschegg', 'Rüti bei Büren', 'Rüti bei Lyssach', 'Rüti bei Riggisberg', 'Rütschelen', 'Saanen', 'Safnern', 'Saicourt', 'Saint-Imier', 'Saules (BE)', 'Saxeten', 'Schalunen', 'Schangnau', 'Schattenhalb', 'Schelten', 'Scheunen', 'Scheuren', 'Schlosswil', 'Schüpfen', 'Schwadernau', 'Schwanden bei Brienz', 'Schwarzhäusern', 'Schwendibach', 'Seeberg', 'Seedorf (BE)', 'Seehof', 'Seftigen', 'Signau', 'Sigriswil', 'Siselen', 'Sonceboz-Sombeval', 'Sonvilier', 'Sornetan', 'Sorvilier', 'Souboz', 'Spiez', 'St. Stephan', 'Steffisburg', 'Stettlen', 'Studen', 'Sumiswald', 'Sutz-Lattrigen', '', '  	Tägertschi', 'Täuffelen', 'Tavannes', 'Teuffenthal (BE)', 'Thierachern', 'Thörigen', 'Thun', 'Thunstetten', 'Toffen', 'Trachselwald', 'Tramelan', 'Treiten', 'Trimstein', 'Trub', 'Trubschachen', 'Tschugg', 'Tüscherz-Alfermée', 'Twann', 'Uebeschi', 'Uetendorf', 'Unterlangenegg', 'Unterseen', 'Untersteckholz', 'Ursenbach', 'Urtenen-Schönbühl', 'Uttigen', 'Utzenstorf', 'Vauffelin', 'Vechigen', 'Villeret', 'Vinelz', 'Wachseldorn', 'Wahlern', 'Wald (BE)', 'Walkringen', 'Walliswil bei Niederbipp', 'Walliswil bei Wangen', 'Walperswil', 'Walterswil (BE)', 'Wangen an der Aare', 'Wangenried', 'Wanzwil', 'Wattenwil', 'Wengi', 'Wichtrach', 'Wiedlisbach', 'Wiggiswil', 'Wilderswil', 'Wiler bei Utzenstorf', 'Wileroltigen', 'Willadingen', 'Wimmis', 'Wohlen bei Bern', 'Wolfisberg', 'Worb', 'Worben', 'Wynau', 'Wynigen', 'Wyssachen', 'Zauggenried', 'Zäziwil', 'Zielebach', 'Zollikofen', 'Zuzwil (BE)', 'Zweisimmen', 'Zwieselberg']
for gemeinde in kantonbern: 
    for index, row in df.iterrows():
        if row['Geburtsort'] == gemeinde:
            print(index, '(' + gemeinde + ')')
Alain Sutter (Bern)
Rémo Meyer (Langenthal)
Michael Frey (Münsingen)
Roman Bürki (Münsingen)
In [31]:
# Leider gibt es unerschiedliche Schreibweisen für die Ortschaften. Deshalb versuchen wir es mit einer unscharfen
# Suche. Achtung: Darin kann es etliche falsche Positive haben!
from fuzzywuzzy import fuzz
kantonbern = ['Aarberg', 'Aarwangen', 'Adelboden', 'Aefligen', 'Aegerten', 'Aeschi bei Spiez', 'Aeschlen', 'Affoltern im Emmental', 'Albligen', 'Alchenstorf', 'Allmendingen', 'Amsoldingen', 'Arch', 'Arni (BE)', 'Attiswil', 'Auswil', 'Ballmoos', 'Bangerten', 'Bannwil', 'Bargen (BE)', 'Bäriswil', 'Bätterkinden', 'Beatenberg', 'Bellmund', 'Belp', 'Belpberg', 'Belprahon', 'Berken', 'Bern', 'Bettenhausen', 'Bévilard', 'Biel/Bienne', 'Biglen', 'Bleienbach', 'Bleiken bei Oberdiessbach', 'Blumenstein', 'Bolligen', 'Bollodingen', 'Boltigen', 'Bönigen', 'Bowil', 'Bremgarten bei Bern', 'Brenzikofen', 'Brienz (BE)', 'Brienzwiler', 'Brügg (BE)', 'Brüttelen', 'Buchholterberg', 'Büetigen', 'Bühl', 'Büren an der Aare', 'Büren zum Hof', 'Burgdorf', 'Burgistein', 'Busswil bei Büren', 'Busswil bei Melchnau', 'Champoz', 'Châtelat', 'Clavaleyres', 'Corcelles (BE)', 'Corgémont', 'Cormoret', 'Cortébert', 'Court', 'Courtelary', 'Crémines', 'Därligen', 'Därstetten', 'Deisswil bei', 'Münchenbuchsee', 'Diemerswil', 'Diemtigen mit Oey', 'Diessbach bei Büren', 'Diesse', 'Dotzigen', 'Dürrenroth', 'Eggiwil', 'Epsach', 'Eriswil', 'Eriz', 'Erlach', 'Erlenbach im Simmental', 'Ersigen', 'Eschert', 'Etzelkofen', 'Evilard', '  	Fahrni', 'Farnern', 'Ferenbalm', 'Finsterhennen', 'Forst', 'Fraubrunnen', 'Frauenkappelen', 'Freimettigen', 'Frutigen ', 'Gadmen', 'Gals', 'Gampelen', 'Gelterfingen', 'Gerzensee', 'Golaten', 'Gondiswil', 'Graben', 'Grafenried', 'Grandval', 'Grindelwald', 'Grossaffoltern', 'Grosshöchstetten', 'Gsteig', 'Gsteigwiler', 'Guggisberg', 'Gündlischwand', 'Gurbrü', 'Gurzelen', 'Gutenburg', 'Guttannen', 'Habkern', 'Hagneck', 'Hasle bei Burgdorf', 'Hasliberg', 'Häutligen', 'Heiligenschwendi', 'Heimberg', 'Heimenhausen', 'Heimiswil', 'Hellsau', 'Herbligen', 'Hermiswil', 'Hermrigen', 'Herzogenbuchsee', 'Hilterfingen', 'Hindelbank', 'Höchstetten', 'Höfen bei Thun', 'Hofstetten bei Brienz', 'Homberg', 'Horrenbach-Buchen', 'Huttwil', 'Iffwil', 'Inkwil', 'Innertkirchen', 'Ins', 'Interlaken', 'Ipsach', 'Iseltwald', 'Ittigen', 'Jaberg', 'Jegenstorf', 'Jens', 'Kallnach', 'Kandergrund', 'Kandersteg', 'Kappelen', 'Kaufdorf', 'Kehrsatz', 'Kernenried', 'Kienersrüti', 'Kiesen', 'Kirchberg (BE)', 'Kirchdorf (BE)', 'Kirchenthurnen', 'Kirchlindach', 'Kleindietwil', 'Köniz', 'Konolfingen', 'Koppigen', 'Krattigen', 'Krauchthal', 'Kriechenwil', '  	La Ferrière', 'La Heutte', 'La Neuveville', 'Lamboing', 'Landiswil', 'Längenbühl', 'Langenthal', 'Langnau im Emmental', 'Lauenen', 'Laupen', 'Lauperswil', 'Lauterbrunnen', 'Leimiswil', 'Leissigen', 'Lengnau (BE)', 'Lenk', 'Leuzigen', 'Ligerz', 'Limpach', 'Linden', 'Lohnstorf', 'Lotzwil', 'Loveresse', 'Lüscherz', 'Lütschental', 'Lützelflüh', 'Lyss', 'Lyssach', 'Madiswil', 'Malleray', 'Matten bei Interlaken', 'Mattstetten', 'Meienried', 'Meikirch', 'Meinisberg', 'Meiringen', 'Melchnau', 'Merzligen', 'Mirchel', 'Monible', 'Mont-Tramelan', 'Moosseedorf', 'Mörigen', 'Mötschwil', 'Moutier', 'Mühleberg', 'Mühledorf (BE)', 'Mühlethurnen', 'Mülchi', 'Münchenbuchsee', 'Münchenwiler', 'Münchringen', 'Münsingen', 'Müntschemier', 'Muri bei Bern', 'Neuenegg', 'Nidau', 'Niederbipp', 'Niederhünigen', 'Niedermuhlern', 'Niederönz', 'Niederösch', 'Niederried bei Interlaken', 'Niederried bei Kallnach', 'Niederstocken', 'Nods', 'Noflen', 'Oberbalm', 'Oberbipp', 'Oberburg', 'Oberdiessbach', 'Oberhofen am Thunersee', 'Oberhünigen', 'Oberlangenegg', 'Oberönz', 'Oberösch', 'Oberried am Brienzersee', 'Obersteckholz', 'Oberstocken', 'Oberthal', 'Oberwil bei Büren', 'Oberwil im Simmental', 'Ochlenberg', 'Oeschenbach', 'Oppligen', 'Orpund', 'Orvin', 'Ostermundigen 	Perrefitte', 'Péry', 'Pieterlen', 'Plagne', 'Pohlern', 'Pontenet', 'Port', 'Prêles', 'Radelfingen', 'Rapperswil (BE)', 'Rebévelier', 'Reconvilier', 'Reichenbach im Kandertal', 'Reisiswil', 'Renan (BE)', 'Reutigen', 'Riggisberg', 'Ringgenberg (BE)', 'Roches (BE)', 'Roggwil (BE)', 'Rohrbach', 'Rohrbachgraben', 'Romont (BE)', 'Röthenbach bei', 'Herzogenbuchsee', 'Röthenbach im Emmental', 'Rubigen', 'Rüderswil', 'Rüdtligen-Alchenflüh', 'Rüeggisberg', 'Rüegsau', 'Rumendingen', 'Rumisberg', 'Rümligen', 'Ruppoldsried', 'Rüschegg', 'Rüti bei Büren', 'Rüti bei Lyssach', 'Rüti bei Riggisberg', 'Rütschelen', 'Saanen', 'Safnern', 'Saicourt', 'Saint-Imier', 'Saules (BE)', 'Saxeten', 'Schalunen', 'Schangnau', 'Schattenhalb', 'Schelten', 'Scheunen', 'Scheuren', 'Schlosswil', 'Schüpfen', 'Schwadernau', 'Schwanden bei Brienz', 'Schwarzhäusern', 'Schwendibach', 'Seeberg', 'Seedorf (BE)', 'Seehof', 'Seftigen', 'Signau', 'Sigriswil', 'Siselen', 'Sonceboz-Sombeval', 'Sonvilier', 'Sornetan', 'Sorvilier', 'Souboz', 'Spiez', 'St. Stephan', 'Steffisburg', 'Stettlen', 'Studen', 'Sumiswald', 'Sutz-Lattrigen', '', '  	Tägertschi', 'Täuffelen', 'Tavannes', 'Teuffenthal (BE)', 'Thierachern', 'Thörigen', 'Thun', 'Thunstetten', 'Toffen', 'Trachselwald', 'Tramelan', 'Treiten', 'Trimstein', 'Trub', 'Trubschachen', 'Tschugg', 'Tüscherz-Alfermée', 'Twann', 'Uebeschi', 'Uetendorf', 'Unterlangenegg', 'Unterseen', 'Untersteckholz', 'Ursenbach', 'Urtenen-Schönbühl', 'Uttigen', 'Utzenstorf', 'Vauffelin', 'Vechigen', 'Villeret', 'Vinelz', 'Wachseldorn', 'Wahlern', 'Wald (BE)', 'Walkringen', 'Walliswil bei Niederbipp', 'Walliswil bei Wangen', 'Walperswil', 'Walterswil (BE)', 'Wangen an der Aare', 'Wangenried', 'Wanzwil', 'Wattenwil', 'Wengi', 'Wichtrach', 'Wiedlisbach', 'Wiggiswil', 'Wilderswil', 'Wiler bei Utzenstorf', 'Wileroltigen', 'Willadingen', 'Wimmis', 'Wohlen bei Bern', 'Wolfisberg', 'Worb', 'Worben', 'Wynau', 'Wynigen', 'Wyssachen', 'Zauggenried', 'Zäziwil', 'Zielebach', 'Zollikofen', 'Zuzwil (BE)', 'Zweisimmen', 'Zwieselberg']
for gemeinde in kantonbern: 
    for index, row in df.iterrows():
        try:
            test = fuzz.partial_ratio(row['Geburtsort'], gemeinde)
            if test == 100:
                print('Ev.', index, '(' + row['Geburtsort'] + ')')
        except:
            pass
Ev. Alain Sutter (Bern)
Ev. François Affolter (Biel)
Ev. Alain Sutter (Bern)
Ev. Rémo Meyer (Langenthal)
Ev. Florent Hadergjonaj (Langnau)
Ev. Michael Frey (Münsingen)
Ev. Roman Bürki (Münsingen)
Ev. Alain Sutter (Bern)
Ev. Daniel Sereinig (Wil)
Ev. Fabian Schär (Wil)
Ev. Daniel Sereinig (Wil)
Ev. Fabian Schär (Wil)
Ev. Daniel Sereinig (Wil)
Ev. Fabian Schär (Wil)
Ev. Daniel Sereinig (Wil)
Ev. Fabian Schär (Wil)
Ev. Ciriaco Sforza (Wohlen)
Ev. Goran Karanovic (Wohlen)
Ev. Alain Sutter (Bern)
In [32]:
# Mit welchem Schuhmodell hat man die besten Chancen?
def nichtsalseinschuh(schuh):
    try:
        schuh = re.match(r'(.*)\n.', schuh)
        return schuh.group(1)
    except:
        return ''
    
df['Schuhmodell_neu'] = df['Schuhmodell'].apply(nichtsalseinschuh)
df['Schuhmodell_neu'].value_counts().head(9)
Out[32]:
                                                  151
Mercurial Superfly V FG - Radiation Flare         10 
Mercurial Vapor XI FG - Radiation Flare           8  
Tiempo Legend VI FG - Radiation Flare             8  
Magista Obra II FG - Radiation Flare              7  
Hypervenom Phantom DF III FG - Radiation Flare    5  
Hypervenom Phantom III FG - Radiation Flare       3  
Magista Opus FG - Radiation Flare                 3  
ACE LEATHER TURBOCHARGE                           3  
Name: Schuhmodell_neu, dtype: int64

Vorbereiten der Daten zu den Transfers

In [33]:
# Funktion zum Umformatieren und Umrechnen der Wertangaben in Zahlen. 
def mirweinümmerli(wert):
    try:
        wert = wert.replace(',', '')
        if 'Mio.' in wert:
            temp_wert = re.match(r'(\d.*) Mio.', wert)
            wert = temp_wert.group(1) + '0000'
        elif 'Tsd.' in wert:
            temp_wert = re.match(r'(\d.*) Tsd.', wert)
            wert = temp_wert.group(1) + '000'
        elif 'ablösefrei' in wert:
            wert = 0
        elif '?' in wert:
            wert = np.NaN
        return float(wert)
    except:
        return wert
In [34]:
# Suche nach dem ersten Transfer von der Schweiz ins Ausland.
def funk_jugendmannschaft(team):
    jugendmannschaften = ['U12', 'U13', 'U14', 'U15', 'U16', 'U17', 'U18', 'U19', 'U20', 'U21', 'U22', 'U23', 'U24', 'Jugend', 'Jgd.']
    for u_mannschaft in jugendmannschaften:
        if u_mannschaft in team:
            return True
        else:
            pass

def ersterauslandtransfer(row, transfernummer): 
    for transfer in transfernummer:
        temp_schalter = False
        try:
            temp_list = ast.literal_eval(row[transfer])
            templand1 = temp_list[3]
            templand2 = temp_list[5]
            tempteam2 = temp_list[4]
            temp_schalter = funk_jugendmannschaft(tempteam2)
            if temp_schalter == True:
                pass
            else:
                if templand1 == 'Schweiz' and templand2 != 'Schweiz':
                    if tempteam2 == 'Vereinslos':
                        pass
                    elif tempteam2 == 'Karriereende':
                        pass                    
                    else:
                        temp_list.append(transfer)
                        return temp_list
                else:
                    pass
        except:
            pass

itransfer = dict()
for spieler in df.index:
    itransfer[spieler] = ersterauslandtransfer(df.ix[spieler], transfernummer)
In [35]:
transfer_infos = ['Saison', 'Datum', 'Von Klub', 'Von Land', 'Zu Klub', 'Zu Land', 'Wert', 'Ablösesumme', 'Transfer', 'Geburtsdatum']
df_gointernational = pd.DataFrame(itransfer).transpose()
df_gointernational = df_gointernational.merge(df[['Geburtsdatum']], left_index=True, right_index=True)
df_gointernational.columns = transfer_infos
df_gointernational['Geburtsdatum'] = pd.to_datetime(df_gointernational['Geburtsdatum'], format='%d.%m.%Y')
df_gointernational['Datum'] = pd.to_datetime(df_gointernational['Datum'], format='%d.%m.%Y')
df_gointernational['Alter'] = (df_gointernational['Datum'] - df_gointernational['Geburtsdatum']).astype('timedelta64[Y]')
df_gointernational['Wert'] = df_gointernational['Wert'].apply(mirweinümmerli)
df_gointernational['Wert'] = df_gointernational['Wert'].replace('-',np.NaN)
df_gointernational['Wert'] = df_gointernational['Wert'].astype(float)
df_gointernational['Ablösesumme'] = df_gointernational['Ablösesumme'].apply(mirweinümmerli)
df_gointernational = df_gointernational[df_gointernational.Datum.notnull()] # Leereinträge werden herausgefiltert.
df_gointernational.to_excel('output/gointernational.xlsx')
df_gointernational.to_csv('output/gointernational.csv')
In [36]:
df_gointernational.head()
Out[36]:
Saison Datum Von Klub Von Land Zu Klub Zu Land Wert Ablösesumme Transfer Geburtsdatum Alter
Ciriaco Sforza 93/94 1993-07-01 Grasshoppers Schweiz 1.FC K'lautern Deutschland NaN 0 Transfer_3 1970-03-02 23.0
Diego Lattmann 07/08 2007-07-01 SC Kriens Schweiz Slovan Liberec Tschechien 150000.0 0 Transfer_5 1985-02-22 22.0
Enes Azizi 13/14 2014-01-30 Dardania LS Schweiz Reggiana Italien NaN Leih-Ende Transfer_4 1994-02-09 19.0
Eren Derdiyok 09/10 2009-07-01 FC Basel Schweiz Bay. Leverkusen Deutschland 5000000.0 3.8e+06 Transfer_4 1988-06-12 21.0
Sébastien Wüthrich 14/15 2015-02-02 FC Sion Schweiz HSC Montpellier Frankreich 1000000.0 500000 Transfer_5 1990-05-29 24.0
In [37]:
df_gointernational[df_gointernational['Von Klub'] == 'BSC Young Boys']
Out[37]:
Saison Datum Von Klub Von Land Zu Klub Zu Land Wert Ablösesumme Transfer Geburtsdatum Alter
Florent Hadergjonaj 16/17 2016-08-08 BSC Young Boys Schweiz FC Ingolstadt Deutschland 3000000.0 2e+06 Transfer_6 1994-07-31 22.0
Alain Rochat 05/06 2005-07-01 BSC Young Boys Schweiz Stade Rennes Frankreich 2000000.0 0 Transfer_3 1983-02-01 22.0
Davide Chiumiento 06/07 2007-06-30 BSC Young Boys Schweiz Juventus Turin Italien 1300000.0 Leih-Ende Transfer_8 1984-11-22 22.0
Michael Frey 14/15 2014-09-01 BSC Young Boys Schweiz LOSC Lille Frankreich 2250000.0 3e+06 Transfer_4 1994-07-19 20.0
François Affolter 11/12 2012-01-25 BSC Young Boys Schweiz Werder Bremen Deutschland 1500000.0 Leihgebühr:500 Tsd. € Transfer_3 1991-03-13 20.0
Johan Vonlanthen 03/04 2003-07-01 BSC Young Boys Schweiz PSV Eindhoven Niederlande NaN 800000 Transfer_2 1986-02-01 17.0
In [38]:
df.loc['Christian Schwegler']
Out[38]:
Geburtsdatum           06.06.1984                                                                                                       
Geburtsort             Ettiswil                                                                                                         
Größe                  1.74                                                                                                             
Nationalität           Schweiz                                                                                                          
Position               Abwehr - Rechter Verteidiger                                                                                     
Fuß                    rechts                                                                                                           
Spielerberater         IFM                                                                                                              
Im Team seit           01.07.2009                                                                                                       
Vertrag bis            30.06.2017                                                                                                       
Ausrüster              NaN                                                                                                              
Schuhmodell            NaN                                                                                                              
Aktueller Verein       RB Salzburg                                                                                                      
Aktueller Marktwert    NaN                                                                                                              
Nationalmannschaft     Schweiz U21                                                                                                      
Länderspiele           ['6', '0']                                                                                                       
Jugendvereine          NaN                                                                                                              
Link Leistungsdaten    http://www.transfermarkt.de/christian-schwegler/leistungsdaten/spieler/4931                                      
Twitter                NaN                                                                                                              
Facebook               NaN                                                                                                              
Instagram              NaN                                                                                                              
Offizielle Homepage    NaN                                                                                                              
Transfer_1             ['00/01', '01.07.2000', 'FCL U18', 'Schweiz', 'Luzern U21', 'Schweiz', '-', '-']                                 
Transfer_2             ['01/02', '01.07.2001', 'Luzern U21', 'Schweiz', 'FC Luzern', 'Schweiz', '-', '-']                               
Transfer_3             ['05/06', '01.07.2005', 'FC Luzern', 'Schweiz', 'Arm. Bielefeld', 'Deutschland', '150 Tsd. €', '50 Tsd. €']      
Transfer_4             ['05/06', '01.01.2006', 'Arm. Bielefeld', 'Deutschland', 'BSC Young Boys', 'Schweiz', '150 Tsd. €', 'ablösefrei']
Transfer_5             ['09/10', '01.07.2009', 'BSC Young Boys', 'Schweiz', 'RB Salzburg', 'Österreich', '1,20 Mio. €', '600 Tsd. €']   
Transfer_6             NaN                                                                                                              
Transfer_7             NaN                                                                                                              
Transfer_8             NaN                                                                                                              
Transfer_9             NaN                                                                                                              
Transfer_10            NaN                                                                                                              
Transfer_11            NaN                                                                                                              
Transfer_12            NaN                                                                                                              
Transfer_13            NaN                                                                                                              
Transfer_14            NaN                                                                                                              
Transfer_15            NaN                                                                                                              
Transfer_16            NaN                                                                                                              
Transfer_17            NaN                                                                                                              
Transfer_18            NaN                                                                                                              
Transfer_19            NaN                                                                                                              
Transfer_20            NaN                                                                                                              
Transfer_21            NaN                                                                                                              
Schuhmodell_neu                                                                                                                         
Name: Christian Schwegler, dtype: object

Auswertung der Transferdaten

In [39]:
df_gointernational['Alter'].describe()
Out[39]:
count    188.000000
mean     22.127660 
std      3.225016  
min      16.000000 
25%      20.000000 
50%      22.000000 
75%      24.000000 
max      32.000000 
Name: Alter, dtype: float64
In [40]:
# Wie alt ist der mittlere Spieler beim Wechsel (Median)?
df_gointernational['Alter'].median()
Out[40]:
22.0
In [41]:
temp_min = df_gointernational['Alter'].min()
temp_max = df_gointernational['Alter'].max()
fig, ax = plt.subplots(figsize=(14,8))
df_gointernational['Alter'].hist(bins=int(temp_max-temp_min), color='darkred')
plt.title('Alter beim Wechsel ins Ausland')
plt.xlabel('')
plt.ylabel('Anzahl Fussballer')
plt.xticks(range(int(temp_min),int(temp_max)),range(int(temp_min),int(temp_max)))
plt.tight_layout()
plt.show()
fig.savefig('output/alterbeimwechsel.pdf')
fig.savefig('output/alterbeimwechsel.png')
fig.savefig('output/alterbeimwechsel.svg')
mpld3.save_html(fig, 'output/alterbeimwechsel.html')
In [42]:
df_gointernational[['Alter']].to_excel('output/alterbeimwechsel.xlsx')
In [43]:
# Welche Fussballer wechselten in jungen Jahren aufs internationale Parkett? 
df_gointernational['Alter'].sort_values().astype('int').head(10)
Out[43]:
Orhan Ademi           16
Haris Seferovic       17
Dimitri Oberlin       17
Dilaver Satilmis      17
Saidy Janko           17
Johan Vonlanthen      17
Kevin Mbabu           17
Vasilije Janjicic     17
Guy Roger Eschmann    18
Reto Ziegler          18
Name: Alter, dtype: int64
In [44]:
# Welche Fussballer waren beim Wechsel ins Ausland besonders alt?
# Achtung, berücksichtigt wird der erste Wechsel von der Schweiz ins Ausland. Einige dieser Spieler hier haben aber 
# zuerst aus dem Ausland in die Schweiz gewechselt, bevor sie wieder ins Ausland zogen. Sie sind aber Schweizer Bürger. 
# Diese Spieler haben natürlich auch Einfluss auf den Mittelwert. 
df_gointernational['Alter'].sort_values(ascending=False).astype('int').head(10)
Out[44]:
Nestor Subiat         32
Marco Pascolo         30
Adrian Kunz           30
Mario Cantaluppi      30
Marco Zwyssig         29
Johann Lonfat         29
Pascal Zuberbühler    29
Mauro Lustrinelli     29
Marc Zellweger        28
Vincent Rüfli         28
Name: Alter, dtype: int64
In [45]:
# Schauen wir uns die Transfers von Nestor Subiat an. 
print("Nestor Subiat")
for i in range(1,12):
    print(df.loc['Nestor Subiat']['Transfer_' + str(i)])
Nestor Subiat
['84/85', '01.07.1984', 'Unbekannt', '', 'Mulhouse', 'Frankreich', '-', '?']
['89/90', '01.07.1989', 'Mulhouse S-A', 'Frankreich', 'R. Straßburg', 'Frankreich', '-', '?']
['90/91', '01.07.1990', 'R. Straßburg', 'Frankreich', 'Mulhouse S-A', 'Frankreich', '-', '?']
['92/93', '01.07.1992', 'Mulhouse S-A', 'Frankreich', 'FC Lugano', 'Schweiz', '-', '?']
['94/95', '01.07.1994', 'FC Lugano', 'Schweiz', 'Grasshoppers', 'Schweiz', '-', '?']
['97/98', '01.07.1997', 'Grasshoppers', 'Schweiz', 'FC Basel', 'Schweiz', '-', '?']
['98/99', '01.07.1998', 'FC Basel', 'Schweiz', 'AS St.-Étienne', 'Frankreich', '-', '?']
['00/01', '01.07.2000', 'AS St.-Étienne', 'Frankreich', 'Etoile Carouge', 'Schweiz', '-', '?']
['00/01', '01.01.2001', 'Etoile Carouge', 'Schweiz', 'FC Luzern', 'Schweiz', '-', '?']
['01/02', '01.07.2001', 'FC Luzern', 'Schweiz', 'SC Orange', 'Frankreich', '-', '?']
['04/05', '01.07.2004', 'SC Orange', 'Frankreich', 'Karriereende', '', '-', '-']
In [46]:
# Wie hoch ist der Marktwert beim Wechsel ins Ausland? 
fig, ax = plt.subplots(figsize=(5,10))
df_gointernational[['Wert']].dropna().sort_values(by='Wert', ascending=True).tail(20).plot(kind='barh', color='darkred', ax=ax)
plt.title('Wert beim ersten Wechsel ins Ausland')
plt.xlabel('in Mio. Euro')
plt.ylabel('')
plt.tight_layout()
plt.show()
fig.savefig('output/wertbeimwechsel.pdf')
fig.savefig('output/wertbeimwechsel.png')
fig.savefig('output/wertbeimwechsel.svg')
mpld3.save_html(fig, 'output/wertbeimwechsel.html')
In [47]:
# Wie hängen das Alter beim ersten Auslandtransfer und der Wert zu diesem Zeitpunkt zusammen?  
df_gointernational[['Wert','Alter']].dropna().plot(kind='scatter', x='Alter', y='Wert', figsize=[15,7])
Out[47]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f8afee7a9b0>
In [48]:
# Wer wechselte bei hohem geschätzten Wert?
pd.DataFrame(df_gointernational['Wert'].sort_values(ascending=False).head(20))
Out[48]:
Wert
Breel Embolo 20000000.0
Xherdan Shaqiri 12500000.0
Granit Xhaka 8500000.0
Yann Sommer 8000000.0
Fabian Schär 8000000.0
Ricardo Rodríguez 7500000.0
Valentin Stocker 7000000.0
Fabian Frei 5000000.0
Eren Derdiyok 5000000.0
Edimilson Fernandes 4500000.0
Nico Elvedi 4000000.0
Léo Lacroix 3000000.0
Admir Mehmedi 3000000.0
Florent Hadergjonaj 3000000.0
Josip Drmic 3000000.0
Blerim Dzemaili 2500000.0
Roman Bürki 2500000.0
Shani Tarashaj 2500000.0
Nassim Ben Khalifa 2500000.0
Christoph Spycher 2400000.0
In [49]:
# Wer wechselte bei tiefem (geschätztem) Wert?
pd.DataFrame(df_gointernational['Wert'].sort_values().head(20))
Out[49]:
Wert
Levent Gülen 50000.0
Marwin Hitz 50000.0
Cédric Tsimba 50000.0
Josip Uzelac 50000.0
Kevin Mbabu 50000.0
Haris Seferovic 50000.0
Mato Sego 75000.0
Kevin Gissi 100000.0
Carlo Polli 100000.0
Andreas Hirzel 100000.0
Andelko Savic 100000.0
Kiliann Witschi 125000.0
Christian Schwegler 150000.0
Riccardo Meili 150000.0
Ulisses Garcia 150000.0
Jérémy Frick 150000.0
Diego Lattmann 150000.0
Simone Grippo 150000.0
Alessandro Iandoli 200000.0
Boban Maksimovic 200000.0
In [50]:
# Für wen wurden besonders hohe Ablösesummen bezahlt?
pd.to_numeric(df_gointernational['Ablösesumme'], errors='coerce').sort_values(ascending=False).head(13)
Out[50]:
Breel Embolo           22500000.0
Xherdan Shaqiri        11800000.0
Yann Sommer            9000000.0 
Ricardo Rodríguez      8500000.0 
Granit Xhaka           8500000.0 
Patrick Müller         8000000.0 
Edimilson Fernandes    6400000.0 
Gelson Fernandes       5500000.0 
Moritz Bauer           4000000.0 
Valentin Stocker       4000000.0 
Fabian Schär           4000000.0 
Nico Elvedi            4000000.0 
Shani Tarashaj         4000000.0 
Name: Ablösesumme, dtype: float64
In [51]:
# Beim wie vielten "Anlauf" wechseln die Spieler normalerweise ins Ausland? 
df_gointernational['Transfer'].value_counts()
Out[51]:
Transfer_3     45
Transfer_2     43
Transfer_4     35
Transfer_5     27
Transfer_6     13
Transfer_1     8 
Transfer_7     5 
Transfer_8     5 
Transfer_10    3 
Transfer_11    1 
Transfer_9     1 
Transfer_14    1 
Transfer_13    1 
Name: Transfer, dtype: int64
In [52]:
df_gointernational['Transfer'].value_counts().sort_values().plot(kind='barh')
Out[52]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f8afec9b9e8>
In [53]:
df_gointernational[df_gointernational['Transfer'] == 'Transfer_12']
Out[53]:
Saison Datum Von Klub Von Land Zu Klub Zu Land Wert Ablösesumme Transfer Geburtsdatum Alter
In [54]:
# Entwicklung Marktwert im Ausland. 
marktwert_dict = dict()
for temp_spieler in df_gointernational.index:
    temp_liste = list()
    try:
        temp_row = df.loc[temp_spieler]
        for transfer in transfernummer:
            temp_liste.append(mirweinümmerli(ast.literal_eval(temp_row[transfer])[6]))
    except:
        pass
    marktwert_dict[temp_spieler] = temp_liste
df_marktwert = pd.DataFrame.from_dict(marktwert_dict, orient='index')
df_marktwert.columns = transfernummer
df_marktwert.to_csv('output/marktwert.csv')
df_marktwert.head()
Out[54]:
Transfer_1 Transfer_2 Transfer_3 Transfer_4 Transfer_5 Transfer_6 Transfer_7 Transfer_8 Transfer_9 Transfer_10 ... Transfer_12 Transfer_13 Transfer_14 Transfer_15 Transfer_16 Transfer_17 Transfer_18 Transfer_19 Transfer_20 Transfer_21
Mauro Lustrinelli - - 1.2e+06 1.5e+06 950000 600000 400000 300000 300000 None ... None None None None None NaN None None NaN NaN
Philippe Senderos - - 6.5e+06 5e+06 4.5e+06 3e+06 3e+06 2.5e+06 2.5e+06 1.5e+06 ... None None None None None NaN None None NaN NaN
David Sesa - - - - - - 800000 800000 800000 800000 ... None None None None None NaN None None NaN NaN
Veroljub Salatic - 1e+06 1e+06 1.5e+06 None None None None None None ... None None None None None NaN None None NaN NaN
Rémo Meyer - - 1e+06 650000 650000 - None None None None ... None None None None None NaN None None NaN NaN

5 rows × 21 columns

In [55]:
wert_international_dict = dict()
for spieler in df_gointernational.index:
    temp_spieler_liste = df.loc[spieler][df.columns[df.columns.to_series().str.contains('Transfer_')]].tolist()
    temp_transfer = int(df_gointernational.loc[spieler]['Transfer'].replace('Transfer_', ''))
    temp_liste = list()
    for transfer in range(len(temp_spieler_liste)):
        try:
            temp_wert = (ast.literal_eval(temp_spieler_liste[transfer])[6])
            if temp_wert == '-':
                temp_wert.replace('-', np.NaN)
            temp_wert = mirweinümmerli(temp_wert)
        except:
            temp_wert = np.NaN
        temp_liste.append(temp_wert)
    temp_liste = temp_liste[temp_transfer - 1:]
    wert_international_dict[spieler] = temp_liste
df_wert_international = pd.DataFrame.from_dict(wert_international_dict, orient='index')
df_wert_international.to_excel('output/wert_international.xlsx')
df_wert_international.to_csv('output/wert_international.csv')
df_wert_international.head()
Out[55]:
0 1 2 3 4 5 6 7 8 9 ... 11 12 13 14 15 16 17 18 19 20
Mauro Lustrinelli 1200000.0 1500000.0 950000.0 600000.0 400000.0 300000.0 300000.0 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Philippe Senderos NaN 6500000.0 5000000.0 4500000.0 3000000.0 3000000.0 2500000.0 2500000.0 1500000.0 900000.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
David Sesa NaN NaN NaN 800000.0 800000.0 800000.0 800000.0 800000.0 NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Veroljub Salatic 1000000.0 1000000.0 1500000.0 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Rémo Meyer NaN 1000000.0 650000.0 650000.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 21 columns

In [56]:
# Wie entwickelte sich der Marktwert der Spieler im Ausland? 

fig, ax = plt.subplots(figsize=(14,8))
df_wert_international.transpose().plot(ax=ax)
plt.title('Entwicklung des Marktwerts pro Transfer')
plt.xlabel('')
#plt.ylabel('Anzahl Fussballer')
plt.xticks(range(0,len(transfernummer)))
plt.tight_layout()
plt.show()
In [57]:
# Wie entwickelte sich der Marktwert ausgewählter Spieler im Ausland? 
selektion = ['Innocent Emeghara', 'Gelson Fernandes', 'Carlo Polli', 'Mobulu M\'Futi']
df_wert_international_selektion = df_wert_international
df_wert_international_selektion = df_wert_international_selektion[df_wert_international_selektion.index.isin(selektion)]

fig, ax = plt.subplots(figsize=(12,6))
df_wert_international_selektion.transpose().plot(ax=ax)
plt.title('Entwicklung des Marktwerts im Ausland')
plt.xlabel('')
#plt.ylabel('Anzahl Fussballer')
plt.xticks(range(0,len(transfernummer)))
plt.tight_layout()
plt.show()
fig.savefig('output/wertinternational_selektion.pdf')
fig.savefig('output/wertinternational_selektion.png')
fig.savefig('output/wertinternational_selektion.svg')
mpld3.save_html(fig, 'output/wertinternational_selektion.html')
In [58]:
# Wohin wechselten die Berner Spieler? 

bernerspieler = ['Alain Sutter', 'François Affolter', 'Rémo Meyer', 'Florent Hadergjonaj', 'Michael Frey', 'Roman Bürki']
df_gointernational[df_gointernational.index.isin(bernerspieler)]
Out[58]:
Saison Datum Von Klub Von Land Zu Klub Zu Land Wert Ablösesumme Transfer Geburtsdatum Alter
Rémo Meyer 02/03 2002-07-01 Lausanne-Sport Schweiz 1860 München Deutschland NaN 825000 Transfer_2 1980-11-12 21.0
Florent Hadergjonaj 16/17 2016-08-08 BSC Young Boys Schweiz FC Ingolstadt Deutschland 3000000.0 2e+06 Transfer_6 1994-07-31 22.0
Michael Frey 14/15 2014-09-01 BSC Young Boys Schweiz LOSC Lille Frankreich 2250000.0 3e+06 Transfer_4 1994-07-19 20.0
François Affolter 11/12 2012-01-25 BSC Young Boys Schweiz Werder Bremen Deutschland 1500000.0 Leihgebühr:500 Tsd. € Transfer_3 1991-03-13 20.0
Roman Bürki 14/15 2014-07-01 Grasshoppers Schweiz SC Freiburg Deutschland 2500000.0 1.8e+06 Transfer_11 1990-11-14 23.0
Alain Sutter 93/94 1993-07-01 Grasshoppers Schweiz 1.FC Nürnberg Deutschland NaN Leihgebühr:175 Tsd. € Transfer_3 1968-01-22 25.0
In [59]:
# Wohin welchselten die YB-Spieler? 
df_gointernational[df_gointernational['Von Klub'] == 'BSC Young Boys']
Out[59]:
Saison Datum Von Klub Von Land Zu Klub Zu Land Wert Ablösesumme Transfer Geburtsdatum Alter
Florent Hadergjonaj 16/17 2016-08-08 BSC Young Boys Schweiz FC Ingolstadt Deutschland 3000000.0 2e+06 Transfer_6 1994-07-31 22.0
Alain Rochat 05/06 2005-07-01 BSC Young Boys Schweiz Stade Rennes Frankreich 2000000.0 0 Transfer_3 1983-02-01 22.0
Davide Chiumiento 06/07 2007-06-30 BSC Young Boys Schweiz Juventus Turin Italien 1300000.0 Leih-Ende Transfer_8 1984-11-22 22.0
Michael Frey 14/15 2014-09-01 BSC Young Boys Schweiz LOSC Lille Frankreich 2250000.0 3e+06 Transfer_4 1994-07-19 20.0
François Affolter 11/12 2012-01-25 BSC Young Boys Schweiz Werder Bremen Deutschland 1500000.0 Leihgebühr:500 Tsd. € Transfer_3 1991-03-13 20.0
Johan Vonlanthen 03/04 2003-07-01 BSC Young Boys Schweiz PSV Eindhoven Niederlande NaN 800000 Transfer_2 1986-02-01 17.0
In [60]:
# Wo wohnen die Kandidaten (siehe interaktive Karte map_kandaten.html).

df_yb_ins_ausland = df_gointernational[df_gointernational['Von Klub'] == 'BSC Young Boys']
df_thun_ins_ausland = df_gointernational[df_gointernational['Von Klub'] == 'FC Thun']
df_biel_ins_ausland = df_gointernational[df_gointernational['Von Klub'] == 'FC Biel-Bienne']
df_be_ins_ausland = pd.concat([df_yb_ins_ausland, df_thun_ins_ausland, df_biel_ins_ausland])
df_be_ins_ausland = df_be_ins_ausland[['Datum', 'Von Klub', 'Zu Klub', 'Zu Land', 'Wert', 'Alter']]
df_be_ins_ausland['Alter'] = df_be_ins_ausland['Alter'].astype(int)
df_be_ins_ausland['Wert'] = df_be_ins_ausland['Wert'] / 1000000

def datumsrechner(datum):
    return datum.strftime('%d. %B %Y')
locale.setlocale(locale.LC_ALL, 'de_CH.utf8')

df_be_ins_ausland['Datum'] = df_be_ins_ausland['Datum'].apply(datumsrechner)
df_be_ins_ausland
Out[60]:
Datum Von Klub Zu Klub Zu Land Wert Alter
Florent Hadergjonaj 08. August 2016 BSC Young Boys FC Ingolstadt Deutschland 3.00 22
Alain Rochat 01. Juli 2005 BSC Young Boys Stade Rennes Frankreich 2.00 22
Davide Chiumiento 30. Juni 2007 BSC Young Boys Juventus Turin Italien 1.30 22
Michael Frey 01. September 2014 BSC Young Boys LOSC Lille Frankreich 2.25 20
François Affolter 25. Januar 2012 BSC Young Boys Werder Bremen Deutschland 1.50 20
Johan Vonlanthen 01. Juli 2003 BSC Young Boys PSV Eindhoven Niederlande NaN 17
Mauro Lustrinelli 01. Februar 2006 FC Thun Sparta Prag Tschechien 1.20 29
Timm Klose 01. Juli 2011 FC Thun 1.FC Nürnberg Deutschland 0.80 23
David Pallas 01. Juli 2005 FC Thun VfL Bochum Deutschland 0.20 24
Fabian Stoller 01. Januar 2011 FC Thun H. Petah Tikva Israel 0.20 22
Sokol Maliqi 01. Juli 2009 FC Biel-Bienne APEP Pitsilia Zypern 0.30 27
In [66]:
# Die Koordinaten der Stadien werden manuell hinzugefügt. 

df_be_ins_ausland.loc['Florent Hadergjonaj', 'lat'] = 48.76337
df_be_ins_ausland.loc['Florent Hadergjonaj', 'lon'] = 11.42422
df_be_ins_ausland.loc['Alain Rochat', 'lat'] = 48.09805
df_be_ins_ausland.loc['Alain Rochat', 'lon'] = -1.72008
df_be_ins_ausland.loc['Davide Chiumiento', 'lat'] = 45.10978
df_be_ins_ausland.loc['Davide Chiumiento', 'lon'] = 7.64198
df_be_ins_ausland.loc['Michael Frey', 'lat'] = 50.61687
df_be_ins_ausland.loc['Michael Frey', 'lon'] = 3.07121
df_be_ins_ausland.loc['François Affolter', 'lat'] = 53.06642
df_be_ins_ausland.loc['François Affolter', 'lon'] = 8.83788
df_be_ins_ausland.loc['Johan Vonlanthen', 'lat'] = 51.44158
df_be_ins_ausland.loc['Johan Vonlanthen', 'lon'] = 5.46790
df_be_ins_ausland.loc['Mauro Lustrinelli', 'lat'] = 50.09991
df_be_ins_ausland.loc['Mauro Lustrinelli', 'lon'] = 14.41589
df_be_ins_ausland.loc['Timm Klose', 'lat'] = 49.42622
df_be_ins_ausland.loc['Timm Klose', 'lon'] = 11.12560
df_be_ins_ausland.loc['David Pallas', 'lat'] = 51.49006
df_be_ins_ausland.loc['David Pallas', 'lon'] = 7.23644
df_be_ins_ausland.loc['Fabian Stoller', 'lat'] = 32.1042324
df_be_ins_ausland.loc['Fabian Stoller', 'lon'] = 34.8655205
df_be_ins_ausland.loc['Sokol Maliqi', 'lat'] = 34.9353264
df_be_ins_ausland.loc['Sokol Maliqi', 'lon'] = 32.97413
In [67]:
df_be_ins_ausland.loc['Johan Vonlanthen', 'Wert'] = '-'
In [68]:
# Die Karte wird generiert. 
map_be = folium.Map(location=[46.9492,7.4428], zoom_start=4, tiles='Stamen Toner')
for spieler in df_be_ins_ausland.index:
    koordinaten = df_be_ins_ausland.loc[spieler]['lat'],df_be_ins_ausland.loc[spieler]['lon']
    
    html = spieler + ' wechselte am ' + str(df_be_ins_ausland.loc[spieler]['Datum']) + ' im Alter von ' + str(df_be_ins_ausland.loc[spieler]['Alter']) + ' Jahren von ' + df_be_ins_ausland.loc[spieler]['Von Klub'] + ' zu ' + df_be_ins_ausland.loc[spieler]['Zu Klub'] + ' in ' + df_be_ins_ausland.loc[spieler]['Zu Land'] + '. '  
    if df_be_ins_ausland.loc[spieler]['Wert'] == '-':
        pass
    else:
        html = html + 'Sein damaliger Marktwert wurde auf ' + str(df_be_ins_ausland.loc[spieler]['Wert']) + ' Millionen Euro geschätzt.'
    popup = folium.Popup(html, max_width=200)
    folium.Marker(koordinaten, icon=folium.Icon(color='darkred',icon='info-sign'), popup=popup).add_to(map_be)
map_be.save('output/map_be.html')
map_be
Out[68]:
In [69]:
fig, ax = plt.subplots(figsize=(6,6))
df_gointernational['Von Klub'].value_counts().sort_values(ascending=True).tail(14).plot(kind='barh', color='darkred', ax=ax)
plt.title('Grasshoppers ist der grösste Exporteur')
plt.xlabel('Anzahl Internationale')
#plt.ylabel('Anzahl Fussballer')
plt.tight_layout()
plt.show()
fig.savefig('output/export_klubs.pdf')
fig.savefig('output/export_klubs.png')
fig.savefig('output/export_klubs.svg')
mpld3.save_html(fig, 'output/export_klubs.html')
In [79]:
df_yb_ins_ausland.loc['Michael Frey', 'lat'] = '765'
df_yb_ins_ausland.loc['François Affolter', 'lat'] = '765'
df_yb_ins_ausland.loc['Johan Vonlanthen', 'lat'] = '765'
In [80]:
df_yb_ins_ausland
Out[80]:
Saison Datum Von Klub Von Land Zu Klub Zu Land Wert Ablösesumme Transfer Geburtsdatum Alter lat
Florent Hadergjonaj 16/17 2016-08-08 BSC Young Boys Schweiz FC Ingolstadt Deutschland 3000000.0 2e+06 Transfer_6 1994-07-31 22.0 NaN
Alain Rochat 05/06 2005-07-01 BSC Young Boys Schweiz Stade Rennes Frankreich 2000000.0 0 Transfer_3 1983-02-01 22.0 NaN
Davide Chiumiento 06/07 2007-06-30 BSC Young Boys Schweiz Juventus Turin Italien 1300000.0 Leih-Ende Transfer_8 1984-11-22 22.0 NaN
Michael Frey 14/15 2014-09-01 BSC Young Boys Schweiz LOSC Lille Frankreich 2250000.0 3e+06 Transfer_4 1994-07-19 20.0 765
François Affolter 11/12 2012-01-25 BSC Young Boys Schweiz Werder Bremen Deutschland 1500000.0 Leihgebühr:500 Tsd. € Transfer_3 1991-03-13 20.0 765
Johan Vonlanthen 03/04 2003-07-01 BSC Young Boys Schweiz PSV Eindhoven Niederlande NaN 800000 Transfer_2 1986-02-01 17.0 765
In [82]:
df_yb_ins_ausland
Out[82]:
Saison Datum Von Klub Von Land Zu Klub Zu Land Wert Ablösesumme Transfer Geburtsdatum Alter lat
Florent Hadergjonaj 16/17 2016-08-08 BSC Young Boys Schweiz FC Ingolstadt Deutschland 3000000.0 2e+06 Transfer_6 1994-07-31 22.0 NaN
Alain Rochat 05/06 2005-07-01 BSC Young Boys Schweiz Stade Rennes Frankreich 2000000.0 0 Transfer_3 1983-02-01 22.0 NaN
Davide Chiumiento 06/07 2007-06-30 BSC Young Boys Schweiz Juventus Turin Italien 1300000.0 Leih-Ende Transfer_8 1984-11-22 22.0 NaN
Michael Frey 14/15 2014-09-01 BSC Young Boys Schweiz LOSC Lille Frankreich 2250000.0 3e+06 Transfer_4 1994-07-19 20.0 765
François Affolter 11/12 2012-01-25 BSC Young Boys Schweiz Werder Bremen Deutschland 1500000.0 Leihgebühr:500 Tsd. € Transfer_3 1991-03-13 20.0 765
Johan Vonlanthen 03/04 2003-07-01 BSC Young Boys Schweiz PSV Eindhoven Niederlande NaN 800000 Transfer_2 1986-02-01 17.0 765
In [84]:
# Welches sind die populärsten Länder für den ersten Wechsel?
df_gointernational['Zu Land'].value_counts()
Out[84]:
Deutschland                     62
Frankreich                      29
Italien                         29
England                         17
Österreich                      8 
Spanien                         8 
Türkei                          5 
Zypern                          5 
Russland                        3 
Bosnien-Herzegowina             2 
Rumänien                        2 
Portugal                        2 
Griechenland                    2 
Tschechien                      2 
Niederlande                     2 
Vereinigte Arabische Emirate    1 
Ukraine                         1 
Mexiko                          1 
Belgien                         1 
Kroatien                        1 
Serbien                         1 
Mazedonien                      1 
Bulgarien                       1 
Lettland                        1 
Israel                          1 
Name: Zu Land, dtype: int64
In [85]:
df_gointernational['Zu Land'].value_counts().sort_values(ascending=True).tail(9).plot(kind='barh')
Out[85]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f8afef145f8>
In [86]:
# Welches sind die beliebtesten Vereine beim ersten Wechsel aufs internationale Parkett?
df_gointernational['Zu Klub'].value_counts()
Out[86]:
Werder Bremen      5
1.FC Nürnberg      5
VfB Stuttgart      5
Stade Rennes       4
Bor. M'gladbach    4
Bay. Leverkusen    4
VfL Wolfsburg      4
APEP Pitsilia      3
Hertha BSC         3
SC Freiburg        3
FC Genua           3
LOSC Lille         3
West Ham Utd.      3
US Palermo         2
Hamburger SV       2
ES Troyes AC       2
1860 München       2
Newcastle Utd.     2
AJ Auxerre         2
E. Frankfurt       2
Bari               2
Arm. Bielefeld     2
Udinese            2
Olympique Lyon     2
Catania Calcio     2
Manchester City    2
SCR Altach         2
Cagliari Calcio    2
FC Schalke 04      2
Omonia Nikosia     2
                  ..
1.FC K'lautern     1
FC Bologna         1
Bolton             1
FC Portsmouth      1
Hannover 96        1
PAE Veria          1
FC Sochaux         1
Dynamo Kiew        1
UC Sampdoria       1
Juventus Turin     1
Real Oviedo        1
Pescara            1
FC Liverpool       1
FC Istres          1
Benfica            1
HSC Montpellier    1
Paris SG           1
Rapid Wien         1
Göztepe            1
Blackburn Rov.     1
Siroki Brijeg      1
FC Arsenal         1
NK Istra           1
Bayer 05           1
Rabotn. Skopje     1
CF Belenenses      1
1.FSV Mainz 05     1
TSG Hoffenheim     1
RW Essen           1
Tottenham          1
Name: Zu Klub, dtype: int64
In [87]:
df_gointernational['Zu Klub'].value_counts().sort_values(ascending=True).tail(13).plot(kind='barh')
Out[87]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f8afeb45550>
In [88]:
# To do: Export der Stationen von ausgewählten Spielern. Inklusive Geocoding. 
In [89]:
df_mapdaten = df[['Transfer_1','Transfer_2','Transfer_3','Transfer_4','Transfer_5','Transfer_6','Transfer_7','Transfer_8','Transfer_9','Transfer_10','Transfer_11','Transfer_12','Transfer_13','Transfer_14','Transfer_15','Transfer_16','Transfer_17','Transfer_18','Transfer_19','Transfer_20','Transfer_21']]
df_mapdaten.to_csv('output/mapdaten.csv')
In [90]:
transfer_infos = ['Saison', 'Datum', 'Von Klub', 'Von Land', 'Zu Klub', 'Zu Land', 'Wert', 'Ablösesumme', 'Transfer', 'Geburtsdatum']
df_mapdaten = pd.DataFrame(itransfer).transpose()
In [93]:
# Welche Fussballspieler bringen entsprechen am besten dem "perfekten Fussballer"?
df[(df['Geburtsort'] == 'Zürich') & 
   (df['Position'] == 'Abwehr - Innenverteidiger')][['Geburtsort', 'Position']]
Out[93]:
Geburtsort Position
Unnamed: 0
Nico Elvedi Zürich Abwehr - Innenverteidiger
Martin Angha Zürich Abwehr - Innenverteidiger
Stephan Andrin Keller Zürich Abwehr - Innenverteidiger
In [94]:
# Welche Fussballspieler bringen entsprechen am besten dem "perfekten Fussballer"?
df[(df['Geburtsort'] == 'Zürich') & 
   (df['Größe'] == 1.83)][['Geburtsort', 'Größe']]
Out[94]:
Geburtsort Größe
Unnamed: 0
Fabio Daprelà Zürich 1.83
Feliciano Magro Zürich 1.83
Josip Uzelac Zürich 1.83
In [95]:
# Welche Fussballspieler bringen entsprechen am besten dem "perfekten Fussballer"?
df[(df['Position'] == 'Abwehr - Innenverteidiger') & 
   (df['Größe'] == 1.83)][['Position', 'Größe']]
Out[95]:
Position Größe
Unnamed: 0
Rémo Meyer Abwehr - Innenverteidiger 1.83
Alessandro Mangiarratti Abwehr - Innenverteidiger 1.83
Reto Ziegler Abwehr - Innenverteidiger 1.83
In [96]:
# Welche Fussballspieler bringen entsprechen am besten dem "perfekten Fussballer"?
df[(df['Position'] == 'Abwehr - Innenverteidiger') & 
   (df['Größe'] >= 1.81) &
   (df['Größe'] <= 1.85)][['Position', 'Größe', 'Geburtsort']]
Out[96]:
Position Größe Geburtsort
Unnamed: 0
Rémo Meyer Abwehr - Innenverteidiger 1.83 Langenthal
Steve von Bergen Abwehr - Innenverteidiger 1.82 Neuchâtel
Stéphane Henchoz Abwehr - Innenverteidiger 1.85 Billens
Ivan Knez Abwehr - Innenverteidiger 1.84 Buenos Aires
Patrick Müller Abwehr - Innenverteidiger 1.82 Genf
Kwaku Nyamekye Abwehr - Innenverteidiger 1.85 Genf
Alessandro Mangiarratti Abwehr - Innenverteidiger 1.83 Bellinzona
Reto Ziegler Abwehr - Innenverteidiger 1.83 Genf
In [ ]: