Los números del Mundial

Un amigo me dijo ayer que la fiebre del mundial ya no le afecta como antes. Cuando era chico, decía, la ansiedad por la navidad, los reyes y sobre todo, los mundiales, no lo dejaba dormir.

A mí Papá Noel y los Reyes me tenían bastante sin cuidado (que sólo ocasionalmente venían a mi casa, sobre todo cuando le hacíamos caso a mi hermano mayor, que nos instruía que a Baltazar había que dejarle una cerveza negra bien fría, para pasar el calor de las madrugadas de enero). Pero me sigue pasando lo mismo con el mundial de fútbol: fiebre. No hay acontecimiento que ansíe más que ese.

En el 86 yo ya caminaba solito, pero mis recuerdos mundialistas arrancan recién en el '90 con el gol de Camerún a Pumpido (que todavia tenía todos los dedos, aunque no se notaba). Tan poco futbolera era mi casa pero tanto yo, que tengo la imágen nítida: cuando fue el gol del Canni a Brasil yo estaba en la rotiseria de de Don Duca, a 3 cuadras de mi casa, esperando que me entregaran un pollo asado que me habían mandado a comprar. Al escuchar el griterío del barrio alguien me dejó pasar, y pude ver el gol en la repetición en un televisorcito diminuto que tenían sobre una mesada mugrienta. Volví llorando, emocionado, con un olor a pollo que no olvidaré más.

Y ahora, por fin, está llegando ese olorcito de nuevo. En el interín me empapo de nombres y jugadores, estadísticas e historias de color. La fiebre no me deja dormir.

En esa procrastinación encontré el artículo de Wikipedia con la lista de todas las selecciones y, como una ducha de agua fria, intenté sacarle alguna información.

En tu cabeza hay un (scrapper de) gol

Usé la misma técnica que en el análisis de las elecciones de Córdoba: la extensión de IPython para usar el orm de Django que hice y PyQuery para scrappear.

In [1]:
%load_ext django_orm_magic

Los modelos me quedaron así

In [2]:
%%django_orm

from django.db import models

class Country(models.Model):
    name = models.CharField(max_length="100")
    
    def __unicode__(self):
        return self.name
    
class City(models.Model):
    country = models.ForeignKey('Country')
    name = models.CharField(max_length="100")

    def __unicode__(self):
        return "{0}, {1}".format(self.name, self.country) 
    
class Team(models.Model):
    country = models.ForeignKey('Country')
    group = models.CharField(max_length="100")
    
    def __unicode__(self):
        return unicode(self.country)

class Club(models.Model):
    name = models.CharField(max_length="100")
    country = models.ForeignKey('Country')

    def __unicode__(self):
        return self.name
    
class Player(models.Model):

    full_name = models.CharField(max_length=100)
    date_of_birth = models.DateField(null=True, blank=True)    
    team = models.ForeignKey('Team')
    url = models.URLField(max_length=200, null=True, blank=True)
    
    place_of_birth = models.ForeignKey('City', null=True, blank=True)
    height = models.FloatField(null=True, blank=True)
    position = models.CharField(max_length=2)
    current_club = models.ForeignKey('Club')
    last_season_apps = models.IntegerField(null=True, blank=True)
    last_season_goals = models.IntegerField(null=True, blank=True)
    national_team_apps = models.IntegerField(null=True, blank=True)
    national_team_goals = models.IntegerField(null=True, blank=True)
        
    def __unicode__(self):
        return self.full_name

Lo que necesité es parsear cada una de las tablas asociadas a una selección. Por ejemplo, la de Brasil

