Scraping-Spielergebnisse von Zeitplan / Ergebnisse auf der offiziellen Website der Japan Football League
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)
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))
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 |
Recommended Posts