[PYTHON] Erstellen Sie eine Rangliste aus den Ergebnissen der JFL-Spiele

Einführung

Scraping-Spielergebnisse von Zeitplan / Ergebnisse auf der offiziellen Website der Japan Football League

Schaben

import requests
from bs4 import BeautifulSoup

url = "http://www.jfl.or.jp/jfl-pc/view/s.php?a=1542&f=2020A001_spc.html"

r = requests.get(url)
r.raise_for_status()

soup = BeautifulSoup(r.content, "html.parser")

data = []

for table in soup.find_all("table", class_="table-data"):

    trs = table.find_all("tr")

    th = int(trs[0].th.get_text(strip=True).strip("Sektion"))

    for i, tr in enumerate(trs[1:], 1):

        tds = [td.get_text(strip=True) for td in tr.find_all("td")]

        data.append([th, i] + tds)

Daten-Wrangling

import pandas as pd

df = pd.DataFrame(
    data, columns=["Sektion", "Nummer", "Datum", "Zeit", "Zuhause", "Ergebnis", "Weg", "Stadion", "Bemerkungen"]
)

df.set_index(["Sektion", "Nummer"], inplace=True)

df

df_score = (
    df["Ergebnis"].str.split("-", expand=True).rename(columns={0: "Home Score", 1: "Auswärtspunktzahl"})
)

df_score["Home Score"] = pd.to_numeric(df_score["Home Score"], errors="coerce").astype("Int64")
df_score["Auswärtspunktzahl"] = pd.to_numeric(df_score["Auswärtspunktzahl"], errors="coerce").astype("Int64")

df1 = pd.concat([df, df_score], axis=1).dropna(subset=["Home Score", "Auswärtspunktzahl"])

#Nur Home-Ergebnisse
df_home = df1.loc[:, ["Zuhause", "Zuhause得点", "Auswärtspunktzahl"]].copy()
df_home.rename(columns={"Zuhause": "Teamname", "ZuhauseErgebnis": "Ergebnis", "アウェイErgebnis": "Zugegeben"}, inplace=True)
df_home["Krieg"] = "Zuhause"
df_home.head()

#Nur Auswärtsergebnisse
df_away = df1.loc[:, ["Weg", "Weg得点", "Home Score"]].copy()
df_away.rename(columns={"Weg": "Teamname", "WegErgebnis": "Ergebnis", "ホームErgebnis": "Zugegeben"}, inplace=True)
df_away["Krieg"] = "Weg"
df_away.head()

#Kombinieren Sie zu Hause und unterwegs
df_total = pd.concat([df_home, df_away])

#Berechnen Sie Ziele und Vorgaben
df_total["Ziel Ziel"] = df_total["Ergebnis"] - df_total["Zugegeben"]


#Punkte hinzufügen
df_total["Gewinne Punkte"] = df_total["Ziel Ziel"].apply(lambda x: 1 if x == 0 else 0 if x < 0 else 3)
df_total["Gewinnen oder verlieren"] = df_total["Gewinne Punkte"].replace({0: "Niederlage", 1: "Zeichnen", 3: "Sieg"})

df_total.head()

#Sammeln Sie Punkte / Ziele / Ziele / Siege
pv_score = df_total.pivot_table(
    index="Teamname", values=["Ergebnis", "Zugegeben", "得Zugegeben", "Gewinne Punkte"], aggfunc=sum
)

pv_score

#Gewinn / Verlust insgesamt
pv_wl = pd.crosstab(df_total["Teamname"], [df_total["Krieg"], df_total["Gewinnen oder verlieren"]])
pv_wl

#Spalte umbenennen
# pv_wl.columns = ["Sieg A.", "Zeichne ein", "Besiege A.", "Sieg H.", "Zeichne H.", "Besiege H."]

pv_wl.rename(columns={"Weg": "A", "Zuhause": "H"}, inplace=True)
pv_wl.columns = pv_wl.columns.swaplevel(0, 1)
pv_wl.columns = ["".join(col).strip() for col in pv_wl.columns.values]

#Summe hinzufügen
pv_wl["Sieg"] = pv_wl["SiegH"] + pv_wl["SiegA"]
pv_wl["Zeichnen"] = pv_wl["ZeichnenH"] + pv_wl["ZeichnenA"]
pv_wl["Niederlage"] = pv_wl["NiederlageH"] + pv_wl["NiederlageA"]

#Hinzufügung von Spielen
pv_wl["Anzahl von Spielen"] = pv_wl["Sieg"] + pv_wl["Zeichnen"] + pv_wl["Niederlage"]

#Bestätigung
pv_wl

df2 = df_total.copy()

#Bewertungswert erstellen
df2["Bewertungswert"] = ((df2["Gewinne Punkte"]) * 10000) + (df2["Ziel Ziel"] * 100) + df2["Ergebnis"]
df2

#Bewertungswertaggregation
df3 = df2.pivot_table(
    values="Bewertungswert", index="Teamname", columns="Sektion", aggfunc=sum, fill_value=0
)
df3

#Kumulative Summe der Bewertungswerte
df_eval = df3.apply(lambda d: d.cumsum(), axis=1)
df_eval

#Erstellen Sie ein Ranking aus dem Bewertungswert
df_chart = df_eval.rank(ascending=False, method="min").astype(int)
df_chart.sort_values(by=df_chart.columns[-1], inplace=True)
df_chart

