Créer un classement à partir des résultats des matchs JFL
Identique au grattage du précédent Créer un classement à partir des résultats du match JFL
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", "Une façon", "domicile得点", "Une façon得点"]].copy()
df_home.rename(
columns={"domicile": "Nom de l'équipe", "Une façon": "Adversaire", "domicileBut": "But", "Une façonBut": "Concédé"}, inplace=True
)
df_home["Guerre"] = "H"
df_home.head()
#Résultats à l'extérieur uniquement
df_away = df1.loc[:, ["Une façon", "domicile", "Une façon得点", "domicile得点"]].copy()
df_away.rename(
columns={"Une façon": "Nom de l'équipe", "domicile": "Adversaire", "Une façonBut": "But", "domicileBut": "Concédé"}, inplace=True
)
df_away["Guerre"] = "A"
df_away.head()
#Combinez la maison et l'extérieur
df_total = pd.concat([df_home, df_away])
df_total
jfl_2020 = [
"Honda FC",
"Sony Sendai FC",
"Tokyo Musashino City FC",
"Tegevajaro Miyazaki",
"Honda Lock SC",
"Verspa Oita",
"FC Osaka",
"MIO Biwako Shiga",
"Viatin Mie",
"FC Maruyasu Okazaki",
"Suzuka Point Getters",
"Courrier en ligne Aomori",
"Nara Club",
"Matsue City FC",
"Iwaki FC",
"Kochi United SC",
]
df_total
df_total["résultat"] = df_total.apply(
lambda x: f'{x["But"]}△{x["Concédé"]}'
if x["But"] == x["Concédé"]
else f'{x["But"]}○{x["Concédé"]}'
if x["But"] > x["Concédé"]
else f'{x["But"]}●{x["Concédé"]}',
axis=1,
)
df_total
#Total du tableau des records de bataille
pv_senseki = df_total.pivot(values="résultat", index=["Nom de l'équipe", "Guerre"], columns="対Guerre相手").fillna("")
new_idx = pd.MultiIndex.from_product(
[jfl_2020, ["H", "A"]], names=pv_senseki.index.names
)
jfl_senseki = pv_senseki.reindex(new_idx, columns=jfl_2020)
jfl_senseki
print(jfl_senseki.to_markdown())
Honda FC | Sony Sendai FC | Tokyo Musashino City FC | Tegevajaro Miyazaki | Honda Lock SC | Verspa Oita | FC Osaka | MIO Biwako Shiga | Viatin Mie | FC Maruyasu Okazaki | Suzuka Point Getters | Courrier en ligne Aomori | Nara Club | Matsue City FC | Iwaki FC | Kochi United SC | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
('Honda FC', 'H') | 1△1 | 3○1 | 1△1 | 1○0 | ||||||||||||
('Honda FC', 'A') | 4○0 | 3○0 | 1△1 | 1○0 | ||||||||||||
('Sony Sendai FC', 'H') | 0●4 | 1△1 | 3○1 | |||||||||||||
('Sony Sendai FC', 'A') | 0●2 | 4○2 | 2○1 | 2○0 | 1●2 | |||||||||||
('Tokyo Musashino City FC', 'H') | 2○0 | 1●2 | 2○1 | |||||||||||||
('Tokyo Musashino City FC', 'A') | 1△1 | 0●1 | 1△1 | |||||||||||||
('Tegevajaro Miyazaki', 'H') | 1△1 | 1●2 | 2○0 | |||||||||||||
('Tegevajaro Miyazaki', 'A') | 2○1 | 4○1 | 0△0 | 1○0 | ||||||||||||
('Honda Lock SC', 'H') | 0●3 | 1●2 | 0●4 | 0●3 | ||||||||||||
('Honda Lock SC', 'A') | 1△1 | 3○1 | 2○1 | 1○0 | ||||||||||||
('Verspa Oita', 'H') | 2●4 | 1○0 | 1●2 | 4○1 | ||||||||||||
('Verspa Oita', 'A') | 2○1 | 2○0 | 2○1 | |||||||||||||
('FC Osaka', 'H') | 1△1 | 1○0 | 1●2 | 0△0 | 2○1 | |||||||||||
('FC Osaka', 'A') | 1●2 | 4○0 | 2●3 | |||||||||||||
('MIO Biwako Shiga', 'H') | 1●4 | 3△3 | 6○0 | 1○0 | ||||||||||||
('MIO Biwako Shiga', 'A') | 1●3 | 0●1 | 2○1 | 3○1 | ||||||||||||
('Viatin Mie', 'H') | 0△0 | 0●2 | 1●2 | 3○2 | ||||||||||||
('Viatin Mie', 'A') | 1△1 | 2○1 | 0●1 | 1●2 | ||||||||||||
('FC Maruyasu Okazaki', 'H') | 1●2 | 1●3 | 1△1 | 0●2 | ||||||||||||
('FC Maruyasu Okazaki', 'A') | 0●1 | 0△0 | 2●3 | 2○0 | ||||||||||||
('Suzuka Point Getters', 'H') | 0●1 | 1○0 | 0●1 | 1●2 | 1○0 | |||||||||||
('Suzuka Point Getters', 'A') | 3△3 | 1○0 | 2△2 | |||||||||||||
('Courrier en ligne Aomori', 'H') | 0●2 | 3○0 | 1△1 | |||||||||||||
('Courrier en ligne Aomori', 'A') | 0●1 | 2○1 | 0●6 | 1△1 | ||||||||||||
('Nara Club', 'H') | 1●2 | 1○0 | 0●1 | 1△1 | ||||||||||||
('Nara Club', 'A') | 1△1 | 2○1 | 3○0 | 1●2 | ||||||||||||
('Matsue City FC', 'H') | 2○1 | 1●3 | 2○1 | 2○1 | ||||||||||||
('Matsue City FC', 'A') | 0●2 | 1●2 | 0●1 | 2○1 | 0●3 | |||||||||||
('Iwaki FC', 'H') | 1●2 | 3○2 | 2○1 | 4○3 | ||||||||||||
('Iwaki FC', 'A') | 1●4 | 2○0 | 0●1 | 1△1 | ||||||||||||
('Kochi United SC', 'H') | 1△1 | 0●1 | 0●2 | 2△2 | ||||||||||||
('Kochi United SC', 'A') | 1●3 | 1△1 | 1●2 | 3●4 |
Recommended Posts