Grattage des résultats des matchs de Calendrier / Résultats sur le site officiel de la Ligue japonaise de football
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("Section"))
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=["section", "nombre", "Date", "temps", "domicile", "But", "Une façon", "Stade", "Remarques"]
)
df.set_index(["section", "nombre"], inplace=True)
df
df_score = (
df["But"].str.split("-", expand=True).rename(columns={0: "Score à domicile", 1: "Score à l'extérieur"})
)
df_score["Score à domicile"] = pd.to_numeric(df_score["Score à domicile"], errors="coerce").astype("Int64")
df_score["Score à l'extérieur"] = pd.to_numeric(df_score["Score à l'extérieur"], errors="coerce").astype("Int64")
df1 = pd.concat([df, df_score], axis=1).dropna(subset=["Score à domicile", "Score à l'extérieur"])
#Résultats à domicile uniquement
df_home = df1.loc[:, ["domicile", "domicile得点", "Score à l'extérieur"]].copy()
df_home.rename(columns={"domicile": "Nom de l'équipe", "domicileBut": "But", "アウェイBut": "Concédé"}, inplace=True)
df_home["Guerre"] = "domicile"
df_home.head()
#Résultats à l'extérieur uniquement
df_away = df1.loc[:, ["Une façon", "Une façon得点", "Score à domicile"]].copy()
df_away.rename(columns={"Une façon": "Nom de l'équipe", "Une façonBut": "But", "ホームBut": "Concédé"}, inplace=True)
df_away["Guerre"] = "Une façon"
df_away.head()
#Combinez chez vous et ailleurs
df_total = pd.concat([df_home, df_away])
#Calculer les objectifs et les objectifs
df_total["Objectif objectif"] = df_total["But"] - df_total["Concédé"]
#Ajouter des points
df_total["Gagnez des points"] = df_total["Objectif objectif"].apply(lambda x: 1 if x == 0 else 0 if x < 0 else 3)
df_total["Gagner ou perdre"] = df_total["Gagnez des points"].replace({0: "défaite", 1: "Dessiner", 3: "la victoire"})
df_total.head()
#Agréger les points / buts / buts / victoires
pv_score = df_total.pivot_table(
index="Nom de l'équipe", values=["But", "Concédé", "得Concédé", "Gagnez des points"], aggfunc=sum
)
pv_score
#Total des gains / pertes
pv_wl = pd.crosstab(df_total["Nom de l'équipe"], [df_total["Guerre"], df_total["Gagner ou perdre"]])
pv_wl
#Renommer la colonne
# pv_wl.columns = ["Victoire A", "Dessine un", "Vaincre A", "Victoire H", "Dessiner H", "Vaincre H"]
pv_wl.rename(columns={"Une façon": "A", "domicile": "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]
#Ajouter le total
pv_wl["la victoire"] = pv_wl["la victoireH"] + pv_wl["la victoireA"]
pv_wl["Dessiner"] = pv_wl["DessinerH"] + pv_wl["DessinerA"]
pv_wl["défaite"] = pv_wl["défaiteH"] + pv_wl["défaiteA"]
#Ajout de jeux
pv_wl["Nombre de parties"] = pv_wl["la victoire"] + pv_wl["Dessiner"] + pv_wl["défaite"]
#Vérification
pv_wl
df2 = df_total.copy()
#Créer une valeur d'évaluation
df2["Valeur d'évaluation"] = ((df2["Gagnez des points"]) * 10000) + (df2["Objectif objectif"] * 100) + df2["But"]
df2
#Agrégation des valeurs d'évaluation
df3 = df2.pivot_table(
values="Valeur d'évaluation", index="Nom de l'équipe", columns="section", aggfunc=sum, fill_value=0
)
df3
#Somme cumulée des valeurs d'évaluation
df_eval = df3.apply(lambda d: d.cumsum(), axis=1)
df_eval
#Créer un classement à partir de la valeur d'évaluation
df_chart = df_eval.rank(ascending=False, method="min").astype(int)
df_chart.sort_values(by=df_chart.columns[-1], inplace=True)
df_chart
#Obtenez le classement final
s1 = df_chart.iloc[:, -1]
s1.name = "Classement"
df_diff = df_chart.diff(axis=1).fillna(0).astype(int)
df_diff
#Différence de section précédente
s2 = df_diff.iloc[:, -1].apply(lambda x: "-" if x == 0 else "▼" if x < 0 else "▲")
s2.name = "Section précédente"
s2
#Combinez tout
df4 = pd.concat([pv_score, pv_wl], axis=1).join([s1, s2])
#Croissant dans l'ordre
df4.sort_values(["Classement"], inplace=True)
df_rank = df4.reset_index().loc[
:,
[
"Section précédente",
"Classement",
"Nom de l'équipe",
"Gagnez des points",
"Nombre de parties",
"la victoire",
"Victoire H",
"Victoire A",
"Dessiner",
"Dessiner H",
"Dessine un",
"défaite",
"Vaincre H",
"Vaincre A",
"Objectif objectif",
"But",
"Concédé",
],
]
df_rank
print(df_rank.to_markdown(index=False))
Au 10/07/2020
Section précédente | Classement | Nom de l'équipe | Gagnez des points | Nombre de parties | la victoire | Victoire H | Victoire A | Dessiner | Dessiner H | Dessine un | défaite | Vaincre H | Vaincre A | Objectif objectif | But | Concédé |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | 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 | Courrier en ligne 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