In [3]:
from pyquery import PyQuery
from IPython.display import HTML, Image
pq = PyQuery('http://en.wikipedia.org/wiki/2014_FIFA_World_Cup_squads')
pq.make_links_absolute()
Out[3]:
[<html.client-nojs>]
In [4]:
brazil = pq('table:first').html()
HTML(brazil)
Out[4]:
No. Pos. Player DoB/Age Caps Club
1 1GK Jefferson (1983-01-02)2 January 1983 (aged 31) 9 Brazil Botafogo
2 2DF Dani Alves (1983-05-06)6 May 1983 (aged 31) 74 Spain Barcelona
3 2DF Thiago Silva (c) (1984-09-22)22 September 1984 (aged 29) 45 France Paris Saint-Germain
4 2DF David Luiz (1987-04-22)22 April 1987 (aged 27) 35 England Chelsea
5 3MF Fernandinho (1985-05-04)4 May 1985 (aged 29) 6 England Manchester City
6 2DF Marcelo (1988-05-12)12 May 1988 (aged 26) 30 Spain Real Madrid
7 4FW Hulk (1986-07-25)25 July 1986 (aged 27) 34 Russia Zenit Saint Petersburg
8 3MF Paulinho (1988-07-25)25 July 1988 (aged 25) 25 England Tottenham Hotspur
9 4FW Fred (1983-10-03)3 October 1983 (aged 30) 33 Brazil Fluminense
10 4FW Neymar (1992-02-05)5 February 1992 (aged 22) 48 Spain Barcelona
11 3MF Oscar (1991-09-09)9 September 1991 (aged 22) 30 England Chelsea
12 1GK Júlio César (1979-09-03)3 September 1979 (aged 34) 79 Canada Toronto
13 2DF Dante (1983-10-18)18 October 1983 (aged 30) 12 Germany Bayern Munich
14 2DF Maxwell (1981-08-27)27 August 1981 (aged 32) 8 France Paris Saint-Germain
15 2DF Henrique (1986-10-14)14 October 1986 (aged 27) 5 Italy Napoli
16 3MF Ramires (1987-03-24)24 March 1987 (aged 27) 42 England Chelsea
17 3MF Luiz Gustavo (1987-07-23)23 July 1987 (aged 26) 18 Germany VfL Wolfsburg
18 3MF Hernanes (1985-05-29)29 May 1985 (aged 29) 24 Italy Internazionale
19 3MF Willian (1988-08-09)9 August 1988 (aged 25) 6 England Chelsea
20 3MF Bernard (1992-09-08)8 September 1992 (aged 21) 10 Ukraine Shakhtar Donetsk
21 4FW (1987-03-20)20 March 1987 (aged 27) 16 Brazil Atlético Mineiro
22 1GK Victor (1983-01-21)21 January 1983 (aged 31) 6 Brazil Atlético Mineiro
23 2DF Maicon (1981-07-26)26 July 1981 (aged 32) 71 Italy Roma

Entonces hice esta funcioncita para guardar todos esos datos en mis modelos

In [5]:
def parse_squad(squad, group):
    country, _ = Country.objects.get_or_create(name=pq(squad).prev().prev().prev().text())
    print "Parsing", country
    team, _ = Team.objects.get_or_create(country=country, group=group)

    for row in pq('tr', squad)[2:]:
        
        position = pq('td:eq(1)', row).text()[-2:]
        full_name = pq('td:eq(2)', row).text()
        print full_name
        url = pq('td:eq(2) a', row).attr('href')
        
        club_country, _ = Country.objects.get_or_create(name=pq('td:eq(5) span.flagicon a', pq('tr', squad)[6]).attr('title'))
        club, _ = Club.objects.get_or_create(name=pq('td:eq(5)', pq('tr', squad)[6]).text(), country=club_country)
        print club
        Player.objects.create(full_name=full_name, url=url, position=position, team=team, current_club=club)
    
        
In [6]:
for i, squad in enumerate(pq('table:not(.sortable)')[:32]):
    parse_squad(squad, "ABCDEFGH"[i / 4])
