[PYTHON] Créer un classement à partir des résultats des matchs JFL

introduction

Grattage des résultats des matchs de Calendrier / Résultats sur le site officiel de la Ligue japonaise de football

Grattage

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)

Data wrangling

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))

Table debout

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

A continué

Recommended Posts

Créer un classement à partir des résultats des matchs JFL
Créer une table d'enregistrement à partir des résultats de correspondance JFL
Créer un classement des scores à partir des résultats de match JFL
Créez un Dataframe pandas à partir d'une chaîne.
Comment créer un clone depuis Github
Créer un fichier deb à partir d'un package python
Comment créer un référentiel à partir d'un média
Créer un bloc de données à partir d'Excel à l'aide de pandas
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Comment créer un objet fonction à partir d'une chaîne
Créer un tableau C à partir d'une feuille Python> Excel
Créez une interface utilisateur de jeu à partir de zéro avec pygame2!
Créer une nouvelle tâche Todoist à partir d'un script Python
Créer un arbre phylogénétique à partir de Biopyton en utilisant ClustalW2
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Créer un objet datetime à partir d'une chaîne en Python (Python 3.3)
Créer un nuage de mots à partir de programmes académiques
Script Python qui crée un fichier JSON à partir d'un fichier CSV
Créez un environnement d'apprentissage automatique à partir de zéro avec Winsows 10
Créer un planning Django
Créer un module Python
Créer un LV amorçable
Créer un environnement Python
Créer un bot slack
Créer un bloc de données à partir des données textuelles de course de bateaux acquises
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
Créer une instance GCE à partir d'une image Docker GCR à l'aide de terraform
Créer un diagramme de corrélation à partir de l'historique des conversations de Twitter