[OPGG] 각 리그별 팀 성적 시각화

Updated:

각 리그별 팀 성적

이번에도 웹 스크래핑 배운 내용을 토대로 원하는 자료를 가져와 볼 것이다.

여기선 각 롤 리그별로 팀들의 성적을 불러와 시각화 해보았다.

import numpy as np
import pandas as pd
import requests
from bs4 import BeautifulSoup
from selenium import webdriver

import plotly.graph_objects as go
import plotly.figure_factory as ff
def league_result(league):
    # 리그에 따른 URL 설정
    url = f"https://qwer.gg/leagues/{league}/2021/summer"

    # 리그 정보 테이블 HTML 사용
    QWER_html = requests.get(url).text
    QWER_soup = BeautifulSoup(QWER_html, "html.parser")
    info = QWER_soup.find("table", attrs= {"class":"BorderedTable RankTable Ranks--desktop"}).find("tbody").find_all("tr")

    # 빈 데이터 프레임
    data = pd.DataFrame()
    
    # 데이터 적재
    for i in range(len(info)):
        lst = []
        # 순위/팀
        rank = info[i].find("td", attrs= {"class":"RankTable__rank Gilroy"}).get_text()
        team = info[i].find("td", attrs= {"class":"RankTable__name Gilroy"}).find("span", attrs={"class":"hidden-in-desktop"}).get_text()

        # 매치 승/패/승률
        temp = info[i].find_all("td")[3].get_text().split()
        win = temp[0][:-1]
        lose = temp[1][:-1]
        # win_rate = win / (win+lose)

        # 세트 승/패/승률
        temp2 = info[i].find_all("td")[5].get_text()
        set_win = temp[0][:-1]
        set_lose = temp[1][:-1]

        point = info[i].find("td", attrs= {"class":"RankTable__point Gilroy"}).get_text()

        # 테이블 정보 append
        lst.append(rank) ; lst.append(team) ; lst.append(win) ; lst.append(lose)
        lst.append(set_win) ; lst.append(set_lose) ; lst.append(point)

        # 데이터 프레임
        temp_df = pd.DataFrame(lst)
        data = pd.concat([data, temp_df], axis=1)

    # 데이터 프레임 형태 설정
    data = data.T
    data.index = range(data.shape[0])
    data.columns = ["rank", "team", "win", "lose", "set_win", "set_lose", "point"]

    # 컬럼별 타입 설정
    data["rank"] = data["rank"].astype(int)
    data["win"] = data["win"].astype(int)
    data["lose"] = data["lose"].astype(int)
    data["set_win"] = data["set_win"].astype(int)
    data["set_lose"] = data["set_lose"].astype(int)
    data["point"] = data["point"].astype(int)

    # 시각화 작업
    # 테이블 생성
    fig = ff.create_table(data, height_constant=60)

    # 매치 승/패 막대 그래프
    trace1 = go.Bar(x=data["team"], y=data["win"], xaxis='x2', yaxis='y2',
                    marker=dict(color='#0099ff'),
                    name='Win')
    trace2 = go.Bar(x=data["team"], y=data["lose"], xaxis='x2', yaxis='y2',
                    marker=dict(color='#404040'),
                    name='lose')

    fig.add_traces([trace1, trace2])

    # axis 설정
    fig['layout']['xaxis2'] = {}
    fig['layout']['yaxis2'] = {}
    fig.layout.yaxis.update({'domain': [0, .45]})
    fig.layout.yaxis2.update({'domain': [.6, 1]})
    fig.layout.yaxis2.update({'anchor': 'x2'})
    fig.layout.xaxis2.update({'anchor': 'y2'})
    fig.layout.yaxis2.update({'title': 'Goals'})

    # layout 설정
    fig.layout.margin.update({'t':75, 'l':50})
    fig.layout.update({'title':f'2021 {league} Result'})
    fig.layout.update({'height':800})

    # plot 생성
    fig.write_html(f"{league}.html")
    return fig.show()
  • 사실 각 태그들은 직접 확인하여야 하니까 따로 설명할 것이 없다.
league = "LCK"
league_result(league)
  • 한국 LCK 리그의 팀별 정보를 테이블과 막대 그래프로 시각화 하였다.

  • DRX는 18전 2승 16패로 패가 매우 많음이 확인된다.

league = "LPL"
league_result(league)
  • 이번엔 중국 LPL 리그를 확인해보았다.

  • LPL에선 V5라는 팀이 0승 16패로 전패팀이 존재한다.

league = "LEC"
league_result(league)
  • 마지막으로 LEC를 확인하였다.

Leave a comment