Parsing Brazil
Parsing Cameroon
Parsing Croatia
Parsing Mexico
Parsing Australia
Parsing Chile
Parsing Netherlands
Parsing Spain
Parsing Colombia
Parsing Côte d'Ivoire
Parsing Greece
Parsing Japan
Parsing Costa Rica
Parsing England
Parsing Italy
Parsing Uruguay
Parsing Ecuador
Parsing France
Parsing Honduras
Parsing Switzerland
Parsing Argentina
Parsing Bosnia and Herzegovina
Parsing Iran
Parsing Nigeria
Parsing Germany
Parsing Ghana
Parsing Portugal
Parsing United States
Parsing Algeria
Parsing Belgium
Parsing Russia
Parsing South Korea
In [7]:
Player.objects.all()
Out[7]:
[<Player: Júlio César>, <Player: Jefferson>, <Player: Victor>, <Player: Daniel Alves>, <Player: Maicon>, <Player: Thiago Silva ( captain )>, <Player: David Luiz>, <Player: Marcelo>, <Player: Dante>, <Player: Maxwell>, <Player: Henrique>, <Player: Ramires>, <Player: Oscar>, <Player: Paulinho>, <Player: Hernanes>, <Player: Luiz Gustavo>, <Player: Bernard>, <Player: Fernandinho>, <Player: Willian>, <Player: Neymar>, '...(remaining elements truncated)...']

Por suerte Wikipedia reune a muchos enfermitos como yo, y cada jugador tiene su propio artículo con una ficha más o menos estandarizada que también es fácil obtener. Por ejemplo, la del mejor jugador del planeta:

In [8]:
messi = PyQuery(Player.objects.get(full_name__contains='Messi').url)
messi.make_links_absolute()
HTML(messi('table.infobox').html())
Out[8]:
Lionel Messi Lionel Messi Player of the Year 2011.jpg
Messi playing for Barcelona at the 2011 FIFA Club World Cup Personal information Full name Lionel Andrés Messi[1] Date of birth (1987-06-24) 24 June 1987 (age 26)[1] Place of birth Rosario, Argentina[1] Height 1.69 m (5 ft 7 in)[1] Playing position Forward Club information Current club Barcelona Number 10 Youth career 1995–2000 Newell's Old Boys 2000–2003 Barcelona Senior career* Years Team Apps (Gls) 2003–2004 Barcelona C 10 (5) 2004–2005 Barcelona B 22 (6) 2004– Barcelona 276 (243) National team 2004–2005 Argentina U20 18 (14) 2007–2008 Argentina U23 5 (2) 2005– Argentina 83 (37) * Senior club appearances and goals counted for the domestic league only and correct as of 01:38, 17 May 2014 (UTC).

† Appearances (Goals).

‡ National team caps and goals correct as of 11 September 2013
In [9]:
messi('table.infobox').text()
Out[9]:
u"Lionel Messi Messi playing for Barcelona at the 2011 FIFA Club World Cup Personal information Full name Lionel Andr\xe9s Messi [ 1 ] Date of birth ( 1987-06-24 ) 24 June 1987 (age\xa026) [ 1 ] Place of birth Rosario , Argentina [ 1 ] Height 1.69\xa0m (5\xa0ft 7\xa0in) [ 1 ] Playing position Forward Club information Current club Barcelona Number 10 Youth career 1995\u20132000 Newell's Old Boys 2000\u20132003 Barcelona Senior career* Years Team Apps \u2020 (Gls) \u2020 2003\u20132004 Barcelona C 10 (5) 2004\u20132005 Barcelona B 22 (6) 2004\u2013 Barcelona 276 (243) National team \u2021 2004\u20132005 Argentina U20 18 (14) 2007\u20132008 Argentina U23 5 (2) 2005\u2013 Argentina 83 (37) Honours Competitor for Argentina Men's Football Olympic Games Gold 2008 Beijing Olympic Team Copa Am\xe9rica Runner-up 2007 Venezuela Team FIFA U-20 World Cup Winner 2005 Netherlands U-20 Team U-20 South American Championship Third 2005 Colombia U-20 Team * Senior club appearances and goals counted for the domestic league only and correct as of 01:38, 17 May 2014 (UTC). \u2020 Appearances (Goals). \u2021 National team caps and goals correct as of 11 September 2013 Lionel Messi Born Lionel Andr\xe9s Messi ( 1987-06-24 ) 24 June 1987 (age\xa026) Rosario , Santa Fe , Argentina Residence Barcelona , Catalonia , Spain Nationality Argentinian Ethnicity Argentinian & Italian Occupation Association Footballer Salary \u20ac 16\xa0million Religion Roman Catholic Spouse(s) Antonella Roccuzzo Children Thiago Messi Parents Jorge Horacio Messi (father) Celia Maria Cuccittini (mother) Relatives Maxi Biancucchi (cousin) Emanuel Biancucchi (cousin) Website Official Website"
In [10]:
import re
fecha = re.findall(r'\d{4}\-\d{2}\-\d{2}', messi('table.infobox').text())[0]
fecha
Out[10]:
u'1987-06-24'

