はじめに
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 |