JFLの試合結果からランキングを作成

import pandas as pd

# ファーストステージ
url_1 = 'http://www.jfl.or.jp/jfl-pc/view/s.php?a=1270&f=2018A001_spc.html'
dfs_1 = pd.read_html(url_1, skiprows=1, na_values='-')

# セカンドステージ
url_2 = 'http://www.jfl.or.jp/jfl-pc/view/s.php?a=1271&f=2018A003_spc.html'
dfs_2 = pd.read_html(url_2, skiprows=1, na_values='-')

# ファーストステージとセカンドステージをまとめ
dfs = dfs_1 + dfs_2

# 個数確認
len(dfs)

# 結合
df = pd.concat(
    dfs, keys=[i for i in range(1,
                                len(dfs) + 1)], names=['節', '番号'])
df.columns = ['日にち', '時間', 'ホーム', 'スコア', 'アウェイ', 'スタジアム', '備考']
df.drop('備考', axis=1, inplace=True)
df.head()

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

# スコアがないものを除去
df1 = df.dropna(subset=['スコア'])
df1

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

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

# ホーム得点、アウェイ得点を文字から整数に変更
import numpy as np
df2['ホーム得点'] = df2['ホーム得点'].astype(np.int64)
df2['アウェイ得点'] = df2['アウェイ得点'].astype(np.int64)
df2.dtypes

#データ確認
df2

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

# アウェイの結果のみ
df_away = df2.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.head()


# 勝敗を追加
def win_or_loss(x):
    if x['得点'] > x['失点']:
        return '勝利'
    elif x['得点'] < x['失点']:
        return '敗戦'
    else:
        return '引分'


df_total['勝敗'] = df_total.apply(lambda x: win_or_loss(x), axis=1)

df_total.head()


# 勝点を追加
def win_point(x):
    if x['得点'] > x['失点']:
        return 3
    elif x['得点'] < x['失点']:
        return 0
    else:
        return 1


df_total['勝点'] = df_total.apply(lambda x: win_point(x), axis=1)
df_total.head()

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

# 集計用にカウント追加
df_total['カウント'] = 1

# 得点・失点・得失点・勝点 集計
pv_wl = df_total.pivot_table(
    values='カウント',
    index='チーム名',
    columns=['戦', '勝敗'],
    aggfunc=sum,
    fill_value=0)
pv_wl

# 列名変更
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

# 得点計と試合計を結合
df3 = pd.concat([pv_score, pv_wl], axis=1)

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

# ランキング
df3['順位'] = df3['評価値'].rank(ascending=False, method='min')

# 順位で昇順
df3.sort_values(['順位'], inplace=True)

# チーム名をインデックスから解除
df3.reset_index(inplace=True)

# 順位をインデックスに設定
df3.set_index('順位', inplace=True)

# 列の並び替え
df_rank = df3.loc[:, [
    'チーム名', '勝点', '試合数', '勝利', '勝利H', '勝利A', '引分', '引分H', '引分A', '敗戦', '敗戦H',
    '敗戦A', '得失点', '得点', '失点'
]]

df_rank
df_rank.to_excel('jfl_rank.xlsx')

#列数を30に変更
pd.set_option("display.max_columns", 30)

# 勝点集計
df4 = df_total.pivot_table(
    values='勝点', index='チーム名', columns='節', aggfunc=sum, fill_value=0)
df4

# 勝点を累計
df5 = df4.apply(lambda d: d.cumsum(), axis=1)
df5

import matplotlib.pyplot as plt
import seaborn as sns

sns.set(
    font=['Source Han Code JP'],
    font_scale=1.2,
    style='whitegrid',
    rc={'legend.frameon': True})

# 全部グラフ
df5.T.plot(figsize=(20, 10))

# 一部グラフ
df5.loc[['FC今治', '東京武蔵野シティFC', 'MIOびわこ滋賀', 'ソニー仙台FC']].T.plot(figsize=(20, 10))