LoginSignup
2
1

More than 3 years have passed since last update.

League of Legends APIを使って機械学習をやってみる2

Posted at

今回の目的

前回は1つのゲームについてどんな情報が記録されているかを確認しました。
機械学習をやるためには大量のゲームデータが必要になので今回はこのゲームデータを入手します。

方針

前回は以下のコマンドでゲームデータを取得しました。
watcher.match.by_id(my_region,210876606)
「210876606」はゲームごとに与えられているIDでこれが大量に欲しいのですが、APIで直接このIDを手に入れる手段がありませんでした。
そのため、ユーザーの過去マッチからIDを入手→各IDのゲームに参加していたユーザーをリストに追加→ユーザーリストの過去マッチからゲームIDを入手。という形でゲームIDを入手します。

手順

モジュールのインストール

from riotwatcher import RiotWatcher, ApiError
watcher = RiotWatcher('APIキー')
#リクエストの待機用
import time
#ローカルへの保存用
import pickle
#保存したファイルリストの呼び出し用
import glob

まずは一人分のゲームIDを取り出す

my_region = 'jp1'
summoner = 'riyokuhi'
me = watcher.summoner.by_name(my_region, summoner)
matches = watcher.match.matchlist_by_account(my_region,me['accountId'])['matches']
gamelist=[]

for i in range(len(matches)):
    #ソロキューランク戦のみ取り出す
    queue = recentmatchlists['matches'][i]['queue']
    if queue == 420:
        game = recentmatchlists['matches'][i]['gameId']
        gamelist.append(game)

print(gamelist)

[209518596, 209092616, 209256458, 209354763, 209223696, 209944592, 209649683, 210108443, 210108444, 209453085, 209256479, 209682463, 209682466, 210010148, 209944613, 209944617, 209649707, 209420334, 209518639, 209059888, 210042933, 209289270, 209682486, 209649719, 209485878, 209256511,
以下略

取り出したゲームIDリストからユーザーIDを取り出す

userIDlist =[]

for i in gamelist:
    match_detail = watcher.match.by_id(my_region, i)
    for i in range(10):
        userIDlist.append(match_detail['participantIdentities'][0]['player']['currentAccountId'])
    #1リクエストごとに5秒待機
    time.sleep(5)
userIDlist = set(userIDlist)
print(userIDlist)

{'Pkhvr9RSoguiWhKJMOUVsjbj9o82k1AK3ctgDp62DKpON-oxS5ktbM5r', '1z7DgoRp2NeFO46JZ6ZOwm10Mo6RsigrHSj8JK-O5buM2Do', 'O4R3dcq7wbo6eYStOFWtvGkmGf65dYZauw8LlCgXg_d0oNI'
以下略

ユーザーリストから再びゲームIDを取り出す

#1ユーザーの過去ランク戦のゲームIDを取得する関数
def get_game_id_by_player(currentAccountId,slp):
    local_gamelist = []
    try:
        recentmatchlists = watcher.match.matchlist_by_account(my_region,currentAccountId)
        time.sleep(slp)
        COUNT = len(recentmatchlists['matches'])
        for i in range(COUNT):
            queue = recentmatchlists['matches'][i]['queue']
            if queue == 420:
                game = recentmatchlists['matches'][i]['gameId']
                local_gamelist.append(game)
        return(local_gamelist)
    except:
        time.sleep(slp)


#ユーザーリスト内の全プレイヤーのランク戦ゲームIDを取得
gameset = set([])

for i in userIDlist :
    local_gamelist = get_game_id_by_player(i,5)
    for j in local_gamelist:
        #古いゲームデータは除外する
        if j >= 210000000:
            gameset.add(j)

gamelist = list(gameset)
print(gamelist)

[210808834, 210812935, 210413581, 210092046, 210348046, 210040853, 211003414, 210343960, 210794522, 210958371, 210475044, 211372072, 211038248,
以下略

このユーザーIDとゲームIDの取り出しを繰り返すことでゲームデータを集めます。

データのローカルへの保存

#filenameにゲームIDを含めた任意の名前を指定してゲームデータを保存する
for i in gamelist:
    try:    
        filename = './gamedata_test/gamedata_' + str(i) + '.txt'
        f = open(filename, 'wb')
        list_row = watcher.match.by_id(my_region,i)
        time.sleep(5)
        pickle.dump(list_row, f)
    except:
        time.sleep(5)

保存したデータの確認

gamelist = glob.glob('gamedata_test\*')
f = open(gamelist[0],"rb")
game = pickle.load(f)
print(game)

{'gameId': 210040853, 'platformId': 'JP1', 'gameCreation': 1570839777783, 'gameDuration': 1527, 'queueId': 420, 'mapId': 11, 'seasonId': 13, 'gameVersion': '9.20.292.2452', 'gameMode': 'CLASSIC', 'gameType': 'MATCHED_GAME', 'teams': [{'teamId': 100, 'win':
以下略

これでゲームデータをローカルに保存することができました。

注意点

RiotAPIには以下の制限があるのでリクエストごとに待機時間を十分とる必要があります。
1秒ごとに20リクエスト
2分ごとに100リクエスト
またこの方法でゲームデータを取得すると最初に指定したプレイヤーのランク帯にデータが偏るため、
複数のランク帯のデータが欲しい場合最初のプレイヤーを変えて何度も実行する必要があります。

おわりに

今回で大量のゲームデータが手に入ったため次回機械学習で予測をしてみたいと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1