Luego de un poquito de experimentación con expresiones regulares (no hagan esto en su casa, amigos), llegué a otra funcioncita para extraer esas fichas y completar datos de los jugadores

In [11]:
from datetime import datetime

def fill_player(player):
    # print 'Retriving data for %s (%d)' % (player, player.id)
    pq = PyQuery(player.url)
    pq.make_links_absolute()
    info = pq('table.infobox').text()
    player.date_of_birth = datetime.strptime(re.findall(r'\d{4}\-\d{2}\-\d{2}', info)[0], "%Y-%m-%d").date()
    try:
        player.height = re.findall(r'(\d{1}\.\d{2})', info)[0]
    except IndexError:
        player.height = float(re.findall(r'Height (\d{3})', info)[0])/100
    
    try:
        player.last_season_apps, player.last_season_goals = re.findall(r'(\d+) \((\d+)\) National team', info)[0]
    except:
        pass
    try: 
        player.national_team_apps, player.national_team_goals =  re.findall(r'(\d+) \((\d+)\)', info)[-1]
    except:
        pass
    player.save()
In [12]:
for player in Player.objects.exclude(url__contains='edit'):
    fill_player(player)

Y ahora sí, podemos escarbar algunos números

Cuestión de años

¿Quién es el jugador más viejo de Brasil 2014? ¿Quién el más jóven?

In [13]:
from datetime import date
viejo = Player.objects.filter(date_of_birth__isnull=False).order_by('date_of_birth')[0]
joven = Player.objects.filter(date_of_birth__isnull=False).order_by('-date_of_birth')[0]
In [14]:
today = date.today()
age = lambda player: (today - player.date_of_birth).days / 365.25 
print((viejo.full_name, viejo.team, viejo.date_of_birth, age(viejo)))
print((joven.full_name, joven.team, joven.date_of_birth, age(joven)))
(u'Faryd Mondrag\xf3n', <Team: Colombia>, datetime.date(1971, 6, 21), 42.95687885010267)
(u'Fabrice Olinga', <Team: Cameroon>, datetime.date(1996, 5, 12), 18.064339493497606)

El veterano arquero colombiano Faryd Mondragón, con casi 43 pirulos, es el jugador más viejo del mundial. Por su parte, Olinga, delantero de Camerún, es el más jóven con 18 años recién cumplidos.

También podemos hacer un grafico de las edades de las selecciones. La edad promedio, y la desviación entre el más pibe y el más jovato de cada equipo

In [15]:
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
plt.xkcd()

def team_age(team):
    players = team.player_set.filter(date_of_birth__isnull=False)
    media = sum(map(age, players)) / players.count()
    younger = age(players.order_by('-date_of_birth')[0])
    older = age(players.order_by('date_of_birth')[0])
    return np.array([media, younger, older])


teams = map(unicode, Team.objects.all())
y_pos = np.arange(len(teams)) 
data = np.vstack(map(team_age, Team.objects.all())).T
plt.figure(figsize=(5,10))
plt.xlim([16, 45])
plt.barh(y_pos, data[0], xerr=[data[0] - data[1], data[2] - data[0]], align='center', alpha=0.3)
plt.yticks(y_pos, teams)
plt.show()

