JFLランキング作成

imabari.hateblo.jp

新たに作成

  • crosstabに変更
  • lambdaに変更
import pandas as pd
import numpy as np

# 行数
pd.set_option("display.max_columns", None)

# データ取得

# 試合結果を取得
url = "http://www.jfl.or.jp/jfl-pc/view/s.php?a=1411&f=2019A001_spc.html"
dfs = pd.read_html(url, na_values="-")

# 前処理

# 列名変更
for i in range(len(dfs)):
    dfs[i].columns = ["日にち", "時間", "ホーム", "スコア", "アウェイ", "スタジアム", "備考"]

## 結合

# 結合、節を追加
df = pd.concat(dfs, keys=[i for i in range(1, len(dfs) + 1)], names=["節", "番号"])

# 備考削除
df.drop("備考", axis=1, inplace=True)

# 内容確認
df.head()

## 欠損削除

# 欠損値確認
df[df.isnull().any(axis=1)]

# スコアがないものを除去
df.dropna(subset=["スコア"], inplace=True)

## スコア分割

# スコアを分割、スコアを削除、結合
df1 = pd.concat([df, df["スコア"].str.split("-", expand=True)], axis=1).drop("スコア", axis=1)

# 名前をホーム得点、アウェイ得点に変更
df1.rename(columns={0: "ホーム得点", 1: "アウェイ得点"}, inplace=True)

# ホーム得点、アウェイ得点を文字から整数に変更
df1["ホーム得点"] = df1["ホーム得点"].astype(int)
df1["アウェイ得点"] = df1["アウェイ得点"].astype(int)
df1.dtypes

# データ確認
df1.head()

## ホーム・アウェイ別集計

# ホームの結果のみ
df_home = df1.loc[:, ["ホーム", "ホーム得点", "アウェイ得点"]]
df_home.columns = ["チーム名", "得点", "失点"]
df_home["戦"] = "ホーム"
df_home.head()

# アウェイの結果のみ
df_away = df1.loc[:, ["アウェイ", "アウェイ得点", "ホーム得点"]]
df_away.columns = ["チーム名", "得点", "失点"]
df_away["戦"] = "アウェイ"
df_away.head()

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

## 得失点計算

# 得失点を計算
df_total["得失点"] = df_total["得点"] - df_total["失点"]

## 勝敗・勝点追加

# 勝敗追加
df_total["勝敗"] = df_total["得失点"].apply(lambda x: "引分" if x == 0 else "敗戦" if x < 0 else "勝利")

# 勝点追加
df_total["勝点"] = df_total["得失点"].apply(lambda x: 1 if x == 0 else 0 if x < 0 else 3)

df_total.head()

# 集計

## 得失点・勝敗・勝点集計


# 得点・失点・得失点・勝点 集計
pv_score = df_total.pivot_table(values=["得点", "失点", "得失点", "勝点"], index="チーム名", aggfunc=sum)

pv_score

## 勝敗カウント

# 勝敗集計
pv_wl = pd.crosstab(df_total["チーム名"], [df_total["戦"], df_total["勝敗"]])

# 列名変更
pv_wl.columns = ["勝利A", "引分A", "敗戦A", "勝利H", "引分H", "敗戦H"]

# 合計追加
pv_wl["勝利"] = pv_wl["勝利H"] + pv_wl["勝利A"]
pv_wl["引分"] = pv_wl["引分H"] + pv_wl["引分A"]
pv_wl["敗戦"] = pv_wl["敗戦H"] + pv_wl["敗戦A"]

# 試合数追加
pv_wl["試合数"] = pv_wl["勝利"] + pv_wl["引分"] + pv_wl["敗戦"]

# 確認
pv_wl

## 評価値

df2 = df_total.copy()

# 評価値を作成
df2["評価値"] = ((df2["勝点"]) * 10000) + (df2["得失点"] * 100) + df2["得点"]
df2

# 評価値集計
df3 = df2.pivot_table(values="評価値", index="チーム名", columns="節", aggfunc=sum, fill_value=0)
df3

# 評価値の累計和
df_eval = df3.apply(lambda d: d.cumsum(), axis=1)
df_eval

## 順位

# 評価値から順位作成
df_chart = df_eval.rank(ascending=False, method="min").astype(int)
df_chart.sort_values(by=df_chart.columns[-1], inplace=True)
df_chart

# 最終順位取得
s1 = df_chart.iloc[:, -1]
s1.name = "順位"

## 順位差分

df_diff = df_chart.diff(axis=1).fillna(0).astype(int)
df_diff

#  前節差分
s2 = df_diff.iloc[:, -1].apply(lambda x: "-" if x == 0 else "▼" if x < 0 else "▲")
s2.name = "前節"
s2

# ランキング作成

# 全部を結合
df4 = pd.concat([pv_score, pv_wl], axis=1).join([s1, s2])

# 順位で昇順
df4.sort_values(["順位"], inplace=True)

df4

# ランキング完成

df_rank = df4.reset_index().loc[:, ["前節", "順位", "チーム名", "勝点", "試合数", "勝利", "勝利H", "勝利A", "引分", "引分H", "引分A", "敗戦", "敗戦H", "敗戦A", "得失点", "得点", "失点"]]

df_rank