JFLの試合結果から戦績表を作成


はじめに

JFLの試合結果から順位表を作成のつづき

スクレイピング

前回の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("第節"))

    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=["節", "番号", "日にち", "時間", "ホーム", "スコア", "アウェイ", "スタジアム", "備考"]
)

df.set_index(["節", "番号"], inplace=True)

df

df_score = (
    df["スコア"].str.split("-", expand=True).rename(columns={0: "ホーム得点", 1: "アウェイ得点"})
)

df_score["ホーム得点"] = pd.to_numeric(df_score["ホーム得点"], errors="coerce").astype("Int64")
df_score["アウェイ得点"] = pd.to_numeric(df_score["アウェイ得点"], errors="coerce").astype("Int64")

df1 = pd.concat([df, df_score], axis=1).dropna(subset=["ホーム得点", "アウェイ得点"])

# ホームの結果のみ
df_home = df1.loc[:, ["ホーム", "アウェイ", "ホーム得点", "アウェイ得点"]].copy()
df_home.rename(
    columns={"ホーム": "チーム名", "アウェイ": "対戦相手", "ホーム得点": "得点", "アウェイ得点": "失点"}, inplace=True
)
df_home["戦"] = "H"
df_home.head()

# アウェイの結果のみ
df_away = df1.loc[:, ["アウェイ", "ホーム", "アウェイ得点", "ホーム得点"]].copy()
df_away.rename(
    columns={"アウェイ": "チーム名", "ホーム": "対戦相手", "アウェイ得点": "得点", "ホーム得点": "失点"}, inplace=True
)
df_away["戦"] = "A"
df_away.head()

# ホームとアウェイを結合
df_total = pd.concat([df_home, df_away])

df_total

jfl_2020 = [
    "Honda FC",
    "ソニー仙台FC",
    "東京武蔵野シティFC",
    "テゲバジャーロ宮崎",
    "ホンダロックSC",
    "ヴェルスパ大分",
    "FC大阪",
    "MIOびわこ滋賀",
    "ヴィアティン三重",
    "FCマルヤス岡崎",
    "鈴鹿ポイントゲッターズ",
    "ラインメール青森",
    "奈良クラブ",
    "松江シティFC",
    "いわきFC",
    "高知ユナイテッドSC",
]

df_total

df_total["結果"] = df_total.apply(
    lambda x: f'{x["得点"]}{x["失点"]}'
    if x["得点"] == x["失点"]
    else f'{x["得点"]}{x["失点"]}'
    if x["得点"] > x["失点"]
    else f'{x["得点"]}{x["失点"]}',
    axis=1,
)

df_total

# 戦績表 集計
pv_senseki = df_total.pivot(values="結果", index=["チーム名", "戦"], columns="対戦相手").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 ソニー仙台FC 東京武蔵野シティFC テゲバジャーロ宮崎 ホンダロックSC ヴェルスパ大分 FC大阪 MIOびわこ滋賀 ヴィアティン三重 FCマルヤス岡崎 鈴鹿ポイントゲッターズ ラインメール青森 奈良クラブ 松江シティFC いわきFC 高知ユナイテッドSC
('Honda FC', 'H') 1△1 3○1 1△1 1○0
('Honda FC', 'A') 4○0 3○0 1△1 1○0
('ソニー仙台FC', 'H') 0●4 1△1 3○1
('ソニー仙台FC', 'A') 0●2 4○2 2○1 2○0 1●2
('東京武蔵野シティFC', 'H') 2○0 1●2 2○1
('東京武蔵野シティFC', 'A') 1△1 0●1 1△1
('テゲバジャーロ宮崎', 'H') 1△1 1●2 2○0
('テゲバジャーロ宮崎', 'A') 2○1 4○1 0△0 1○0
('ホンダロックSC', 'H') 0●3 1●2 0●4 0●3
('ホンダロックSC', 'A') 1△1 3○1 2○1 1○0
('ヴェルスパ大分', 'H') 2●4 1○0 1●2 4○1
('ヴェルスパ大分', 'A') 2○1 2○0 2○1
('FC大阪', 'H') 1△1 1○0 1●2 0△0 2○1
('FC大阪', 'A') 1●2 4○0 2●3
('MIOびわこ滋賀', 'H') 1●4 3△3 6○0 1○0
('MIOびわこ滋賀', 'A') 1●3 0●1 2○1 3○1
('ヴィアティン三重', 'H') 0△0 0●2 1●2 3○2
('ヴィアティン三重', 'A') 1△1 2○1 0●1 1●2
('FCマルヤス岡崎', 'H') 1●2 1●3 1△1 0●2
('FCマルヤス岡崎', 'A') 0●1 0△0 2●3 2○0
('鈴鹿ポイントゲッターズ', 'H') 0●1 1○0 0●1 1●2 1○0
('鈴鹿ポイントゲッターズ', 'A') 3△3 1○0 2△2
('ラインメール青森', 'H') 0●2 3○0 1△1
('ラインメール青森', 'A') 0●1 2○1 0●6 1△1
('奈良クラブ', 'H') 1●2 1○0 0●1 1△1
('奈良クラブ', 'A') 1△1 2○1 3○0 1●2
('松江シティFC', 'H') 2○1 1●3 2○1 2○1
('松江シティFC', 'A') 0●2 1●2 0●1 2○1 0●3
('いわきFC', 'H') 1●2 3○2 2○1 4○3
('いわきFC', 'A') 1●4 2○0 0●1 1△1
('高知ユナイテッドSC', 'H') 1△1 0●1 0●2 2△2
('高知ユナイテッドSC', 'A') 1●3 1△1 1●2 3●4