pythonでLeague of Legendsの統計データを表示してみる【その2】


チームごとのゴールドの変遷を見る

前回に引き続き、今度はゴールドの時系列データを表示してみます。 今回表示するものは、OPGG内でTeamAnalysisから見れるデータです。スクショしてきました。 f:id:Sorivid:20180121193344p:plain

流れ

ほとんど前回と変わりません。

  1. 自身のサモナーネームを使いユーザ情報を取得
  2. 100戦分のリストを取得して、データを表示したい対戦のID(マッチID)を取得
  3. 対戦のタイムラインを取得し、各チームのゴールド変遷をグラフ化

ユーザ情報の取得

 Riotの開発者ページAPI_KEYを取得します。
 APIを使うというとなんか難しそうですが、ただWeb上にあるデータをURLを使って保存するだけです。(たぶん)
 RiotのAPIではJSONデータを使用しているので、jsonモジュールを使い、Pythonの組み込み型であるディクショナリ型に変換します。これでデータの操作が簡単になりました。

from urllib import request
import matplotlib.pyplot as plt
import json
%matplotlib inline

#APIKEYと、APIのURL共通部分の準備
API_KEY = '????-??????-????-????-????-????'
name = "じぶんのなまえ"
region = "jp1"
uri = "https://{0}.api.riotgames.com".format(region) 

#APIを指定するとreadして辞書型で返してくれる関数
def DoAPI(API_URI):
    return json.loads(request.urlopen(API_URI).read()) #requestモジュールでファイル風オブジェクトとやらを返し、それをjsonモジュールで辞書型として返してあげる。

#ユーザ情報を取得
UserInfo = DoAPI(uri + "/lol/summoner/v3/summoners/by-name/{0}?api_key={1}".format(name, API_KEY))

 これでユーザ情報を取得できました。ユーザ情報から得られるアカウントIDは、ほかのAPIを使用するために必要になってくるので、保存しておきます。

マッチIDの取得

 次はデータを表示したい対戦のマッチIDを取得します。

#ゲームのマッチリスト情報(100戦分のリスト)を手に入れる。
accountID = UserInfo['accountId'] #自分のユーザー情報からアカウントIDを手に入れる。
HundredMatchList = DoAPI(uri + "/lol/match/v3/matchlists/by-account/{0}?api_key={1}".format(accountID, API_KEY) )

#マッチIDを取得する
TargetGameId = HundredMatchList['matches'][0]['gameId']

 関心のある対戦が100戦分リストのうちの何戦目かを指定しますが、上記ではHunderedMatchList['matches'][0]['gameId']となっており、0戦目のマッチIDを取得しています。(インデックスは0~99)

ゴールド変遷をグラフ化

#対戦のタイムラインを取得
MatchTimeLine = DoAPI(uri + '/lol/match/v3/timelines/by-match/{0}?api_key={1}'.format(TargetGameId,API_KEY) )

#ゴールドの変遷をリストのリスト[f:id:Sorivid:20180121201402p:plain]で返す
def getTotalGoldTimeLine(TimeLine):
    TotalGoldList = [[],[]]
    for i in range(len(TimeLine['frames'])):
        OneTotalGold = 0
        for key in TimeLine['frames'][i]['participantFrames']:
            if int(key) < 6:
                OneTotalGold += TimeLine['frames'][i]['participantFrames'][key]['totalGold']
        TotalGoldList[0] += [OneTotalGold]
        OneTotalGold = 0
        for key in TimeLine['frames'][i]['participantFrames']:
            if int(key) >5:
                OneTotalGold += TimeLine['frames'][i]['participantFrames'][key]['totalGold']
        TotalGoldList[1] += [OneTotalGold]
    return TotalGoldList
            
GoldTimeLine = getTotalGoldTimeLine(MatchTimeLine)

#ゴールドの変遷をプロット
plt.plot(GoldTimeLine[0])
plt.plot(GoldTimeLine[1])

f:id:Sorivid:20180121201402p:plain
OPGGからスクショした画像と全く同じゴールドの変遷が見れますね。

 また、OPGGでゴールドの変遷をみると1分単位でしかデータの変遷を追えないのですが、今回実際にデータを見てそもそもAPIで取得できるデータが1分間隔なのだということを知りました。

 次はデータ分析的なことができたらいいなと思います。