#Holen Sie sich das endgültige Ranking
s1 = df_chart.iloc[:, -1]
s1.name = "Rangfolge"

df_diff = df_chart.diff(axis=1).fillna(0).astype(int)
df_diff

#Unterschied im vorherigen Abschnitt
s2 = df_diff.iloc[:, -1].apply(lambda x: "-" if x == 0 else "▼" if x < 0 else "▲")
s2.name = "Vorherige Sektion"
s2

#Kombiniere alles
df4 = pd.concat([pv_score, pv_wl], axis=1).join([s1, s2])

#In aufsteigender Reihenfolge
df4.sort_values(["Rangfolge"], inplace=True)

df_rank = df4.reset_index().loc[
    :,
    [
        "Vorherige Sektion",
        "Rangfolge",
        "Teamname",
        "Gewinne Punkte",
        "Anzahl von Spielen",
        "Sieg",
        "Sieg H.",
        "Sieg A.",
        "Zeichnen",
        "Zeichne H.",
        "Zeichne ein",
        "Niederlage",
        "Besiege H.",
        "Besiege A.",
        "Ziel Ziel",
        "Ergebnis",
        "Zugegeben",
    ],
]

df_rank

print(df_rank.to_markdown(index=False))

Stehtisch

Stand 07.10.2020

Vorherige Sektion Rangfolge Teamname Gewinne Punkte Anzahl von Spielen Sieg Sieg H. Sieg A. Zeichnen Zeichne H. Zeichne ein Niederlage Besiege H. Besiege A. Ziel Ziel Ergebnis Zugegeben
1 Honda FC 18 8 5 2 3 3 2 1 0 0 0 11 15 4
2 Verspa Oita 15 7 5 2 3 0 0 0 2 2 0 5 14 9
3 Tegevajaro Miyazaki 14 7 4 1 3 2 1 1 1 1 0 6 11 5
4 MIO Biwako Shiga 13 8 4 2 2 1 1 0 3 1 2 4 17 13
5 Iwaki FC 13 8 4 3 1 1 0 1 3 1 2 0 14 14
6 Sony Sendai FC 13 8 4 1 3 1 1 0 3 1 2 0 13 13
7 Matsue City FC 12 9 4 3 1 0 0 0 5 1 4 -5 10 15
8 FC Osaka 11 8 3 2 1 2 2 0 3 1 2 3 12 9
9 Nara Club 11 8 3 1 2 2 1 1 3 2 1 2 10 8
10 Suzuka Point Getters 11 8 3 2 1 2 0 2 3 3 0 0 9 9
11 Honda Lock SC 10 8 3 0 3 1 0 1 4 4 0 -7 8 15
12 Tokyo Musashino City FC 8 6 2 2 0 2 0 2 2 1 1 1 7 6
13 Viatin Mie 8 8 2 1 1 2 1 1 4 2 2 -3 8 11
14 Line Mail Aomori 8 7 2 1 1 2 1 1 3 1 2 -5 7 12
15 FC Maruyasu Okazaki 5 8 1 0 1 2 1 1 5 3 2 -5 7 12
16 Kochi United SC 3 8 0 0 0 3 2 1 5 2 3 -7 9 16

Fortsetzung

Recommended Posts

Erstellen Sie eine Rangliste aus den Ergebnissen der JFL-Spiele
Erstellen Sie eine Datensatztabelle aus den JFL-Übereinstimmungsergebnissen
Erstellen Sie ein Score-Ranking aus den JFL-Match-Ergebnissen
Erstellen Sie einen Pandas-Datenrahmen aus einer Zeichenfolge.
So erstellen Sie einen Klon aus Github
Erstellen Sie eine Deb-Datei aus einem Python-Paket
So erstellen Sie ein Repository aus Medien
Erstellen Sie mit Pandas einen Datenrahmen aus Excel
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
Erstellen Sie ein C-Array aus einer Python> Excel-Tabelle
Erstelle mit pygame2 eine neue Benutzeroberfläche!
Erstellen Sie eine neue Todoist-Aufgabe aus Python Script
Erstellen Sie mit ClustalW2 einen phylogenetischen Baum aus Biopyton
Erstellen Sie mit Python einen Entscheidungsbaum von 0 (1. Übersicht)
Erstellen Sie ein Datum / Uhrzeit-Objekt aus einer Zeichenfolge in Python (Python 3.3).
Erstellen Sie Word Cloud aus akademischen Programmen
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
Erstellen Sie mit Winsows 10 eine maschinelle Lernumgebung von Grund auf neu
Erstellen Sie einen Django-Zeitplan
Erstellen Sie ein Python-Modul
Erstellen Sie eine bootfähige LV
Erstellen Sie eine Python-Umgebung
Erstellen Sie einen Slack Bot
Erstellen Sie einen Datenrahmen aus den erfassten Textdaten des Bootsrennens
Ich habe ein Tool erstellt, um eine Wortwolke aus Wikipedia zu erstellen
Python: Erstellen Sie ein Wörterbuch aus einer Liste von Schlüsseln und Werten
Erstellen Sie eine GCE-Instanz aus einem GCR Docker-Image mithilfe von Terraform
Erstellen Sie ein Korrelationsdiagramm aus dem Konversationsverlauf von Twitter