Otra para la prensa cholula: ¿Qué judadores cumplen años durante el mundial?

In [16]:
from django.db.models import Q

mundial = Q()
for i in xrange(12,31):
    mundial = mundial | Q(date_of_birth__day=i, date_of_birth__month=6)
for i in xrange(1,14):
    mundial = mundial | Q(date_of_birth__day=i, date_of_birth__month=7)
    
for p in Player.objects.filter(mundial):
    print "%s de %s cumple el %d/%d" % (p, p.team, p.date_of_birth.day, p.date_of_birth.month)
Aurélien Chedjou de Cameroon cumple el 20/6
Jean-Armel Kana-Biyik de Cameroon cumple el 3/7
Dejan Lovren de Croatia cumple el 5/7
Guillermo Ochoa de Mexico cumple el 13/7
Miguel Layún de Mexico cumple el 25/6
Eugene Galeković de Australia cumple el 12/6
Matthew Špiranović de Australia cumple el 27/6
Jason Davidson de Australia cumple el 29/6
James Troisi de Australia cumple el 3/7
Ben Halloran de Australia cumple el 14/6
Cristopher Toselli de Chile cumple el 15/6
Mauricio Isla de Chile cumple el 12/6
José Rojas de Chile cumple el 23/6
Jordy Clasie de Netherlands cumple el 27/6
Alberto Moreno de Spain cumple el 5/7
Faryd Mondragón de Colombia cumple el 21/6
Fredy Guarín de Colombia cumple el 30/6
James Rodríguez de Colombia cumple el 12/7
Sayouba Mandé de Côte d'Ivoire cumple el 15/6
Cheick Tioté de Côte d'Ivoire cumple el 21/6
Orestis Karnezis de Greece cumple el 11/7
José Holebas de Greece cumple el 27/6
Kostas Manolas de Greece cumple el 14/6
Kostas Katsouranis de Greece cumple el 21/6
Andreas Samaris de Greece cumple el 13/6
Shusaku Nishikawa de Japan cumple el 18/6
Keisuke Honda de Japan cumple el 13/6
Heiner Mora de Costa Rica cumple el 20/6
Joel Campbell de Costa Rica cumple el 26/6
Frank Lampard de England cumple el 20/6
Jordan Henderson de England cumple el 17/6
Luke Shaw de England cumple el 12/7
Alberto Aquilani de Italy cumple el 7/7
Antonio Cassano de Italy cumple el 12/7
Fernando Muslera de Uruguay cumple el 16/6
Juan Carlos Paredes de Ecuador cumple el 8/7
João Rojas de Ecuador cumple el 14/6
Gökhan Inler ( captain ) de Switzerland cumple el 27/6
Hugo Campagnaro de Argentina cumple el 27/6
Éver Banega de Argentina cumple el 29/6
José Ernesto Sosa de Argentina cumple el 19/6
Lionel Messi ( Captain ) de Argentina cumple el 24/6
Asmir Begović de Bosnia and Herzegovina cumple el 20/6
Sead Kolašinac de Bosnia and Herzegovina cumple el 20/6
Srđan Stanić de Bosnia and Herzegovina cumple el 6/7
Ghasem Haddadifar de Iran cumple el 12/7
Ashkan Dejagah de Iran cumple el 5/7
Harrison Afful de Ghana cumple el 24/6
Jonathan Mensah de Ghana cumple el 13/7
Nick Rimando de United States cumple el 17/6
Geoff Cameron de United States cumple el 11/7
DeAndre Yedlin de United States cumple el 9/7
Islam Slimani de Algeria cumple el 18/6
Koen Casteels de Belgium cumple el 25/6
Kevin De Bruyne de Belgium cumple el 28/6
Vasili Berezutski de Russia cumple el 20/6
Roman Shirokov de Russia cumple el 6/7
Alan Dzagoev de Russia cumple el 17/6
Kwak Tae-Hwi de South Korea cumple el 8/7
Hwang Seok-Ho de South Korea cumple el 27/6
Son Heung-Min de South Korea cumple el 8/7
Park Chu-Young de South Korea cumple el 10/7
Lee Chung-Yong de South Korea cumple el 2/7
Kim Jin-Su de South Korea cumple el 13/6

