LoginSignup
0
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-07

はじめに

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
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3