diff --git a/Example.ipynb b/Example.ipynb index c0133d8..3ac6e14 100644 --- a/Example.ipynb +++ b/Example.ipynb @@ -4,7 +4,16 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/chenshuyao/Projects/ScraperFC/.venv/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "import ScraperFC as sfc\n", "import traceback" @@ -15,6 +24,21 @@ "execution_count": 2, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scraping 2021 EPL league table\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/chenshuyao/Projects/ScraperFC/ScraperFC/FBRef.py:216: FutureWarning: Passing literal html to 'read_html' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.\n", + " lg_table = pd.read_html(str(lg_table_html))[0]\n" + ] + }, { "data": { "text/html": [ @@ -38,7 +62,6 @@ " \n", " Rk\n", " Squad\n", - " team_id\n", " MP\n", " W\n", " D\n", @@ -47,9 +70,11 @@ " GA\n", " GD\n", " Pts\n", + " Pts/MP\n", " xG\n", " xGA\n", " xGD\n", + " xGD/90\n", " Attendance\n", " Top Team Scorer\n", " Goalkeeper\n", @@ -61,7 +86,6 @@ " 0\n", " 1\n", " Manchester City\n", - " b8fd03ef\n", " 38\n", " 27\n", " 5\n", @@ -70,19 +94,20 @@ " 32\n", " 51\n", " 86\n", - " 73.3\n", - " 31.4\n", - " 42.0\n", + " 2.26\n", + " 68.2\n", + " 30.2\n", + " 38.0\n", + " 1.00\n", " 526\n", " İlkay Gündoğan - 13\n", " Ederson\n", - " → UEFA Champions League via league finish\n", + " → Champions League via league finish\n", " \n", " \n", " 1\n", " 2\n", " Manchester Utd\n", - " 19538871\n", " 38\n", " 21\n", " 11\n", @@ -91,19 +116,20 @@ " 44\n", " 29\n", " 74\n", - " 60.2\n", - " 42.2\n", - " 18.0\n", + " 1.95\n", + " 60.1\n", + " 41.4\n", + " 18.6\n", + " 0.49\n", " 526\n", " Bruno Fernandes - 18\n", " David de Gea\n", - " → UEFA Champions League via league finish\n", + " → Champions League via league finish\n", " \n", " \n", " 2\n", " 3\n", " Liverpool\n", - " 822bd0ba\n", " 38\n", " 20\n", " 9\n", @@ -112,19 +138,20 @@ " 42\n", " 26\n", " 69\n", - " 72.6\n", - " 45.3\n", - " 27.3\n", + " 1.82\n", + " 67.5\n", + " 43.0\n", + " 24.5\n", + " 0.65\n", " 837\n", " Mohamed Salah - 22\n", " Alisson\n", - " → UEFA Champions League via league finish\n", + " → Champions League via league finish\n", " \n", " \n", " 3\n", " 4\n", " Chelsea\n", - " cff3d9bb\n", " 38\n", " 19\n", " 10\n", @@ -133,19 +160,20 @@ " 36\n", " 22\n", " 67\n", - " 64.0\n", - " 32.8\n", - " 31.2\n", + " 1.76\n", + " 62.4\n", + " 30.3\n", + " 32.1\n", + " 0.85\n", " 526\n", " Jorginho - 7\n", " Edouard Mendy\n", - " → UEFA Champions League via league finish\n", + " → Champions League via league finish\n", " \n", " \n", " 4\n", " 5\n", " Leicester City\n", - " a2d435b3\n", " 38\n", " 20\n", " 6\n", @@ -154,19 +182,20 @@ " 50\n", " 18\n", " 66\n", - " 56.0\n", - " 47.7\n", - " 8.3\n", + " 1.74\n", + " 55.8\n", + " 46.0\n", + " 9.8\n", + " 0.26\n", " 421\n", " Jamie Vardy - 15\n", " Kasper Schmeichel\n", - " → UEFA Europa League via cup win\n", + " → Europa League via cup win\n", " \n", " \n", " 5\n", " 6\n", " West Ham\n", - " 7c21e445\n", " 38\n", " 19\n", " 8\n", @@ -175,19 +204,20 @@ " 47\n", " 15\n", " 65\n", - " 53.9\n", - " 48.3\n", - " 5.6\n", + " 1.71\n", + " 55.4\n", + " 48.7\n", + " 6.7\n", + " 0.18\n", " 632\n", - " Tomáš Souček, Michail Antonio - 10\n", + " Michail Antonio, Tomáš Souček - 10\n", " Łukasz Fabiański\n", - " → UEFA Europa League via league finish\n", + " → Europa League via league finish\n", " \n", " \n", " 6\n", " 7\n", " Tottenham\n", - " 361ca564\n", " 38\n", " 18\n", " 8\n", @@ -196,19 +226,20 @@ " 45\n", " 23\n", " 62\n", - " 54.5\n", - " 49.5\n", - " 5.0\n", + " 1.63\n", + " 53.1\n", + " 49.1\n", + " 4.0\n", + " 0.10\n", " 632\n", " Harry Kane - 23\n", " Hugo Lloris\n", - " → UEFA Europa Conference League via league fin...\n", + " → Europa Conference League via league finish 1\n", " \n", " \n", " 7\n", " 8\n", " Arsenal\n", - " 18bb7c10\n", " 38\n", " 18\n", " 7\n", @@ -217,9 +248,11 @@ " 39\n", " 16\n", " 61\n", - " 53.5\n", - " 44.3\n", - " 9.2\n", + " 1.61\n", + " 51.8\n", + " 43.0\n", + " 8.8\n", + " 0.23\n", " 632\n", " Alexandre Lacazette - 13\n", " Bernd Leno\n", @@ -229,7 +262,6 @@ " 8\n", " 9\n", " Leeds United\n", - " 5bfb9659\n", " 38\n", " 18\n", " 5\n", @@ -238,9 +270,11 @@ " 54\n", " 8\n", " 59\n", - " 57.5\n", - " 62.9\n", - " -5.4\n", + " 1.55\n", + " 55.6\n", + " 57.9\n", + " -2.2\n", + " -0.06\n", " 421\n", " Patrick Bamford - 17\n", " Illan Meslier\n", @@ -250,7 +284,6 @@ " 9\n", " 10\n", " Everton\n", - " d3fd31cc\n", " 38\n", " 17\n", " 8\n", @@ -259,9 +292,11 @@ " 48\n", " -1\n", " 59\n", - " 47.2\n", - " 52.0\n", - " -4.8\n", + " 1.55\n", + " 45.7\n", + " 50.1\n", + " -4.5\n", + " -0.12\n", " 368\n", " Dominic Calvert-Lewin - 16\n", " Jordan Pickford\n", @@ -271,7 +306,6 @@ " 10\n", " 11\n", " Aston Villa\n", - " 8602292d\n", " 38\n", " 16\n", " 7\n", @@ -280,9 +314,11 @@ " 46\n", " 9\n", " 55\n", - " 52.9\n", - " 52.9\n", - " 0.1\n", + " 1.45\n", + " 52.5\n", + " 51.1\n", + " 1.4\n", + " 0.04\n", " 526\n", " Ollie Watkins - 14\n", " Emiliano Martínez\n", @@ -292,7 +328,6 @@ " 11\n", " 12\n", " Newcastle Utd\n", - " b2b47a98\n", " 38\n", " 12\n", " 9\n", @@ -301,9 +336,11 @@ " 62\n", " -16\n", " 45\n", - " 41.0\n", - " 54.0\n", - " -13.0\n", + " 1.18\n", + " 43.4\n", + " 58.3\n", + " -14.9\n", + " -0.39\n", " 526\n", " Callum Wilson - 12\n", " Karl Darlow\n", @@ -313,7 +350,6 @@ " 12\n", " 13\n", " Wolves\n", - " 8cec06e1\n", " 38\n", " 12\n", " 9\n", @@ -322,9 +358,11 @@ " 52\n", " -16\n", " 45\n", - " 39.9\n", - " 45.9\n", - " -6.0\n", + " 1.18\n", + " 36.5\n", + " 49.5\n", + " -13.0\n", + " -0.34\n", " 237\n", " Rúben Neves, Pedro Neto - 5\n", " Rui Patrício\n", @@ -334,7 +372,6 @@ " 13\n", " 14\n", " Crystal Palace\n", - " 47c64c55\n", " 38\n", " 12\n", " 8\n", @@ -343,9 +380,11 @@ " 66\n", " -25\n", " 44\n", - " 32.4\n", - " 57.5\n", - " -25.0\n", + " 1.16\n", + " 34.1\n", + " 58.2\n", + " -24.2\n", + " -0.64\n", " 447\n", " Wilfried Zaha - 11\n", " Vicente Guaita\n", @@ -355,7 +394,6 @@ " 14\n", " 15\n", " Southampton\n", - " 33c895d4\n", " 38\n", " 12\n", " 7\n", @@ -364,9 +402,11 @@ " 68\n", " -21\n", " 43\n", - " 42.4\n", - " 54.2\n", + " 1.13\n", + " 41.2\n", + " 53.1\n", " -11.8\n", + " -0.31\n", " 526\n", " Danny Ings - 12\n", " Alex McCarthy\n", @@ -376,7 +416,6 @@ " 15\n", " 16\n", " Brighton\n", - " d07537b9\n", " 38\n", " 9\n", " 14\n", @@ -385,9 +424,11 @@ " 46\n", " -6\n", " 41\n", - " 51.6\n", - " 37.7\n", - " 13.9\n", + " 1.08\n", + " 50.9\n", + " 35.3\n", + " 15.6\n", + " 0.41\n", " 523\n", " Neal Maupay - 8\n", " Robert Sánchez\n", @@ -397,7 +438,6 @@ " 16\n", " 17\n", " Burnley\n", - " 943e8050\n", " 38\n", " 10\n", " 9\n", @@ -406,9 +446,11 @@ " 55\n", " -22\n", " 39\n", - " 39.9\n", - " 57.6\n", - " -17.7\n", + " 1.03\n", + " 39.3\n", + " 54.7\n", + " -15.4\n", + " -0.40\n", " 178\n", " Chris Wood - 12\n", " Nick Pope\n", @@ -418,7 +460,6 @@ " 17\n", " 18\n", " Fulham\n", - " fd962109\n", " 38\n", " 5\n", " 13\n", @@ -427,9 +468,11 @@ " 53\n", " -26\n", " 28\n", - " 41.3\n", - " 53.0\n", - " -11.7\n", + " 0.74\n", + " 40.5\n", + " 52.6\n", + " -12.1\n", + " -0.32\n", " 211\n", " Bobby Reid - 5\n", " Alphonse Areola\n", @@ -439,7 +482,6 @@ " 18\n", " 19\n", " West Brom\n", - " 60c6b05f\n", " 38\n", " 5\n", " 11\n", @@ -448,9 +490,11 @@ " 76\n", " -41\n", " 26\n", - " 33.8\n", - " 67.7\n", - " -34.0\n", + " 0.68\n", + " 35.8\n", + " 67.9\n", + " -32.0\n", + " -0.84\n", " 283\n", " Matheus Pereira - 11\n", " Sam Johnstone\n", @@ -460,7 +504,6 @@ " 19\n", " 20\n", " Sheffield Utd\n", - " 1df6b87e\n", " 38\n", " 7\n", " 2\n", @@ -469,9 +512,11 @@ " 63\n", " -43\n", " 23\n", - " 31.4\n", - " 62.4\n", - " -31.0\n", + " 0.61\n", + " 32.6\n", + " 62.2\n", + " -29.6\n", + " -0.78\n", " 263\n", " David McGoldrick - 8\n", " Aaron Ramsdale\n", @@ -482,71 +527,71 @@ "" ], "text/plain": [ - " Rk Squad team_id MP W D L GF GA GD Pts xG \\\n", - "0 1 Manchester City b8fd03ef 38 27 5 6 83 32 51 86 73.3 \n", - "1 2 Manchester Utd 19538871 38 21 11 6 73 44 29 74 60.2 \n", - "2 3 Liverpool 822bd0ba 38 20 9 9 68 42 26 69 72.6 \n", - "3 4 Chelsea cff3d9bb 38 19 10 9 58 36 22 67 64.0 \n", - "4 5 Leicester City a2d435b3 38 20 6 12 68 50 18 66 56.0 \n", - "5 6 West Ham 7c21e445 38 19 8 11 62 47 15 65 53.9 \n", - "6 7 Tottenham 361ca564 38 18 8 12 68 45 23 62 54.5 \n", - "7 8 Arsenal 18bb7c10 38 18 7 13 55 39 16 61 53.5 \n", - "8 9 Leeds United 5bfb9659 38 18 5 15 62 54 8 59 57.5 \n", - "9 10 Everton d3fd31cc 38 17 8 13 47 48 -1 59 47.2 \n", - "10 11 Aston Villa 8602292d 38 16 7 15 55 46 9 55 52.9 \n", - "11 12 Newcastle Utd b2b47a98 38 12 9 17 46 62 -16 45 41.0 \n", - "12 13 Wolves 8cec06e1 38 12 9 17 36 52 -16 45 39.9 \n", - "13 14 Crystal Palace 47c64c55 38 12 8 18 41 66 -25 44 32.4 \n", - "14 15 Southampton 33c895d4 38 12 7 19 47 68 -21 43 42.4 \n", - "15 16 Brighton d07537b9 38 9 14 15 40 46 -6 41 51.6 \n", - "16 17 Burnley 943e8050 38 10 9 19 33 55 -22 39 39.9 \n", - "17 18 Fulham fd962109 38 5 13 20 27 53 -26 28 41.3 \n", - "18 19 West Brom 60c6b05f 38 5 11 22 35 76 -41 26 33.8 \n", - "19 20 Sheffield Utd 1df6b87e 38 7 2 29 20 63 -43 23 31.4 \n", + " Rk Squad MP W D L GF GA GD Pts Pts/MP xG xGA \\\n", + "0 1 Manchester City 38 27 5 6 83 32 51 86 2.26 68.2 30.2 \n", + "1 2 Manchester Utd 38 21 11 6 73 44 29 74 1.95 60.1 41.4 \n", + "2 3 Liverpool 38 20 9 9 68 42 26 69 1.82 67.5 43.0 \n", + "3 4 Chelsea 38 19 10 9 58 36 22 67 1.76 62.4 30.3 \n", + "4 5 Leicester City 38 20 6 12 68 50 18 66 1.74 55.8 46.0 \n", + "5 6 West Ham 38 19 8 11 62 47 15 65 1.71 55.4 48.7 \n", + "6 7 Tottenham 38 18 8 12 68 45 23 62 1.63 53.1 49.1 \n", + "7 8 Arsenal 38 18 7 13 55 39 16 61 1.61 51.8 43.0 \n", + "8 9 Leeds United 38 18 5 15 62 54 8 59 1.55 55.6 57.9 \n", + "9 10 Everton 38 17 8 13 47 48 -1 59 1.55 45.7 50.1 \n", + "10 11 Aston Villa 38 16 7 15 55 46 9 55 1.45 52.5 51.1 \n", + "11 12 Newcastle Utd 38 12 9 17 46 62 -16 45 1.18 43.4 58.3 \n", + "12 13 Wolves 38 12 9 17 36 52 -16 45 1.18 36.5 49.5 \n", + "13 14 Crystal Palace 38 12 8 18 41 66 -25 44 1.16 34.1 58.2 \n", + "14 15 Southampton 38 12 7 19 47 68 -21 43 1.13 41.2 53.1 \n", + "15 16 Brighton 38 9 14 15 40 46 -6 41 1.08 50.9 35.3 \n", + "16 17 Burnley 38 10 9 19 33 55 -22 39 1.03 39.3 54.7 \n", + "17 18 Fulham 38 5 13 20 27 53 -26 28 0.74 40.5 52.6 \n", + "18 19 West Brom 38 5 11 22 35 76 -41 26 0.68 35.8 67.9 \n", + "19 20 Sheffield Utd 38 7 2 29 20 63 -43 23 0.61 32.6 62.2 \n", "\n", - " xGA xGD Attendance Top Team Scorer \\\n", - "0 31.4 42.0 526 İlkay Gündoğan - 13 \n", - "1 42.2 18.0 526 Bruno Fernandes - 18 \n", - "2 45.3 27.3 837 Mohamed Salah - 22 \n", - "3 32.8 31.2 526 Jorginho - 7 \n", - "4 47.7 8.3 421 Jamie Vardy - 15 \n", - "5 48.3 5.6 632 Tomáš Souček, Michail Antonio - 10 \n", - "6 49.5 5.0 632 Harry Kane - 23 \n", - "7 44.3 9.2 632 Alexandre Lacazette - 13 \n", - "8 62.9 -5.4 421 Patrick Bamford - 17 \n", - "9 52.0 -4.8 368 Dominic Calvert-Lewin - 16 \n", - "10 52.9 0.1 526 Ollie Watkins - 14 \n", - "11 54.0 -13.0 526 Callum Wilson - 12 \n", - "12 45.9 -6.0 237 Rúben Neves, Pedro Neto - 5 \n", - "13 57.5 -25.0 447 Wilfried Zaha - 11 \n", - "14 54.2 -11.8 526 Danny Ings - 12 \n", - "15 37.7 13.9 523 Neal Maupay - 8 \n", - "16 57.6 -17.7 178 Chris Wood - 12 \n", - "17 53.0 -11.7 211 Bobby Reid - 5 \n", - "18 67.7 -34.0 283 Matheus Pereira - 11 \n", - "19 62.4 -31.0 263 David McGoldrick - 8 \n", + " xGD xGD/90 Attendance Top Team Scorer \\\n", + "0 38.0 1.00 526 İlkay Gündoğan - 13 \n", + "1 18.6 0.49 526 Bruno Fernandes - 18 \n", + "2 24.5 0.65 837 Mohamed Salah - 22 \n", + "3 32.1 0.85 526 Jorginho - 7 \n", + "4 9.8 0.26 421 Jamie Vardy - 15 \n", + "5 6.7 0.18 632 Michail Antonio, Tomáš Souček - 10 \n", + "6 4.0 0.10 632 Harry Kane - 23 \n", + "7 8.8 0.23 632 Alexandre Lacazette - 13 \n", + "8 -2.2 -0.06 421 Patrick Bamford - 17 \n", + "9 -4.5 -0.12 368 Dominic Calvert-Lewin - 16 \n", + "10 1.4 0.04 526 Ollie Watkins - 14 \n", + "11 -14.9 -0.39 526 Callum Wilson - 12 \n", + "12 -13.0 -0.34 237 Rúben Neves, Pedro Neto - 5 \n", + "13 -24.2 -0.64 447 Wilfried Zaha - 11 \n", + "14 -11.8 -0.31 526 Danny Ings - 12 \n", + "15 15.6 0.41 523 Neal Maupay - 8 \n", + "16 -15.4 -0.40 178 Chris Wood - 12 \n", + "17 -12.1 -0.32 211 Bobby Reid - 5 \n", + "18 -32.0 -0.84 283 Matheus Pereira - 11 \n", + "19 -29.6 -0.78 263 David McGoldrick - 8 \n", "\n", - " Goalkeeper Notes \n", - "0 Ederson → UEFA Champions League via league finish \n", - "1 David de Gea → UEFA Champions League via league finish \n", - "2 Alisson → UEFA Champions League via league finish \n", - "3 Edouard Mendy → UEFA Champions League via league finish \n", - "4 Kasper Schmeichel → UEFA Europa League via cup win \n", - "5 Łukasz Fabiański → UEFA Europa League via league finish \n", - "6 Hugo Lloris → UEFA Europa Conference League via league fin... \n", - "7 Bernd Leno NaN \n", - "8 Illan Meslier NaN \n", - "9 Jordan Pickford NaN \n", - "10 Emiliano Martínez NaN \n", - "11 Karl Darlow NaN \n", - "12 Rui Patrício NaN \n", - "13 Vicente Guaita NaN \n", - "14 Alex McCarthy NaN \n", - "15 Robert Sánchez NaN \n", - "16 Nick Pope NaN \n", - "17 Alphonse Areola Relegated \n", - "18 Sam Johnstone Relegated \n", - "19 Aaron Ramsdale Relegated " + " Goalkeeper Notes \n", + "0 Ederson → Champions League via league finish \n", + "1 David de Gea → Champions League via league finish \n", + "2 Alisson → Champions League via league finish \n", + "3 Edouard Mendy → Champions League via league finish \n", + "4 Kasper Schmeichel → Europa League via cup win \n", + "5 Łukasz Fabiański → Europa League via league finish \n", + "6 Hugo Lloris → Europa Conference League via league finish 1 \n", + "7 Bernd Leno NaN \n", + "8 Illan Meslier NaN \n", + "9 Jordan Pickford NaN \n", + "10 Emiliano Martínez NaN \n", + "11 Karl Darlow NaN \n", + "12 Rui Patrício NaN \n", + "13 Vicente Guaita NaN \n", + "14 Alex McCarthy NaN \n", + "15 Robert Sánchez NaN \n", + "16 Nick Pope NaN \n", + "17 Alphonse Areola Relegated \n", + "18 Sam Johnstone Relegated \n", + "19 Aaron Ramsdale Relegated " ] }, "execution_count": 2, @@ -571,6 +616,17 @@ "scrolled": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/var/folders/1_/ygw698t54q1fgjfvb_x00lwc0000gn/T/ipykernel_13457/849544291.py\", line 3, in \n", + " out = scraper.scrape_adv_gk(2018, 'Ligue 1', normalize=True, player=True)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + "AttributeError: 'FBRef' object has no attribute 'scrape_adv_gk'\n" + ] + }, { "data": { "text/html": [ @@ -584,1223 +640,546 @@ " vertical-align: top;\n", " }\n", "\n", - " .dataframe thead tr th {\n", - " text-align: left;\n", + " .dataframe thead th {\n", + " text-align: right;\n", " }\n", "\n", "\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
Unnamed: 0_level_0Unnamed: 1_level_0player_idUnnamed: 2_level_0Unnamed: 3_level_0Unnamed: 4_level_0Unnamed: 5_level_0Unnamed: 6_level_0Unnamed: 7_level_0Unnamed: 8_level_0...PassesGoal KicksCrossesSweeper
RkPlayerNationPosSquadAgeBorn90sMPWDLGFGA...Launch%AvgLenAttLaunch%AvgLenOppStpStp%#OPAAvgDistGDPtsPts/MPxGxGAxGDxGD/90AttendanceTop Team ScorerGoalkeeperNotes
01.0Alphonse Areola2f965a72fr FRAGKParis S-G24.01993.034.00.74...13.924.32.3531.334.48.790.718.00.910.491Manchester City382756833251862.2668.230.238.01.00526İlkay Gündoğan - 13Ederson→ Champions League via league finish
12.0Diego Benagliob7e7937dch SUIGKMonaco33.01983.02.50.00...40.033.74.8066.753.810.000.404.00.805.882Manchester Utd3821116734429741.9560.141.418.60.49526Bruno Fernandes - 18David de Gea→ Champions League via league finish
23.0Walter Benítez8a2248b4ar ARGGKNice24.01993.028.01.29...26.630.34.5475.654.411.400.615.30.210.463Liverpool382099684226691.8267.543.024.50.65837Mohamed Salah - 22Alisson→ Champions League via league finish
34.0Quentin Beunardeau15285503fr FRAGKMetz23.01994.00.45.00...87.550.75.00100.071.515.000.000.00.0032.504Chelsea3819109583622671.7662.430.332.10.85526Jorginho - 7Edouard Mendy→ Champions League via league finish
45.0Landry Bonnefoie65dd8dcfr FRAGKStrasbourg33.01983.03.02.00...59.043.18.6773.150.911.000.000.00.003.505Leicester City3820612685018661.7455.846.09.80.26421Jamie Vardy - 15Kasper Schmeichel→ Europa League via cup win
56.0Jean-Christophe Bouet96908f80fr FRAGKAmiens34.01983.01.01.00...58.348.88.00100.062.611.003.0027.30.0018.006West Ham3819811624715651.7155.448.76.70.18632Michail Antonio, Tomáš Souček - 10Łukasz Fabiański→ Europa League via league finish
67.0Ludovic Butelle26975a92fr FRAGKAngers34.01983.018.41.20...48.840.44.8489.960.69.511.1412.01.250.957Tottenham3818812684523621.6353.149.14.00.10632Harry Kane - 23Hugo Lloris→ Europa Conference League via league finish 1
78.0Yoan Cardinale950ff24dfr FRAGKNice23.01994.010.01.60...22.827.04.2083.357.69.500.303.20.301.438Arsenal3818713553916611.6151.843.08.80.23632Alexandre Lacazette - 13Bernd LenoNaN
89.0Benoît Costil2434f24afr FRAGKBordeaux30.01987.036.01.25...48.542.64.9489.965.59.470.788.20.560.409Leeds United381851562548591.5555.657.9-2.2-0.06421Patrick Bamford - 17Illan MeslierNaN
910.0Abdoulaye Diallo26383ea5sn SENGKRennes25.01992.03.01.67...37.736.24.00100.064.26.331.0015.80.676.3010Everton38178134748-1591.5545.750.1-4.5-0.12368Dominic Calvert-Lewin - 16Jordan PickfordNaN
1011.0Thomas Didillona3d524cbfr FRAGKMetz21.01995.09.01.56...48.740.75.1193.560.914.001.4410.30.331.5111Aston Villa381671555469551.4552.551.11.40.04526Ollie Watkins - 14Emiliano MartínezNaN
1112.0Maxime Dupé0e12089dfr FRAGKNantes24.01993.01.03.00...62.546.98.00100.065.413.002.0015.41.0013.8012Newcastle Utd38129174662-16451.1843.458.3-14.9-0.39526Callum Wilson - 12Karl DarlowNaN
1213.0Mathieu Gorgelin4d3e9033fr FRAGKLyon26.01990.04.01.50...35.238.42.2555.650.311.001.5013.60.503.6013Wolves38129173652-16451.1836.549.5-13.0-0.34237Rúben Neves, Pedro Neto - 5Rui PatrícioNaN
1314.0Régis Gurtnerbc270726fr FRAGKAmiens30.01986.037.01.11...62.547.27.2797.865.612.800.977.60.570.4014Crystal Palace38128184166-25441.1634.158.2-24.2-0.64447Wilfried Zaha - 11Vicente GuaitaNaN
1415.0Karl-Johan Johnssona56bd2eese SWEGKGuingamp27.01990.038.01.55...52.243.65.5087.665.510.401.039.90.420.4015Southampton38127194768-21431.1341.253.1-11.8-0.31526Danny Ings - 12Alex McCarthyNaN
1516.0Bingourou Kamara3814120dsn SENGKStrasbourg20.01996.018.81.70...46.140.15.3787.161.411.301.129.90.320.6216Brighton38914154046-6411.0850.935.315.60.41523Neal Maupay - 8Robert SánchezNaN
1617.0Eiji Kawashimaa4527d33jp JPNGKMetz34.01983.028.62.10...57.345.25.5294.367.39.580.666.90.840.5517Burnley38109193355-22391.0339.354.7-15.4-0.40178Chris Wood - 12Nick PopeNaN
1718.0Hervé Koffifaf873a7bf BFAGKLille20.01996.04.02.75...43.040.33.5078.663.912.301.2510.21.253.6718Fulham38513202753-26280.7440.552.6-12.1-0.32211Bobby Reid - 5Alphonse AreolaRelegated
1819.0Tomáš Koubekdc366c36cz CZEGKRennes24.01992.034.01.06...57.146.14.9188.665.110.201.0610.40.970.5019West Brom38511223576-41260.6835.867.9-32.0-0.84283Matheus Pereira - 11Sam JohnstoneRelegated
1920.0Alban Lafont4e7db402fr FRAGKToulouse18.01999.038.01.42...55.044.35.4286.961.511.801.089.21.160.45
2021.0Benjamin Lecomte2fa2a875fr FRAGKMontpellier26.01991.038.00.87...52.041.44.2470.851.88.841.2113.70.470.42
2122.0Alexandre Letellier96fcd380fr FRAGKAngers26.01990.013.01.31...53.343.94.54100.072.110.200.696.80.461.27
2223.0Anthony Lopesf00de885pt PORGKLyon26.01990.034.01.09...31.834.43.6253.748.510.700.857.90.530.44
2324.0Raïs M'Bolhic121a641dz ALGGKRennes31.01986.01.03.00...66.750.52.00100.070.09.003.0033.31.0027.50
2425.0Mike Maignanfcb38f57fr FRAGKLille21.01995.033.71.57...26.030.84.1869.556.88.930.9811.00.950.49
2526.0Steve Mandanda1d2d5cc8fr FRAGKMarseille32.01985.029.81.24...42.337.83.6269.452.58.120.819.90.340.47
2627.0Mathieu Michele39f8724fr FRAGKAngers25.01991.06.61.97...48.540.15.1588.261.38.940.151.70.302.42
2728.0Jessy Moulin28a65a2cfr FRAGKSaint-Étienne31.01986.03.41.76...47.341.77.06100.069.613.801.7612.80.003.12
2829.0Alexandre Oukidjaae7d0ecddz ALGGKStrasbourg29.01988.016.21.79...65.248.06.3093.167.39.630.9910.30.430.86
2930.0Yohann Pelé76806215fr FRAGKMarseille34.01982.08.21.22...37.634.84.2777.156.28.410.495.80.851.98
3031.0Jérôme Prior1061c207fr FRAGKBordeaux21.01995.02.01.50...55.039.82.5080.055.810.500.504.80.507.05
3132.0Baptiste Reynetbcf1b2e9fr FRAGKDijon26.01990.038.01.92...45.840.24.7967.052.611.701.2410.51.260.44
3233.0Stéphane Ruffiercac76a72fr FRAGKSaint-Étienne30.01986.034.61.27...46.838.64.3679.553.110.400.928.90.430.42
3334.0Mamadou Samassacfe852d8ml MLIGKTroyes27.01990.021.01.48...53.243.95.6797.565.512.801.108.60.520.74
3435.0Brice Samba60d90c55cg CGOGKCaen23.01994.03.51.14...57.145.36.8683.362.36.000.000.00.293.26
3536.0Danijel Subašićf6db3bd5hr CROGKMonaco32.01984.032.71.25...50.742.84.2866.453.710.900.928.40.640.48
3637.0Seydou Sy8417953bsn SENGKMonaco21.01995.02.81.43...45.838.09.6492.659.614.301.7912.50.003.89
3738.0Ciprian Tătărușanub056e3daro ROUGKNantes31.01986.037.01.03...46.940.75.5989.964.611.501.3511.80.350.37
3839.0Kevin Trappce17b5ebde GERGKParis S-G27.01990.04.01.00...10.921.51.250.021.412.000.756.30.003.08
3940.0Rémy Vercoutre1d0900d4fr FRAGKCaen37.01980.034.51.39...68.750.55.1095.564.610.400.969.20.490.42
4041.0Erwin Zelaznye750cba4fr FRAGKTroyes25.01991.017.01.65...55.644.87.4196.065.413.201.4110.70.530.8920Sheffield Utd3872292063-43230.6132.662.2-29.6-0.78263David McGoldrick - 8Aaron RamsdaleRelegated
\n", - "

41 rows × 32 columns

\n", "" ], "text/plain": [ - " Unnamed: 0_level_0 Unnamed: 1_level_0 player_id Unnamed: 2_level_0 \\\n", - " Rk Player Nation \n", - "0 1.0 Alphonse Areola 2f965a72 fr FRA \n", - "1 2.0 Diego Benaglio b7e7937d ch SUI \n", - "2 3.0 Walter Benítez 8a2248b4 ar ARG \n", - "3 4.0 Quentin Beunardeau 15285503 fr FRA \n", - "4 5.0 Landry Bonnefoi e65dd8dc fr FRA \n", - "5 6.0 Jean-Christophe Bouet 96908f80 fr FRA \n", - "6 7.0 Ludovic Butelle 26975a92 fr FRA \n", - "7 8.0 Yoan Cardinale 950ff24d fr FRA \n", - "8 9.0 Benoît Costil 2434f24a fr FRA \n", - "9 10.0 Abdoulaye Diallo 26383ea5 sn SEN \n", - "10 11.0 Thomas Didillon a3d524cb fr FRA \n", - "11 12.0 Maxime Dupé 0e12089d fr FRA \n", - "12 13.0 Mathieu Gorgelin 4d3e9033 fr FRA \n", - "13 14.0 Régis Gurtner bc270726 fr FRA \n", - "14 15.0 Karl-Johan Johnsson a56bd2ee se SWE \n", - "15 16.0 Bingourou Kamara 3814120d sn SEN \n", - "16 17.0 Eiji Kawashima a4527d33 jp JPN \n", - "17 18.0 Hervé Koffi faf873a7 bf BFA \n", - "18 19.0 Tomáš Koubek dc366c36 cz CZE \n", - "19 20.0 Alban Lafont 4e7db402 fr FRA \n", - "20 21.0 Benjamin Lecomte 2fa2a875 fr FRA \n", - "21 22.0 Alexandre Letellier 96fcd380 fr FRA \n", - "22 23.0 Anthony Lopes f00de885 pt POR \n", - "23 24.0 Raïs M'Bolhi c121a641 dz ALG \n", - "24 25.0 Mike Maignan fcb38f57 fr FRA \n", - "25 26.0 Steve Mandanda 1d2d5cc8 fr FRA \n", - "26 27.0 Mathieu Michel e39f8724 fr FRA \n", - "27 28.0 Jessy Moulin 28a65a2c fr FRA \n", - "28 29.0 Alexandre Oukidja ae7d0ecd dz ALG \n", - "29 30.0 Yohann Pelé 76806215 fr FRA \n", - "30 31.0 Jérôme Prior 1061c207 fr FRA \n", - "31 32.0 Baptiste Reynet bcf1b2e9 fr FRA \n", - "32 33.0 Stéphane Ruffier cac76a72 fr FRA \n", - "33 34.0 Mamadou Samassa cfe852d8 ml MLI \n", - "34 35.0 Brice Samba 60d90c55 cg CGO \n", - "35 36.0 Danijel Subašić f6db3bd5 hr CRO \n", - "36 37.0 Seydou Sy 8417953b sn SEN \n", - "37 38.0 Ciprian Tătărușanu b056e3da ro ROU \n", - "38 39.0 Kevin Trapp ce17b5eb de GER \n", - "39 40.0 Rémy Vercoutre 1d0900d4 fr FRA \n", - "40 41.0 Erwin Zelazny e750cba4 fr FRA \n", - "\n", - " Unnamed: 3_level_0 Unnamed: 4_level_0 Unnamed: 5_level_0 \\\n", - " Pos Squad Age \n", - "0 GK Paris S-G 24.0 \n", - "1 GK Monaco 33.0 \n", - "2 GK Nice 24.0 \n", - "3 GK Metz 23.0 \n", - "4 GK Strasbourg 33.0 \n", - "5 GK Amiens 34.0 \n", - "6 GK Angers 34.0 \n", - "7 GK Nice 23.0 \n", - "8 GK Bordeaux 30.0 \n", - "9 GK Rennes 25.0 \n", - "10 GK Metz 21.0 \n", - "11 GK Nantes 24.0 \n", - "12 GK Lyon 26.0 \n", - "13 GK Amiens 30.0 \n", - "14 GK Guingamp 27.0 \n", - "15 GK Strasbourg 20.0 \n", - "16 GK Metz 34.0 \n", - "17 GK Lille 20.0 \n", - "18 GK Rennes 24.0 \n", - "19 GK Toulouse 18.0 \n", - "20 GK Montpellier 26.0 \n", - "21 GK Angers 26.0 \n", - "22 GK Lyon 26.0 \n", - "23 GK Rennes 31.0 \n", - "24 GK Lille 21.0 \n", - "25 GK Marseille 32.0 \n", - "26 GK Angers 25.0 \n", - "27 GK Saint-Étienne 31.0 \n", - "28 GK Strasbourg 29.0 \n", - "29 GK Marseille 34.0 \n", - "30 GK Bordeaux 21.0 \n", - "31 GK Dijon 26.0 \n", - "32 GK Saint-Étienne 30.0 \n", - "33 GK Troyes 27.0 \n", - "34 GK Caen 23.0 \n", - "35 GK Monaco 32.0 \n", - "36 GK Monaco 21.0 \n", - "37 GK Nantes 31.0 \n", - "38 GK Paris S-G 27.0 \n", - "39 GK Caen 37.0 \n", - "40 GK Troyes 25.0 \n", - "\n", - " Unnamed: 6_level_0 Unnamed: 7_level_0 Unnamed: 8_level_0 ... Passes \\\n", - " Born 90s GA ... Launch% \n", - "0 1993.0 34.0 0.74 ... 13.9 \n", - "1 1983.0 2.5 0.00 ... 40.0 \n", - "2 1993.0 28.0 1.29 ... 26.6 \n", - "3 1994.0 0.4 5.00 ... 87.5 \n", - "4 1983.0 3.0 2.00 ... 59.0 \n", - "5 1983.0 1.0 1.00 ... 58.3 \n", - "6 1983.0 18.4 1.20 ... 48.8 \n", - "7 1994.0 10.0 1.60 ... 22.8 \n", - "8 1987.0 36.0 1.25 ... 48.5 \n", - "9 1992.0 3.0 1.67 ... 37.7 \n", - "10 1995.0 9.0 1.56 ... 48.7 \n", - "11 1993.0 1.0 3.00 ... 62.5 \n", - "12 1990.0 4.0 1.50 ... 35.2 \n", - "13 1986.0 37.0 1.11 ... 62.5 \n", - "14 1990.0 38.0 1.55 ... 52.2 \n", - "15 1996.0 18.8 1.70 ... 46.1 \n", - "16 1983.0 28.6 2.10 ... 57.3 \n", - "17 1996.0 4.0 2.75 ... 43.0 \n", - "18 1992.0 34.0 1.06 ... 57.1 \n", - "19 1999.0 38.0 1.42 ... 55.0 \n", - "20 1991.0 38.0 0.87 ... 52.0 \n", - "21 1990.0 13.0 1.31 ... 53.3 \n", - "22 1990.0 34.0 1.09 ... 31.8 \n", - "23 1986.0 1.0 3.00 ... 66.7 \n", - "24 1995.0 33.7 1.57 ... 26.0 \n", - "25 1985.0 29.8 1.24 ... 42.3 \n", - "26 1991.0 6.6 1.97 ... 48.5 \n", - "27 1986.0 3.4 1.76 ... 47.3 \n", - "28 1988.0 16.2 1.79 ... 65.2 \n", - "29 1982.0 8.2 1.22 ... 37.6 \n", - "30 1995.0 2.0 1.50 ... 55.0 \n", - "31 1990.0 38.0 1.92 ... 45.8 \n", - "32 1986.0 34.6 1.27 ... 46.8 \n", - "33 1990.0 21.0 1.48 ... 53.2 \n", - "34 1994.0 3.5 1.14 ... 57.1 \n", - "35 1984.0 32.7 1.25 ... 50.7 \n", - "36 1995.0 2.8 1.43 ... 45.8 \n", - "37 1986.0 37.0 1.03 ... 46.9 \n", - "38 1990.0 4.0 1.00 ... 10.9 \n", - "39 1980.0 34.5 1.39 ... 68.7 \n", - "40 1991.0 17.0 1.65 ... 55.6 \n", + " Rk Squad MP W D L GF GA GD Pts Pts/MP xG xGA \\\n", + "0 1 Manchester City 38 27 5 6 83 32 51 86 2.26 68.2 30.2 \n", + "1 2 Manchester Utd 38 21 11 6 73 44 29 74 1.95 60.1 41.4 \n", + "2 3 Liverpool 38 20 9 9 68 42 26 69 1.82 67.5 43.0 \n", + "3 4 Chelsea 38 19 10 9 58 36 22 67 1.76 62.4 30.3 \n", + "4 5 Leicester City 38 20 6 12 68 50 18 66 1.74 55.8 46.0 \n", + "5 6 West Ham 38 19 8 11 62 47 15 65 1.71 55.4 48.7 \n", + "6 7 Tottenham 38 18 8 12 68 45 23 62 1.63 53.1 49.1 \n", + "7 8 Arsenal 38 18 7 13 55 39 16 61 1.61 51.8 43.0 \n", + "8 9 Leeds United 38 18 5 15 62 54 8 59 1.55 55.6 57.9 \n", + "9 10 Everton 38 17 8 13 47 48 -1 59 1.55 45.7 50.1 \n", + "10 11 Aston Villa 38 16 7 15 55 46 9 55 1.45 52.5 51.1 \n", + "11 12 Newcastle Utd 38 12 9 17 46 62 -16 45 1.18 43.4 58.3 \n", + "12 13 Wolves 38 12 9 17 36 52 -16 45 1.18 36.5 49.5 \n", + "13 14 Crystal Palace 38 12 8 18 41 66 -25 44 1.16 34.1 58.2 \n", + "14 15 Southampton 38 12 7 19 47 68 -21 43 1.13 41.2 53.1 \n", + "15 16 Brighton 38 9 14 15 40 46 -6 41 1.08 50.9 35.3 \n", + "16 17 Burnley 38 10 9 19 33 55 -22 39 1.03 39.3 54.7 \n", + "17 18 Fulham 38 5 13 20 27 53 -26 28 0.74 40.5 52.6 \n", + "18 19 West Brom 38 5 11 22 35 76 -41 26 0.68 35.8 67.9 \n", + "19 20 Sheffield Utd 38 7 2 29 20 63 -43 23 0.61 32.6 62.2 \n", "\n", - " Goal Kicks Crosses Sweeper \n", - " AvgLen Att Launch% AvgLen Opp Stp Stp% #OPA AvgDist \n", - "0 24.3 2.35 31.3 34.4 8.79 0.71 8.0 0.91 0.49 \n", - "1 33.7 4.80 66.7 53.8 10.00 0.40 4.0 0.80 5.88 \n", - "2 30.3 4.54 75.6 54.4 11.40 0.61 5.3 0.21 0.46 \n", - "3 50.7 5.00 100.0 71.5 15.00 0.00 0.0 0.00 32.50 \n", - "4 43.1 8.67 73.1 50.9 11.00 0.00 0.0 0.00 3.50 \n", - "5 48.8 8.00 100.0 62.6 11.00 3.00 27.3 0.00 18.00 \n", - "6 40.4 4.84 89.9 60.6 9.51 1.14 12.0 1.25 0.95 \n", - "7 27.0 4.20 83.3 57.6 9.50 0.30 3.2 0.30 1.43 \n", - "8 42.6 4.94 89.9 65.5 9.47 0.78 8.2 0.56 0.40 \n", - "9 36.2 4.00 100.0 64.2 6.33 1.00 15.8 0.67 6.30 \n", - "10 40.7 5.11 93.5 60.9 14.00 1.44 10.3 0.33 1.51 \n", - "11 46.9 8.00 100.0 65.4 13.00 2.00 15.4 1.00 13.80 \n", - "12 38.4 2.25 55.6 50.3 11.00 1.50 13.6 0.50 3.60 \n", - "13 47.2 7.27 97.8 65.6 12.80 0.97 7.6 0.57 0.40 \n", - "14 43.6 5.50 87.6 65.5 10.40 1.03 9.9 0.42 0.40 \n", - "15 40.1 5.37 87.1 61.4 11.30 1.12 9.9 0.32 0.62 \n", - "16 45.2 5.52 94.3 67.3 9.58 0.66 6.9 0.84 0.55 \n", - "17 40.3 3.50 78.6 63.9 12.30 1.25 10.2 1.25 3.67 \n", - "18 46.1 4.91 88.6 65.1 10.20 1.06 10.4 0.97 0.50 \n", - "19 44.3 5.42 86.9 61.5 11.80 1.08 9.2 1.16 0.45 \n", - "20 41.4 4.24 70.8 51.8 8.84 1.21 13.7 0.47 0.42 \n", - "21 43.9 4.54 100.0 72.1 10.20 0.69 6.8 0.46 1.27 \n", - "22 34.4 3.62 53.7 48.5 10.70 0.85 7.9 0.53 0.44 \n", - "23 50.5 2.00 100.0 70.0 9.00 3.00 33.3 1.00 27.50 \n", - "24 30.8 4.18 69.5 56.8 8.93 0.98 11.0 0.95 0.49 \n", - "25 37.8 3.62 69.4 52.5 8.12 0.81 9.9 0.34 0.47 \n", - "26 40.1 5.15 88.2 61.3 8.94 0.15 1.7 0.30 2.42 \n", - "27 41.7 7.06 100.0 69.6 13.80 1.76 12.8 0.00 3.12 \n", - "28 48.0 6.30 93.1 67.3 9.63 0.99 10.3 0.43 0.86 \n", - "29 34.8 4.27 77.1 56.2 8.41 0.49 5.8 0.85 1.98 \n", - "30 39.8 2.50 80.0 55.8 10.50 0.50 4.8 0.50 7.05 \n", - "31 40.2 4.79 67.0 52.6 11.70 1.24 10.5 1.26 0.44 \n", - "32 38.6 4.36 79.5 53.1 10.40 0.92 8.9 0.43 0.42 \n", - "33 43.9 5.67 97.5 65.5 12.80 1.10 8.6 0.52 0.74 \n", - "34 45.3 6.86 83.3 62.3 6.00 0.00 0.0 0.29 3.26 \n", - "35 42.8 4.28 66.4 53.7 10.90 0.92 8.4 0.64 0.48 \n", - "36 38.0 9.64 92.6 59.6 14.30 1.79 12.5 0.00 3.89 \n", - "37 40.7 5.59 89.9 64.6 11.50 1.35 11.8 0.35 0.37 \n", - "38 21.5 1.25 0.0 21.4 12.00 0.75 6.3 0.00 3.08 \n", - "39 50.5 5.10 95.5 64.6 10.40 0.96 9.2 0.49 0.42 \n", - "40 44.8 7.41 96.0 65.4 13.20 1.41 10.7 0.53 0.89 \n", + " xGD xGD/90 Attendance Top Team Scorer \\\n", + "0 38.0 1.00 526 İlkay Gündoğan - 13 \n", + "1 18.6 0.49 526 Bruno Fernandes - 18 \n", + "2 24.5 0.65 837 Mohamed Salah - 22 \n", + "3 32.1 0.85 526 Jorginho - 7 \n", + "4 9.8 0.26 421 Jamie Vardy - 15 \n", + "5 6.7 0.18 632 Michail Antonio, Tomáš Souček - 10 \n", + "6 4.0 0.10 632 Harry Kane - 23 \n", + "7 8.8 0.23 632 Alexandre Lacazette - 13 \n", + "8 -2.2 -0.06 421 Patrick Bamford - 17 \n", + "9 -4.5 -0.12 368 Dominic Calvert-Lewin - 16 \n", + "10 1.4 0.04 526 Ollie Watkins - 14 \n", + "11 -14.9 -0.39 526 Callum Wilson - 12 \n", + "12 -13.0 -0.34 237 Rúben Neves, Pedro Neto - 5 \n", + "13 -24.2 -0.64 447 Wilfried Zaha - 11 \n", + "14 -11.8 -0.31 526 Danny Ings - 12 \n", + "15 15.6 0.41 523 Neal Maupay - 8 \n", + "16 -15.4 -0.40 178 Chris Wood - 12 \n", + "17 -12.1 -0.32 211 Bobby Reid - 5 \n", + "18 -32.0 -0.84 283 Matheus Pereira - 11 \n", + "19 -29.6 -0.78 263 David McGoldrick - 8 \n", "\n", - "[41 rows x 32 columns]" + " Goalkeeper Notes \n", + "0 Ederson → Champions League via league finish \n", + "1 David de Gea → Champions League via league finish \n", + "2 Alisson → Champions League via league finish \n", + "3 Edouard Mendy → Champions League via league finish \n", + "4 Kasper Schmeichel → Europa League via cup win \n", + "5 Łukasz Fabiański → Europa League via league finish \n", + "6 Hugo Lloris → Europa Conference League via league finish 1 \n", + "7 Bernd Leno NaN \n", + "8 Illan Meslier NaN \n", + "9 Jordan Pickford NaN \n", + "10 Emiliano Martínez NaN \n", + "11 Karl Darlow NaN \n", + "12 Rui Patrício NaN \n", + "13 Vicente Guaita NaN \n", + "14 Alex McCarthy NaN \n", + "15 Robert Sánchez NaN \n", + "16 Nick Pope NaN \n", + "17 Alphonse Areola Relegated \n", + "18 Sam Johnstone Relegated \n", + "19 Aaron Ramsdale Relegated " ] }, "execution_count": 3, @@ -2390,7 +1769,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.3" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/ScraperFC/Transfermarkt.py b/ScraperFC/Transfermarkt.py index b1c1278..5c2a5e0 100644 --- a/ScraperFC/Transfermarkt.py +++ b/ScraperFC/Transfermarkt.py @@ -24,6 +24,8 @@ def __init__(self): # Deal with Accept All popup self.driver.get('https://www.transfermarkt.us') + # Define a default header for Requests + self._HEADERS = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'} # Switch to the iframe popup soup = BeautifulSoup(self.driver.page_source, 'html.parser') iframe = self.driver.find_element( @@ -35,7 +37,7 @@ def __init__(self): soup = BeautifulSoup(self.driver.page_source, 'html.parser') accept_all_button = self.driver.find_element( By.XPATH, - xpath_soup(soup.find('button', {'aria-label': 'ACCEPT ALL'})) + xpath_soup(soup.find('button', {'aria-label': 'Accept and Continue'})) ) self.driver.execute_script('arguments[0].click()', accept_all_button) # Switch back to the main window @@ -198,6 +200,150 @@ def get_players(self, year, league): df = pd.concat([df, new_row.to_frame().T], axis=0, ignore_index=True) return df + + ############################################################################ + def team_transfer_history(self, URL): + response = requests.get(URL, headers=self._HEADERS) + soup = BeautifulSoup(response.content, 'html.parser') + + dfs = [] # To store individual dataframes + + # Get the club name + observe_club = soup.find(class_='data-header__headline-container').get_text(strip=True) + # Loop through each 'large-6' div and then find 'box' inside + for large_div in soup.find_all('div', class_='large-6'): + for box in large_div.find_all('div', class_='box'): + + # Extract content from 'content-box-headline' and split it + header = box.find('h2', class_='content-box-headline').text.strip().split(' ') + arrival_departure, season = header[0], header[1] + table = box.find('table') + if not table: + continue + + # Extract table data + try: + rows = box.find('table').find_all('tr') + table_data = [] + for row in rows[1:]: # Skip the header + columns = row.find_all('td') + player_data = [col.text.strip() for col in columns] + if len(player_data)>1: + player_data.pop(1) + table_data.append(player_data) + + # Extract column headers; this assumes that the first 'tr' contains the header + headers = [header.text.strip() for header in rows[0].find_all('th')] + + # Convert to DataFrame + df = pd.DataFrame(table_data[0:len(table_data)-2], columns=headers) + df['Arrival/Departure'] = arrival_departure + df['Season'] = season + df['Observe Club'] = observe_club + + dfs.append(df) + + except ValueError as e: + pass + final_df = pd.concat(dfs, ignore_index=True) + return final_df + + + ############################################################################ + @staticmethod + def transfer_value_extract(v): + v = v[v.find("€")+1:] + if v[-1] == "m": + return float(v[:-1]) * 1000000 + elif v[-1] == "k": + return float(v[:-1]) * 1000 + else: + return float(v[:-1].replace(" ", "")) + + + ############################################################################ + @staticmethod + def find_all_transfer_url(url): + return url.replace("startseite", "alletransfers").split('saison_id')[0] + + + ############################################################################ + def raw_league_transfer_history(self, year, league): + club_links = [self.find_all_transfer_url(x) for x in self.get_club_links(year, league)] + dfs = [] + for URL in club_links: + df = self.team_transfer_history(URL) + dfs.append(df) + final_df = pd.concat(dfs, ignore_index=True) + return final_df + + + ############################################################################ + def format_transfer_history(self, history): + Type = [] + Value = [] + for v in history["Transfer sum"].values: + if "Loan fee" in v: + Type.append("Loan") + Value.append(self.transfer_value_extract(v)) + elif "free transfer" in v: + Type.append("Transfer") + Value.append(0) + elif "?" in v: + Type.append("Unknown") + Value.append(0) + elif "-" in v: + Type.append("Transfer") + Value.append(0) + elif "End of loan" in v: + Type.append("End of Loan") + Value.append(0) + elif "loan transfer" in v: + Type.append("Loan") + Value.append(0) + elif v == "": + Type.append("Unknown") + Value.append(0) + elif "draft" in v: + Type.append("Transfer") + Value.append(0) + else: + Type.append("Transfer") + Value.append(self.transfer_value_extract(v)) + history["Type"] = Type + history["Value"] = Value + return history + + ############################################################################ + def get_league_transfer_history(self, year, league): + """ + Gathers and formats transfer history for a specified football league and given season. + This method consolidates individual team transfer data into a league-wide perspective, + providing insights into player movements, types of transfers, and transfer values. + + Args + ---- + year : int + This parameter helps identify the relevant season of league. + The year in which the football season ends. + For instance, for the 2022/23 season, the year would be 2023. + league : str + The name of the football league from which transfer data is to be extracted. + The available leagues can be found in 'shared_functions.py', and this parameter + specifies which league's transfer data is to be analyzed. + + Returns + ------- + : Pandas DataFrame + A DataFrame containing detailed transfer information for each player in the specified league + and season. Each row corresponds to a player, encompassing data such as transfer type, + transfer value, and other relevant details extracted from their Transfermarkt player profile. + This structured format facilitates further analysis of transfer trends and patterns in the league. + """ + history = self.raw_league_transfer_history(year, league) + return self.format_transfer_history(history) + + ################################################################################ class TransfermarktPlayer(): @@ -293,4 +439,5 @@ def __init__(self, url): ).drop( columns=[''] ) + \ No newline at end of file diff --git a/tests/dev_testing.ipynb b/tests/dev_testing.ipynb index 2729376..fd855b7 100644 --- a/tests/dev_testing.ipynb +++ b/tests/dev_testing.ipynb @@ -14,7 +14,23 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done importing.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/chenshuyao/Projects/ScraperFC/.venv/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "import sys\n", "sys.path.append(\"..\")\n", @@ -34,48 +50,29 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'45.173.6.5:999'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "sfc.get_proxy()" + "# sfc.get_proxy()" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Gathering player links.\n", - "Gathering club links.\n", - "Gathering club links.\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "Gathering player links: 100%|██████████████████████████████████████████████████████████| 18/18 [12:16<00:00, 40.91s/it]\n", - "Gathering player https://www.transfermarkt.us/thierry-lutonda/profil/spieler/416802: 100%|█| 655/655 [08:59<00:00, 1.2\n" + "Gathering player links: 100%|██████████| 18/18 [10:24<00:00, 34.71s/it]\n", + "Scraping player https://www.transfermarkt.us/laurent-jans/profil/spieler/163724: 100%|██████████| 655/655 [14:43<00:00, 1.35s/it] \n" ] } ], "source": [ + "\n", "tm = sfc.Transfermarkt()\n", "try:\n", " x = tm.get_players(2022, \"Eredivisie\")\n", @@ -441,6 +438,190 @@ "source": [ "x" ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['https://www.transfermarkt.us/fc-sevilla/startseite/verein/368/saison_id/2022',\n", + " 'https://www.transfermarkt.us/rayo-vallecano/startseite/verein/367/saison_id/2022',\n", + " 'https://www.transfermarkt.us/fc-villarreal/startseite/verein/1050/saison_id/2022',\n", + " 'https://www.transfermarkt.us/rcd-mallorca/startseite/verein/237/saison_id/2022',\n", + " 'https://www.transfermarkt.us/fc-cadiz/startseite/verein/2687/saison_id/2022',\n", + " 'https://www.transfermarkt.us/fc-valencia/startseite/verein/1049/saison_id/2022',\n", + " 'https://www.transfermarkt.us/espanyol-barcelona/startseite/verein/714/saison_id/2022',\n", + " 'https://www.transfermarkt.us/real-sociedad-san-sebastian/startseite/verein/681/saison_id/2022',\n", + " 'https://www.transfermarkt.us/atletico-madrid/startseite/verein/13/saison_id/2022',\n", + " 'https://www.transfermarkt.us/ud-almeria/startseite/verein/3302/saison_id/2022',\n", + " 'https://www.transfermarkt.us/real-betis-sevilla/startseite/verein/150/saison_id/2022',\n", + " 'https://www.transfermarkt.us/fc-getafe/startseite/verein/3709/saison_id/2022',\n", + " 'https://www.transfermarkt.us/ca-osasuna/startseite/verein/331/saison_id/2022',\n", + " 'https://www.transfermarkt.us/real-valladolid/startseite/verein/366/saison_id/2022',\n", + " 'https://www.transfermarkt.us/athletic-bilbao/startseite/verein/621/saison_id/2022',\n", + " 'https://www.transfermarkt.us/fc-girona/startseite/verein/12321/saison_id/2022',\n", + " 'https://www.transfermarkt.us/real-madrid/startseite/verein/418/saison_id/2022',\n", + " 'https://www.transfermarkt.us/fc-elche/startseite/verein/1531/saison_id/2022',\n", + " 'https://www.transfermarkt.us/celta-vigo/startseite/verein/940/saison_id/2022',\n", + " 'https://www.transfermarkt.us/fc-barcelona/startseite/verein/131/saison_id/2022']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tm = sfc.Transfermarkt()\n", + "try:\n", + " cl = tm.get_club_links(2023, \"La Liga\")\n", + "except:\n", + " traceback.print_exc()\n", + "finally:\n", + " tm.close()\n", + "\n", + "cl" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PlayersClubTransfer sumArrival/DepartureSeasonObserve ClubTypeValue
0Cenk ÖzkacarOlympique Lyon€5.00mArrivals23/24Valencia CFTransfer5000000.0
1PepeluLevante€5.00mArrivals23/24Valencia CFTransfer5000000.0
2Sergi CanósBrentford€250kArrivals23/24Valencia CFTransfer250000.0
3Selim AmallahReal ValladolidLoan fee:€150kArrivals23/24Valencia CFLoan150000.0
4Roman YaremchukClub Bruggeloan transferArrivals23/24Valencia CFLoan0.0
\n", + "
" + ], + "text/plain": [ + " Players Club Transfer sum Arrival/Departure Season \\\n", + "0 Cenk Özkacar Olympique Lyon €5.00m Arrivals 23/24 \n", + "1 Pepelu Levante €5.00m Arrivals 23/24 \n", + "2 Sergi Canós Brentford €250k Arrivals 23/24 \n", + "3 Selim Amallah Real Valladolid Loan fee:€150k Arrivals 23/24 \n", + "4 Roman Yaremchuk Club Brugge loan transfer Arrivals 23/24 \n", + "\n", + " Observe Club Type Value \n", + "0 Valencia CF Transfer 5000000.0 \n", + "1 Valencia CF Transfer 5000000.0 \n", + "2 Valencia CF Transfer 250000.0 \n", + "3 Valencia CF Loan 150000.0 \n", + "4 Valencia CF Loan 0.0 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Transfer History\n", + "tm = sfc.Transfermarkt()\n", + "try:\n", + " x = tm.get_league_transfer_history(year=2023, league=\"La Liga\")\n", + "except:\n", + " traceback.print_exc()\n", + "finally:\n", + " tm.close()\n", + "\n", + "x.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -459,7 +640,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.11.5" }, "vscode": { "interpreter": {