Lungos y petisos

In [17]:
alto = Player.objects.filter(height__isnull=False).order_by('-height')[0]
petiso = Player.objects.filter(height__isnull=False).order_by('height')[0]
print "%s de %s es el jugador más alto con %.2f m" % (alto, alto.team, alto.height)
print "%s de %s es el jugador más  con %.2f m" % (petiso, petiso.team, petiso.height)
Lacina Traoré de Côte d'Ivoire es el jugador más alto con 2.03 m
Edgar Salli de Cameroon es el jugador más  con 1.63 m
In [18]:
def team_height(team):
    players = team.player_set.filter(height__isnull=False)
    media = sum([p.height for p in players]) / players.count()
    petiso = players.order_by('height')[0].height
    alto = players.order_by('-height')[0].height
    return np.array([media, petiso, alto])

data = np.vstack(map(team_height, Team.objects.all())).T
plt.figure(figsize=(5,10))
plt.barh(y_pos, data[0], xerr=[data[0] - data[1], data[2] - data[0]], align='center', alpha=0.3)
plt.xlim([1.55, 2.1])
plt.title(u'Altura promedio, maximo y minimo de las selecciones')
plt.yticks(y_pos, teams)
plt.show()

Cuestión de experiencia

In [19]:
def team_apps(team):
    players = team.player_set.filter(national_team_apps__isnull=False)
    media = sum([p.national_team_apps for p in players]) / players.count()
    nuevito = players.order_by('national_team_apps')[0].national_team_apps
    experimentado = players.order_by('-national_team_apps')[0].national_team_apps
    return np.array([media, nuevito, experimentado])

data = np.vstack(map(team_apps, Team.objects.all())).T
plt.figure(figsize=(5,10))
plt.barh(y_pos, data[0], xerr=[data[0] - data[1], data[2] - data[0]], align='center', alpha=0.3)
plt.title(u'Partidos jugados con la seleccion')
plt.yticks(y_pos, teams)
plt.show()

La temible delantera

In [20]:
def team_ataque(team):
    players = team.player_set.filter(position='FW', national_team_goals__isnull=False)
    media = sum([p.national_team_goals for p in players]) / players.count()
    funes_mori = players.order_by('national_team_goals')[0]
    messi = players.order_by('-national_team_goals')[0]
    return (np.array([media, funes_mori.national_team_goals, messi.national_team_goals]), funes_mori, messi)

rows = []
for team in Team.objects.all():
    t, funes_mori, messi = team_ataque(team)
    rows.append(t)
    print "%s. Máximo goleador: %s (%d). Más perro: %s (%d)" % (team, messi, messi.national_team_goals, funes_mori, 
                                                                funes_mori.national_team_goals) 
    
data = np.vstack(rows).T
plt.figure(figsize=(5,10))
plt.barh(y_pos, data[0], xerr=[data[0] - data[1], data[2] - data[0]], align='center', alpha=0.3)
plt.title(u'Goles de delanteros en la selección')
plt.yticks(y_pos, teams)
plt.show()
Brazil. Máximo goleador: Neymar (30). Más perro: Jô (5)
Cameroon. Máximo goleador: Samuel Eto'o (55). Más perro: Fabrice Olinga (1)
Croatia. Máximo goleador: Eduardo (29). Más perro: Ante Rebić (1)
Mexico. Máximo goleador: Javier Hernández (35). Más perro: Raúl Jiménez (4)
Australia. Máximo goleador: Tim Cahill (31). Más perro: Mathew Leckie (1)
Chile. Máximo goleador: Alexis Sánchez (22). Más perro: Fabián Orellana (2)
Netherlands. Máximo goleador: Robin van Persie (42). Más perro: Jeremain Lens (7)
Spain. Máximo goleador: Fernando Torres (36). Más perro: Diego Costa (0)
Colombia. Máximo goleador: Radamel Falcao (20). Más perro: Víctor Ibarbo (1)
Côte d'Ivoire. Máximo goleador: Didier Drogba (63). Más perro: Giovanni Sio (0)
Greece. Máximo goleador: Theofanis Gekas (24). Más perro: Giorgos Samaras (8)
Japan. Máximo goleador: Shinji Okazaki (38). Más perro: Manabu Saitō (1)
Costa Rica. Máximo goleador: Álvaro Saborío (32). Más perro: Jairo Arrieta (4)
England. Máximo goleador: Wayne Rooney (38). Más perro: Daniel Sturridge (2)
Italy. Máximo goleador: Mario Balotelli (12). Más perro: Alessio Cerci (0)
Uruguay. Máximo goleador: Luis Suárez (38). Más perro: Christian Stuani (2)
Ecuador. Máximo goleador: Felipe Caicedo (15). Más perro: Armando Wila (0)
France. Máximo goleador: Karim Benzema (19). Más perro: Loïc Rémy (4)
Honduras. Máximo goleador: Carlo Costly (30). Más perro: Rony Martínez (1)
Switzerland. Máximo goleador: Mario Gavranović (4). Más perro: Haris Seferović (1)
Argentina. Máximo goleador: Lionel Messi ( Captain ) (37). Más perro: Rodrigo Palacio (2)
Bosnia and Herzegovina. Máximo goleador: Edin Džeko (33). Más perro: Edin Višća (0)
Iran. Máximo goleador: Reza Ghoochannejhad (9). Más perro: Reza Norouzi (0)
Nigeria. Máximo goleador: Victor Obinna (12). Más perro: Michel Babatunde (0)
Germany. Máximo goleador: Miroslav Klose (68). Más perro: Kevin Volland (0)
Ghana. Máximo goleador: Asamoah Gyan (39). Más perro: Jordan Ayew (2)
Portugal. Máximo goleador: Cristiano Ronaldo ( captain ) (49). Más perro: Éder (0)
United States. Máximo goleador: Clint Dempsey (36). Más perro: Aron Jóhannsson (2)
Algeria. Máximo goleador: El Arbi Hillel Soudani (10). Más perro: Islam Slimani (1)
Belgium. Máximo goleador: Romelu Lukaku (8). Más perro: Divock Origi (0)
Russia. Máximo goleador: Aleksandr Kerzhakov (25). Más perro: Maksim Kanunnikov (0)
South Korea. Máximo goleador: Park Chu-Young (24). Más perro: Kim Shin-Wook (3)

Si termino con otras cosas urgentes (la lista es larga), haré otras cuentas y grafiquitos. Por ejemplo, se puede ver cuales són los clubes y ligas con más jugadores mundialistas, los jugadores que juegan para un país distinto a aquel en el que nacieron (por ejemplo, Gabriel Paletta, ex jugador de Boca y de la selección sub 20 argentina, juega para Italia), y etcétera.

Algo más interesante sería cruzar datos con bases de datos de juegos como el FIFA o los que trackean información de transferencias, que permitiría no sólo saber cuan cara es una selección (para que mi padre se indigne justificadamente con el "sucio negocio del fútbol" y me mande a comprar pollo en pleno partido) sino en qué condiciones llega cada selección, qué características tienen sus delanteros (los jueguitos asignan coeficientes de habilidad, velocidad, puntería, etc.) y muchísimo más.

Mientras tanto, se pueden bajar la base de datos para usar estos modelitos que yo armé sin tener que correr los scrappers que pueden tardar un rato.

Salud, y que gane Argentina, pero sobre todo, que haya muchos momentos como este:


El código de este artículo está disponible en github. ¿Encontraste un error? Por favor, enviame un pull request.

Comentarios

Comments powered by Disqus